Java通过POI直接读取Excel并计算
1.软件的下载与环境的搭建
首先是JDK的安装,我安装的是JDK1.8版本,直接从官网下载即可,然后进行环境的配置,这里不再详述。从官网下载eclipse,并进行安装,注意设置工作空间,其他基本默认就好。
打开eclipse,新建项目,在项目下新建名为lib的文件夹。下载POI-3.17下载地址,在本地磁盘中找到刚才新建的项目,将POI解压到lib文件夹下。回到eclipse,刷新一下项目,可以看到lib文件夹多出了POI-3.17文件夹。右键文件夹,选择Build Path->Configure Build Path。
在右侧找到Libraries(增加库),然后选择Add JARs(增加工程内包),将POI-3.17.jar导入到工程项目中。导入之后jar包的图标会发生变化。
2.读取excel
- 首先右键项目,选择new->Class
设置好名称,勾选public static void main( String[] args),完成。
2.导入包,根据实际情况选择需要导入的即可。
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.xml.crypto.Data;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import com.graphbuilder.math.func.SumFunction;
3.读取Excel
我们读取的是本地的Excel,所以首先定义一个file进行路径的存储,File file = new File(“具体路径”);然后通过FileInputStream读取文件。然后读取Excel指定sheet中的各行数据,存入二维数组。
我所做的是某地区的降水量的一个等级的划分以及一些统计数据,具体的Excel数据格式,每一列存储一个年份的数据,一共365行根据日期大小依次排列,将二维数组中的数据根据相关要求取出并进行计算,具体代码如下所示。
package test1;
import java.io.BufferedInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import javax.xml.crypto.Data;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import com.graphbuilder.math.func.SumFunction;
public class readdata {
static float max;//最大值
static float min;//最小值
static float totalSum;//05-16降水总量
static float average;//每天降水均值
public static void main(String[] args) throws IOException {
File file = new File("E:\\rain.xlsx");
FileInputStream fis = new FileInputStream(file);
@SuppressWarnings("resource")
XSSFWorkbook wb = new XSSFWorkbook(new BufferedInputStream(fis));
printDoubleArray(getSheetData(wb.getSheetAt(0)));
aveDayRain(getSheetData(wb.getSheetAt(0)));
yearRain(getSheetData(wb.getSheetAt(0)));
rain(getSheetData(wb.getSheetAt(0)));
//输出相关数据
getMonthAve(getSheetData(wb.getSheetAt(0)));
rainReange(getSheetData(wb.getSheetAt(0)));
rainMonth(getSheetData(wb.getSheetAt(0)));
}
public static String[][] getSheetData(XSSFSheet sheet) throws IOException {
String[][] testArray = new String[sheet.getPhysicalNumberOfRows()][];
for(int rowId =0;rowId<sheet.getPhysicalNumberOfRows();rowId++){
XSSFRow row = sheet.getRow(rowId);
List<String> testSetList = new ArrayList<String>();
for(int column=0;column<row.getPhysicalNumberOfCells();column++){
row.getCell(column).setCellType(Cell.CELL_TYPE_STRING);
testSetList.add(row.getCell(column).getStringCellValue());
}
testArray[rowId] = (String[])testSetList.
toArray(new String[testSetList.size()]);
}
return testArray;
}
//常规统计数据
public static void rain(String[][] arr2)
{
float[][] farr2=new float[arr2.length][arr2[0].length];
//将string类型转换为float类型数组
for(int i=1;i<arr2.length;i++)
{
for(int j=0;j<arr2[0].length;j++)
{
farr2[i][j]=Float.valueOf(arr2[i][j]);
}
}
for(int i2=0;i2<farr2.length;i2++)
{
for(int j2=0;j2<farr2[0].length;j2++)
{
//最大值
if(max<farr2[i2][j2])
{
max=farr2[i2][j2];
}
//最小值
if(min>farr2[i2][j2])
{
min=farr2[i2][j2];
}
//降水总量
totalSum+=farr2[i2][j2];
//降水均值
average=totalSum/(farr2.length*farr2[0].length);
}
}
//System.out.print(totalSum);
//System.out.println();
//System.out.print(average);
}
//计算逐日降水平均值
public static void aveDayRain(String[][] arr) throws IOException
{
//12年每一天的和
float[] daysum=new float[arr.length];
//平均值
float[] avg=new float[arr.length];
for(int i=1;i<arr.length;i++) // 行
{
for(int j=0;j<arr[i].length;j++) // 列
{
daysum[i]+=((float) Float.parseFloat(arr[i][j]));
//逐日降水量(05-16平均)
avg[i]=daysum[i]/arr[i].length;
}
//打印输出逐日降水量
//System.out.print(avg[i]+",");
//System.out.println();
}
}
//计算历年降水总量 年际变化
public static void yearRain(String[][] arr1)
{
// 12年,每一年的和
float[] yearsum=new float[arr1[0].length];
for(int i=0;i<arr1[0].length;i++)
{
for(int j=1;j<arr1.length;j++)
{
//某一年的降水总量
yearsum[i]+=((float) Float.parseFloat(arr1[j][i]));
}
//打印输出某一年的降水总量
//System.out.print(yearsum[i]+",");
//System.out.println();
}
}
public static void getMonthAve(String[][] testArray)
{
double sumMonth=0;
double aveMonth=0;
double sumQuarter=0;
double aveQuarter=0;
double[] arrayMonth=new double[testArray.length];
double[] arrayQuarter=new double[testArray.length];
double[] array=new double[testArray.length];
//逐日数据
for(int i=1; i<testArray.length;i++ )
{
sumMonth=0;
for (int j=0; j<testArray[i].length;j++)
{
//将字符串改为浮点型并相加
sumMonth+=Double.parseDouble(testArray[i][j]);
}
array[i]=sumMonth;
//System.out.println(array[i]+" ");
}
ay[i];
}
else if(i>=182 && i<213) {
arrMonth[6][i]=array[i];
}
else if(i>=213 && i<244) {
arrMonth[7][i]=array[i];
}
else if(i>=244 && i<274) {
arrMonth[8][i]=array[i];
}
else if(i>=274 && i<305) {
arrMonth[9][i]=array[i];
}
else if(i>=305 && i<335) {
arrMonth[10][i]=array[i];
}
else if(i>=335 && i<=365) {
arrMonth[11][i]=array[i];
}
}
// 验证赋值结果
// for (int i = 0; i < arr.length; i++) {
// for (int j = 0; j < arr[i].length; j++) {
// System.out.println(arr[i][j]);
// }
// }
//逐季度求均值
for(int i =0; i<arrQuarter.length;i++ )
{
sumQuarter=0;
for (int j=0; j<arrQuarter[i].length;j++)
{
sumQuarter+=arrQuarter[i][j];
}
aveQuarter=sumQuarter/arrQuarter.length;
//arrayQuarter[i]=aveQuarter;
System.out.println("第"+(i+1)+"季度的均值为:"+aveQuarter);
}
}
//降水量等级
public static void rainReange(String[][] arr3)
{
float[][] farr2=new float[arr3.length][arr3[0].length];
//降水总量
float rainTotal=0
int noRain=0; //无降水天数
int lightRain=0; //小雨天数
int moderateRain=0; //中雨天数
int heavyRain=0; //大雨天数
int hardRain=0; //暴雨天数
//不同降水等级所占总天数的百分比,日数占比
float noRainPer; //无降水天数占总天数百分比
float lightRainPer=0; //小雨天数占总天数百分比
float moderateRainPer=0; //中雨天数占总天数百分比
float heavyRainPer=0; //大雨天数占总天数百分比
float hardRainPer=0; //暴雨天数占总天数百分比
//不同降水等级的降水量
float lightRainTotal=0;
float moderateRainTotal=0;
float heavyRainTotal=0;
float hardRainTotal=0;
//不同等级降水量占总降水量比率
float lightRainTotalPer=0;
float moderateRainTotalPer=0;
float heavyRainTotalPer=0;
float hardRainTotalPer=0;
//string类型转换为float类型
for(int i=1;i<arr3.length;i++)
{
for(int j=0;j<arr3[0].length;j++)
{
farr2[i][j]=Float.valueOf(arr3[i][j]);
}
}
for(int i2=1;i2<farr2.length;i2++)
{
for(int j2=0;j2<farr2[0].length;j2++)
{
rainTotal+=farr2[i2][j2];
//降水量分级,天数统计,所占百分比
if(farr2[i2][j2]<0.1)
{
noRain+=1;
}
else if(farr2[i2][j2]<10)
{
lightRain +=1;
lightRainTotal+=farr2[i2][j2];
}
else if(farr2[i2][j2]<25)
{
moderateRain+=1;
moderateRainTotal+=farr2[i2][j2];
}
else if(farr2[i2][j2]<50)
{
heavyRain+=1;
heavyRainTotal+=farr2[i2][j2];
}
else
{
hardRain+=1;
hardRainTotal+=farr2[i2][j2];
}
}
}
//降水天数所占百分比
noRainPer=(float) noRain/((farr2.length-1)*farr2[0].length);
lightRainPer=(float) lightRain/((farr2.length-1)*farr2[0].length);
moderateRainPer=(float) moderateRain/((farr2.length-1)*farr2[0].length);
heavyRainPer=(float) heavyRain/((farr2.length-1)*farr2[0].length);
hardRainPer=(float) hardRain/((farr2.length-1)*farr2[0].length);
//不同等级降水量所占百分比
lightRainTotalPer=(float) lightRainTotal/rainTotal;
moderateRainTotalPer=(float) moderateRainTotal/rainTotal;
heavyRainTotalPer=(float) heavyRainTotal/rainTotal;
hardRainTotalPer=(float) hardRainTotal/rainTotal;
System.out.print("无降水天数是:"+noRain+"\n"+"小雨的天数是:"+lightRain+"\n"+"中雨的天数是:"+moderateRain+"\n"+"大雨的天数是:"+heavyRain+"\n"+"暴雨的天数是:"+hardRain);
System.out.println();
//降水,日数占比
System.out.print(noRainPer+"\n"+lightRainPer+"\n"+moderateRainPer+"\n"+heavyRainPer+"\n"+hardRainPer);
System.out.println();
//降水总量占比
System.out.print("不同级别降水量占比"+lightRainTotalPer+"\n"+moderateRainTotalPer+"\n"+heavyRainTotalPer+"\n"+hardRainTotalPer);
}
//雨情分类统计 各月不同级别降水日数及其占比
public static void rainMonth(String[][] arr4)
{
float[][] farr4=new float[arr4.length][arr4[0].length];
int noRain1=0; //无降水天数
int lightRain1=0; //小雨天数
int moderateRain1=0; //中雨天数
int heavyRain1=0; //大雨天数
int hardRain1=0; //暴雨天数
int downPourRain1=0; //大暴雨天数
//不同降水等级所占总天数的百分比,日数占比
float noRainPer1; //无降水天数占总天数百分比
float lightRainPer1=0; //小雨天数占总天数百分比
float moderateRainPer1=0; //中雨天数占总天数百分比
float heavyRainPer1=0; //大雨天数占总天数百分比
float hardRainPer1=0; //暴雨天数占总天数百分比
for(int i=1;i<arr4.length;i++)
{
for(int j=0;j<arr4[0].length;j++)
{
farr4[i][j]=Float.valueOf(arr4[i][j]);
}
}
for(int i2=1;i2<arr4.length;i2++)
{
for(int j2=0;j2<arr4[0].length;j2++)
{
if(arr4.length<31)
{
if(farr4[i2][j2]==0)
{
noRain1+=1;
}
else if(farr4[i2][j2]<10)
{
lightRain1+=1;
}
else if(farr4[i2][j2]<25)
{
moderateRain1+=1;
}
else if(farr4[i2][j2]<50)
{
heavyRain1+=1;
}
else if(farr4[i2][j2]<100)
{
}
else
{
}
}
else if(arr4.length<59)
{
}
}
}
//System.out.print(arr4.length-1);
}
//打印二维数组,读取测试
public static void printDoubleArray(String[][] testArray) throws IOException{
//System.out.print(testArray[1][2]);
//System.out.println();
/*for(int i =1; i<testArray.length;i++ )
{
for (int j=0; j<testArray[i].length;j++)
{
//System.out.print(testArray[i][j]+",");
}
System.out.println();
}*/
}
}
感谢相关博主的参考,本博客未完待续。