当前位置: 首页 > 知识库问答 >
问题:

Apache POI字符串公式错误

於鸿羲
2023-03-14

我用Apache POI用字符串公式创建Excel文件,得到#VALUE!结果文件中有错误。

源代码是

public static void main(String[] args) throws IOException {
    Workbook wb = new HSSFWorkbook();
    FormulaEvaluator ev = wb.getCreationHelper().createFormulaEvaluator();
    Sheet ws = wb.createSheet();
    Row row = ws.createRow(0);
    Cell cell;
    cell = row.createCell(0);
    cell.setCellValue("abc");

    cell = row.createCell(1);
    printCellInfo(row.getCell(1),"before formula");
    cell.setCellFormula("IF(A1<>\"\",MID(A1,1,2),\" \")");

    printCellInfo(row.getCell(1), "after formula");
    ev.evaluateAll();
    printCellInfo(row.getCell(1), "after recalc");

    OutputStream os = new FileOutputStream("xx.xls");
    wb.write(os);

}

(printCellInfo是我下面讲的Info方法)而错误单元格是B1。Excel显示“单元格中使用的值的数据类型不正确”。但是如果打开这个单元格进行编辑(使用F2)并按回车键-公式计算正确!!!

现在关于手机信息。帮助方法是

static void printCellInfo(Cell cell, String infoText) {
    System.out.println("Cell "+CellReference.convertNumToColString(cell.getColumnIndex())+cell.getRowIndex()+" "+infoText);
    int ct = cell.getCellType();
    System.out.println("  Cell type "+ct);
    if (cell.getCellType() == Cell.CELL_TYPE_FORMULA) {
        ct = cell.getCachedFormulaResultType();
        System.out.println("  Cached type "+ct);
    }
    switch (ct) {
        case Cell.CELL_TYPE_NUMERIC: 
            System.out.println("  Number <"+cell.getNumericCellValue()+">");
            break;
        case Cell.CELL_TYPE_STRING:
            System.out.println(" String <"+cell.getStringCellValue()+">");
    }
    System.out.println("============================");
}

主执行的输出为

Cell B0 before formula
  Cell type 3
============================
Cell B0 after formula
  Cell type 2
  Cached type 0
  Number <0.0>
============================
Cell B0 after recalc
  Cell type 2
  Cached type 1
 String <ab>
============================

所以B0一开始是空白,公式插入后是数字。为什么POI这样做,也许问题就出在这里?不幸的是,重新计算后POI中正确的数据类型在excel中并不正确。

顺便说一下,从POI IF(A1

有什么想法吗?我发现唯一的话题 https://openclassrooms.com/forum/sujet/apache-poi-formula-valeur 互联网上,有一些想法,但没有可行的解决方案......

cell = row.getCell(1);
cell.setCellValue(cell.getStringCellValue());

也无济于事。

共有2个答案

严阳秋
2023-03-14

我最近也遇到了同样的问题。在保存我的工作簿之前,我用这一行解决了这个问题:

myWorkbook.getCreationHelper().createFormulaEvaluator().evaluateAll();

柴飞星
2023-03-14

我在我的机器上尝试了你的代码,它运行良好。

我在Excel上为mac 2013使用beta POI 3.13

您的Excel表也正常工作(在您在聊天中给我之后)

所以问题是POI版本和Excel 2010库之间的兼容性错误。

这也是你的工作表。

 类似资料:
  • 问题内容: 使用uCanaccess检索保存在桌面中的数据库时出现错误。 我的代码如下: 导入java.util.Scanner; 导入java.sql。*; 公共类dbTest1 { } 我将很乐意为您解决此错误提供任何建议。 谢谢,文斯 问题答案: 好吧,首先,导入您的库(lib文件夹中的jar文件)。http://sourceforge.net/projects/ucanaccess/fil

  • 如何使用作为字符串提供的公共和私有RSA密钥进行加密和解密。因为我正在使用RSACryptoServiceProvider,它需要XML格式,所以是否有可能使用提供的字符串。谢谢。

  • 问题内容: 我的问题是关于:Public String(char [] value) 。有人可以帮我吗:它是否在内部为每个值[i]循环。特别, Public String(char [] value)的含义是: 或不 ? 问题答案: Java是开放源代码,如果将源代码附加到Eclipse,则始终可以使用F3来检查功能。在这种情况下,String类具有以下正在寻找的构造函数: 编辑:如果您想知道,A

  • 我想得到一个文件内容的公钥,这是一个文件内容看起来像什么的例子(用生成): 如果我是对的,这不是公钥,但是可以从这个字符串中获取公钥。 这个答案回答了我的问题https://stackoverflow.com/a/19387517/2735398 但答案似乎不起作用。我有个例外: 当看到答案的评论时,我不是唯一有问题的人... 如何修复异常?或者有没有其他方法可以从字符串中获取公钥?

  • 问题内容: 我收到以下错误: 第一个字段是格式。 有任何想法吗? 谢谢。 问题答案: 当您将字符串值插入日期列时,则需要在使用函数期间将其转换为日期。使用此功能时,您将提供字符串的格式。 功能格式: 因此,您的查询将如下所示: 参见带有演示的SQL Fiddle

  • 我想知道您是否可以在hasNext(字符串模式)中指定要扫描的内容。例如,我想检索正在扫描的行的前三个字符。那么有没有办法指定诸如 在这里我要抓取该行的前3个字母字符。