poi处理公式

本文探讨了在Java环境下,面对含有公式的Excel单元格数据读取时所遇到的问题,通过实例展示了如何正确处理公式生成的字符串数据,避免了在转换过程中出现的NumberFormatException异常,提供了适用于不同情况下的解决方案。

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

 

POI读取带有公式的Excel单元格

 

分类:JAVA2012-01-11 13:31818人阅读评论(0)收藏举报

 

项目中需要使用Excel导入数据,读取Excel单元格的方法如下:

 

[java]view plaincopyprint?

 

1.  private static String getStringCellValue(Cell cell) {// 获取单元格数据内容为字符串类型的数据

 

2.  String strCell = "";

 

3.  if (cell == null) {

 

4.  return "";

 

5.  }

 

6.  switch (cell.getCellType()) {

 

7.  case Cell.CELL_TYPE_FORMULA:

 

8.  // cell.getCellFormula();

 

9.  try {

 

10./*

 

11.* 此处判断使用公式生成的字符串有问题,因为HSSFDateUtil.isCellDateFormatted(cell)判断过程中cell

 

12.* .getNumericCellValue();方法会抛出java.lang.NumberFormatException异常

 

13.*/

 

14.if (HSSFDateUtil.isCellDateFormatted(cell)) {

 

15.Date date = cell.getDateCellValue();

 

16.strCell = (date.getYear() + 1900) + "-" + (date.getMonth() + 1) +"-" + date.getDate();

 

17.break;

 

18.} else {

 

19.strCell = String.valueOf(cell.getNumericCellValue());

 

20.}

 

21.} catch (IllegalStateException e) {

 

22.strCell = String.valueOf(cell.getRichStringCellValue());

 

23.}

 

24.break;

 

25.case Cell.CELL_TYPE_STRING:

 

26.strCell = cell.getStringCellValue();

 

27.break;

 

28.case Cell.CELL_TYPE_NUMERIC:

 

29.if (HSSFDateUtil.isCellDateFormatted(cell)) {

 

30.strCell = getDateCellValue(cell);

 

31.break;

 

32.} else {

 

33.strCell = String.valueOf(cell.getNumericCellValue());

 

34.break;

 

35.}

 

36.case Cell.CELL_TYPE_BOOLEAN:

 

37.strCell = String.valueOf(cell.getBooleanCellValue());

 

38.break;

 

39.case Cell.CELL_TYPE_BLANK:

 

40.strCell = "";

 

41.break;

 

42.default:

 

43.strCell = "";

 

44.break;

 

45.}

 

46.return strCell;

 

47.}

 

private static String getStringCellValue(Cell cell) {// 获取单元格数据内容为字符串类型的数据

 

        String strCell = "";

 

        if (cell == null) {

 

            return "";

 

        }

 

        switch (cell.getCellType()) {

 

        case Cell.CELL_TYPE_FORMULA:

 

            // cell.getCellFormula();

 

            try {

 

            /*

 

             * 此处判断使用公式生成的字符串有问题,因为HSSFDateUtil.isCellDateFormatted(cell)判断过程中cell

 

             * .getNumericCellValue();方法会抛出java.lang.NumberFormatException异常

 

             */

 

             if (HSSFDateUtil.isCellDateFormatted(cell)) {

 

               Date date = cell.getDateCellValue();

 

               strCell = (date.getYear() + 1900) + "-" + (date.getMonth() + 1) +"-" + date.getDate();

 

               break;

 

             } else {

 

               strCell = String.valueOf(cell.getNumericCellValue());

 

             }

 

             } catch (IllegalStateException e) {

 

               strCell = String.valueOf(cell.getRichStringCellValue());

 

             }

 

            break;

 

        case Cell.CELL_TYPE_STRING:

 

            strCell = cell.getStringCellValue();

 

            break;

 

        case Cell.CELL_TYPE_NUMERIC:

 

            if (HSSFDateUtil.isCellDateFormatted(cell)) {

 

                strCell = getDateCellValue(cell);

 

                break;

 

            } else {

 

                strCell = String.valueOf(cell.getNumericCellValue());

 

                break;

 

            }

 

        case Cell.CELL_TYPE_BOOLEAN:

 

            strCell = String.valueOf(cell.getBooleanCellValue());

 

            break;

 

        case Cell.CELL_TYPE_BLANK:

 

            strCell = "";

 

            break;

 

        default:

 

            strCell = "";

 

            break;

 

        }

 

        return strCell;

 

    }

 

这个方法在导入没有公式的Excel时没有问题,今天遇到含有公式的Excel,如图:

 


报错信息如下:

 

 

 

经调试发现HSSFDateUtil.isCellDateFormatted(cell)判断过程中会执行cell.getNumericCellValue();方法,字符串“201201FSSH300466”在转换成数字的时候出错了,在网上搜了一下,大多数的解决方法是:

 

[java]view plaincopyprint?

 

1.  case HSSFCell.CELL_TYPE_FORMULA:

 

2.  try {

 

3.  value = String.valueOf(cell.getNumericCellValue());

 

4.  } catch (IllegalStateException e) {

 

5.  value = String.valueOf(cell.getRichStringCellValue());

 

6.  }

 

7.  break;

 

case HSSFCell.CELL_TYPE_FORMULA:

 

 try {

 

     value = String.valueOf(cell.getNumericCellValue());

 

} catch (IllegalStateException e) {

 

     value = String.valueOf(cell.getRichStringCellValue());

 

}

 

break;

 

经测试发现,在执行cell.getNumericCellValue()方法时还是抛出NumberFormatException异常,于是将try/catch中的方法互换:

 

[java]view plaincopyprint?

 

1.  case HSSFCell.CELL_TYPE_FORMULA:

 

2.  try {

 

3.  strCell = String.valueOf(cell.getStringCellValue());

 

4.  } catch (IllegalStateException e) {

 

5.  strCell = String.valueOf(cell.getNumericCellValue());

 

6.  }

 

7.  break;

 

case HSSFCell.CELL_TYPE_FORMULA:

 

try {

 

       strCell = String.valueOf(cell.getStringCellValue());

 

} catch (IllegalStateException e) {

 

       strCell = String.valueOf(cell.getNumericCellValue());

 

}

 

break;

 

这样对于字符串cell.getStringCellValue()方法即可取得其值,如果公式生成的是数值,使用cell.getStringCellValue()方法会抛出IllegalStateException异常,在异常处理中使用cell.getNumericCellValue();即可。

 

 

 

### 使用 Apache POI 处理 Word (DOCX) 文件中的数学公式处理 DOCX 文档时,Apache POI 提供了 XWPF 组件来读取和操作基于 Office Open XML 标准的文件。对于文档内的公式,通常是以 OMML(Office Math Markup Language)形式存储,在某些情况下也可能作为图像嵌入。 针对公式的提取与转换: - **获取公式对象**:通过 `XWPFPictureData` 或特定于公式的类如 `XWPFFieldRun` 来访问文档内含有的公式元素[^3]。 - **OMML 转换为其他格式**:如果目标是从 OMML 转换成 LaTeX,则可以先利用 Microsoft 提供的 MML2OMML.XSL 工具将 OMML 转化成中间状态——MathML;之后再借助 mmltex.xsl 这样的外部资源完成最终向 LaTeX 的转变过程[^1]。 下面给出一段 Python 伪代码用于展示如何遍历并尝试识别 DOCX 中可能存在的公式部分: ```python from org.apache.poi.xwpf.usermodel import XWPFDocument, XWPFPictureData, XWPFFieldRun def process_math_formulas(doc_path): document = XWPFDocument(open(doc_path, 'rb')) for paragraph in document.paragraphs: runs = paragraph.runs for run in runs: if isinstance(run, XWPFFieldRun): # 假设这里能区分出含有公式的字段 formula_data = run.getFormulaContent() # 需要具体方法实现 # 对获得的数据做相应处理... document.close() ``` 需要注意的是上述例子中关于判断是否为公式以及获取其具体内容的方法 (`getFormulaContent`) 是假设性的,实际应用时需参照最新版本 API 手册调整逻辑以适应不同场景下的需求变化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值