excel相关系列(2)---解析excel文档

本文提供了解析.xls和.xlsx两种Excel文件格式的方法。通过使用Apache POI库,分别介绍了针对不同文件类型的解析过程,并提供了读取表格数据的具体实现。此外,还讨论了如何处理不同单元格内的各种数据类型。

这些都是调用的PIO对java提供的插件,PIO相关资料可以查看:http://blog.youkuaiyun.com/jinchaomail/article/details/50616887

excel有两种后缀类型:.xls和.xlsx,下面是对两种的解析,也提供了对不同数据类型读取的一个方法

文档结构系列一就有

首先是对xls类型的处理

package analyzeexcel;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;

public class AnalyzaXls {
   private List<List<String>> readXls(String path) throws Exception{
	   InputStream is=new FileInputStream(path);
	   HSSFWorkbook workbook =new HSSFWorkbook(is);
	   List<List<String>> ret=new ArrayList<List<String>>();
       for(int numSheet=0;numSheet<workbook.getNumberOfSheets();numSheet++){
    	   HSSFSheet sheet=workbook.getSheetAt(numSheet);
    	   if(sheet==null){
    		  continue; 
    	   }
    	   for(int rowNum=1;rowNum<=sheet.getLastRowNum();rowNum++){
    		   HSSFRow row=sheet.getRow(rowNum);
    		   int minColIx=row.getFirstCellNum();
    		   int maxColIx=row.getLastCellNum();
    		   List<String> rowList=new ArrayList<String>();
    		   for(int colIx=minColIx;colIx<maxColIx;colIx++){
    			   HSSFCell cell=row.getCell(colIx);
    			   if(cell==null){
    				   continue;
    			   }
    			   rowList.add(cell.toString());
    		   }
    		   ret.add(rowList);
    	   }
       }
       return ret;
   
   }
}

对于另一种的xlsx类型的处理,很相似

package analyzeexcel;

import java.io.FileInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class AnalyzeXlsx {
	private List<List<String>> readXlsx(String path)throws Exception{
		InputStream is=new FileInputStream(path);
		XSSFWorkbook workbook=new XSSFWorkbook(is);
		List<List<String>> ret=new ArrayList<List<String>>();
		for(int numSheet=0;numSheet<workbook.getNumberOfSheets();numSheet++){
	    	   XSSFSheet sheet=workbook.getSheetAt(numSheet);
			 if(sheet==null){
	    		  continue; 
	    	   }
	    	   for(int rowNum=1;rowNum<=sheet.getLastRowNum();rowNum++){
	    		   XSSFRow row=sheet.getRow(rowNum);
	    		   int minColIx=row.getFirstCellNum();
	    		   int maxColIx=row.getLastCellNum();
	    		   List<String> rowList=new ArrayList<String>();
	    		   for(int colIx=minColIx;colIx<maxColIx;colIx++){
	    			   XSSFCell cell=row.getCell(colIx);
	    			   if(cell==null){
	    				   continue;
	    			   }
	    			   rowList.add(cell.toString());
	    		   }
	    		   ret.add(rowList);
	    	   }
	       }
	       return ret;
		
	}
	public static void main(String[] args) {
		AnalyzeXlsx temp=new AnalyzeXlsx();
		List<List<String>> ret;
		try {
			ret = temp.readXlsx("E:/ѧϰ/dang/��Ա.xlsx");
			for(List<String> list :ret){
				for(String str : list){
					System.out.print(str+"\t");
				}
				System.out.println();
			}
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
	}

}


可能得到的数据类型不让自己满意,可以自己写一个调用数据处理的方法

package analyzeexcel;

import java.text.SimpleDateFormat;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.util.LocaleUtil;

public class ExcelUtils {

	public static String getStringVal(HSSFCell cell) {
		switch (cell.getCellTypeEnum()) {
		case BLANK:
			return "";
		case BOOLEAN:
			return cell.getBooleanCellValue() ? "TRUE" : "FALSE";
		case ERROR:
			return "";
		case FORMULA:
			try {
				return String.valueOf(cell.getNumericCellValue());
			} catch (IllegalStateException e) {
				return String.valueOf(cell.getRichStringCellValue());
			}
		case NUMERIC:
			
			if (HSSFDateUtil.isCellDateFormatted(cell)) {
				SimpleDateFormat sdf = new SimpleDateFormat("dd-MMM-yyyy",
						LocaleUtil.getUserLocale());
				sdf.setTimeZone(LocaleUtil.getUserTimeZone());
				return sdf.format(cell.getDateCellValue());
			} else {
				double value = cell.getNumericCellValue();
				int intValue = (int) value;
				return value - intValue == 0 ? String.valueOf(intValue)
						: String.valueOf(value);

			}

		case STRING:
			return cell.getStringCellValue();
		default:
			return cell.toString().trim();

		}
	}
}




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值