poi读取excel内容(公式)

这篇博客介绍了如何利用Apache POI库读取包含公式的Excel文件,并获取公式计算后的实际结果,经过作者测试验证可行。

用poi读取excel的示例网上好像很多了,但却鲜有涉及excel中的公式结果,用到了,记录下

公式类型的数据可以读取计算结果,而不是公式本身,已经测试OK


import java.io.FileInputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellValue;
import org.apache.poi.ss.usermodel.DateUtil;
import org.apache.poi.ss.usermodel.FormulaEvaluator;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFFormulaEvaluator;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

public class ReadExcel {

	/**
	 * 
	  * <li> 读取excel中的数据
	  * @Description:
	  * @param pathname 要读取的文件路径、名称、后缀
	  * @return list
	  * @throws Exception List<Map<Integer,Object>>
	  * @Created:wangang 2013-6-19下午04:13:42
	  * @Modified:
	 */
	public static List<Map<Integer, Object>> readExcel(String pathname)
			throws Exception {
		InputStream is = new FileInputStream(pathname);
		XSSFWorkbook xssfWorkbook = new XSSFWorkbook(is);
		List<Map<Integer, Object>> resultList = new ArrayList<Map<Integer, Object>>();
		XSSFFormulaEvaluator  evaluator = new XSSFFormulaEvaluator(xssfWorkbook);
		Map<Integer, Object> map = null;
		// 循环工作表Sheet
		// for (int numSheet = 0; numSheet < hssfWorkbook.getNumberOfSheets();
		// numSheet++) {
		// 只需要读第一个工作表,不用循环
		XSSFSheet xssfSheet = xssfWorkbook.getSheetAt(0);
//		xssfSheet.setDisplayFormulas(true);
		if (xssfSheet == null) {
			return null;
		}
		// 循环行Row
		loop:for (int rowNum = 1; rowNum <= xssfSheet.getLastRowNum(); rowNum++) {
			XSSFRow xssfRow = xssfSheet.getRow(rowNum);
			if (xssfRow == null) {
				continue;
			}
			map = new HashMap<Integer, Object>();
			// 循环列Cell
			for (int cellNum = 0; cellNum <= xssfRow.getLastCellNum(); cellNum++) {
				XSSFCell xssfCell = xssfRow.getCell(cellNum);
				if (xssfCell == null) {
					continue;
				}
				String value = getValue(xssfCell, evaluator);
				if(value != null && value.length() > 0){
					if(value.trim() == "结束" || "结束".equals(value.trim())){
						break loop;
					}else{
						map.put(cellNum, value);
					}
				}else{
					map.put(cellNum, value);
				}
			}
			resultList.add(map);
		}
		return resultList;
	}

	
	
	
	/** 
	 * @获取Excel中某个单元格的值
	 * @param cell  	EXCLE单元格对象
	 * @param evaluator EXCLE单元格公式
	 * @return			单元格内容
	 */
	public static String getValue(XSSFCell cell,FormulaEvaluator evaluator) { 
		
		String value = "";
		switch (cell.getCellType()) {
			case HSSFCell.CELL_TYPE_NUMERIC:						//数值型
				if (HSSFDateUtil.isCellDateFormatted(cell)) {		//如果是时间类型
					SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
					value = format.format(cell.getDateCellValue());
				} else {											//纯数字
					value = String.valueOf(cell.getNumericCellValue());
				}
				break;
			case HSSFCell.CELL_TYPE_STRING:							//字符串型
				value = cell.getStringCellValue();
				break;
			case HSSFCell.CELL_TYPE_BOOLEAN:						//布尔
				value = " " + cell.getBooleanCellValue();
				break;
			case HSSFCell.CELL_TYPE_BLANK:							//空值
				value = "";
				break;
			case HSSFCell.CELL_TYPE_ERROR:							//故障
				value = "";
				break;
			case HSSFCell.CELL_TYPE_FORMULA:						//公式型
				try {
					CellValue cellValue;
					cellValue = evaluator.evaluate(cell);
					switch (cellValue.getCellType()) {				//判断公式类型
					    case Cell.CELL_TYPE_BOOLEAN:
					    	value  = String.valueOf(cellValue.getBooleanValue());
					        break;
					    case Cell.CELL_TYPE_NUMERIC:
					    	// 处理日期  
					        if (DateUtil.isCellDateFormatted(cell)) {  
					    	   SimpleDateFormat format = new SimpleDateFormat("yyyy/MM/dd");  
					    	   Date date = cell.getDateCellValue();  
					           value = format.format(date);
					        } else {  
					    	   value  = String.valueOf(cellValue.getNumberValue());
					    	}
					        break;
					    case Cell.CELL_TYPE_STRING:
					    	value  = cellValue.getStringValue();
					        break;
					    case Cell.CELL_TYPE_BLANK:
					    	value = "";
					        break;
					    case Cell.CELL_TYPE_ERROR:
					    	value = "";
					        break;
					    case Cell.CELL_TYPE_FORMULA:
					    	value = "";
					        break;
					}
				} catch (Exception e) {
					value = cell.getStringCellValue().toString();
					cell.getCellFormula();
				}
				break;
			default:
				value = cell.getStringCellValue().toString();
				break;
		}
		return value;
	}

}
注:这种使用POI读取的方式还是不能读取大量数据的文件

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值