java excel 公式解析_poi解析excel(含有公式)

该博客介绍了一个使用Java处理Excel文件的工具类ExcelHelper,特别是如何处理包含公式的Excel数据。通过Apache POI库,该类能够读取Excel 2003 (.xls)和2007 (.xlsx)格式的文件,解析每个单元格的公式并返回数据,包括布尔值、数值(包括日期)和字符串。文章详细展示了代码实现过程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 /**

2 * Jun 25, 20123 */

4

5 importjava.io.File;6 importjava.io.FileInputStream;7 importjava.io.IOException;8 importjava.io.InputStream;9 importjava.util.ArrayList;10 importjava.util.List;11

12 importorg.apache.commons.io.FilenameUtils;13 importorg.apache.poi.hssf.usermodel.HSSFWorkbook;14 import org.apache.poi.ss.usermodel.*;15 importorg.apache.poi.xssf.usermodel.XSSFWorkbook;16

17 /**

18 * Excel组件19 *20 *@authorSnowolf21 *@version1.022 *@since1.023 */

24 public abstract classExcelHelper {25

26 /**

27 * Excel 200328 */

29 private final static String XLS = "xls";30 /**

31 * Excel 200732 */

33 private final static String XLSX = "xlsx";34 /**

35 * 分隔符36 */

37 private final static String SEPARATOR = "|";38

39 /**

40 * 由Excel文件的Sheet导出至List41 *42 *@paramfile43 *@paramsheetNum44 *@return

45 */

46 public static List exportListFromExcel(File file, intsheetNum)47 throwsIOException {48 return exportListFromExcel(newFileInputStream(file),49 FilenameUtils.getExtension(file.getName()), sheetNum);50 }51

52 /**

53 * 由Excel流的Sheet导出至List54 *55 *@paramis56 *@paramextensionName57 *@paramsheetNum58 *@return

59 *@throwsIOException60 */

61 public static ListexportListFromExcel(InputStream is,62 String extensionName, int sheetNum) throwsIOException {63

64 Workbook workbook = null;65

66 if(extensionName.toLowerCase().equals(XLS)) {67 workbook = newHSSFWorkbook(is);68 } else if(extensionName.toLowerCase().equals(XLSX)) {69 workbook = newXSSFWorkbook(is);70 }71

72 returnexportListFromExcel(workbook, sheetNum);73 }74

75 /**

76 * 由指定的Sheet导出至List77 *78 *@paramworkbook79 *@paramsheetNum80 *@return

81 *@throwsIOException82 */

83 private static ListexportListFromExcel(Workbook workbook,84 intsheetNum) {85

86 Sheet sheet =workbook.getSheetAt(sheetNum);87

88 //解析公式结果

89 FormulaEvaluator evaluator =workbook.getCreationHelper()90 .createFormulaEvaluator();91

92 List list = new ArrayList();93

94 int minRowIx =sheet.getFirstRowNum();95 int maxRowIx =sheet.getLastRowNum();96 for (int rowIx = minRowIx; rowIx <= maxRowIx; rowIx++) {97 Row row =sheet.getRow(rowIx);98 StringBuilder sb = newStringBuilder();99

100 short minColIx =row.getFirstCellNum();101 short maxColIx =row.getLastCellNum();102 for (short colIx = minColIx; colIx <= maxColIx; colIx++) {103 Cell cell = row.getCell(newInteger(colIx));104 CellValue cellValue =evaluator.evaluate(cell);105 if (cellValue == null) {106 continue;107 }108 //经过公式解析,最后只存在Boolean、Numeric和String三种数据类型,此外就是Error了109 //其余数据类型,根据官方文档,完全可以忽略http://poi.apache.org/spreadsheet/eval.html

110 switch(cellValue.getCellTypeEnum()) {111 caseBOOLEAN:112 sb.append(SEPARATOR +cellValue.getBooleanValue());113 break;114 caseNUMERIC:115 //这里的日期类型会被转换为数字类型,需要判别后区分处理

116 if(DateUtil.isCellDateFormatted(cell)) {117 sb.append(SEPARATOR +cell.getDateCellValue());118 } else{119 sb.append(SEPARATOR +cellValue.getNumberValue());120 }121 break;122 caseSTRING:123 sb.append(SEPARATOR +cellValue.getStringValue());124 break;125 caseFORMULA:126 break;127 caseBLANK:128 break;129 caseERROR:130 break;131 default:132 break;133 }134 }135 list.add(sb.toString());136 }137 returnlist;138 }139 }

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值