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。

Java excel计算工具 java实现excel计算_Excel


在右侧找到Libraries(增加库),然后选择Add JARs(增加工程内包),将POI-3.17.jar导入到工程项目中。导入之后jar包的图标会发生变化。

Java excel计算工具 java实现excel计算_Java excel计算工具_02

2.读取excel

  1. 首先右键项目,选择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();
        }*/
        
    }  

}

感谢相关博主的参考,本博客未完待续。