【问题标题】:How to remove warning in Excel using apache poi in JAVA?如何在 JAVA 中使用 apache poi 删除 Excel 中的警告?
【发布时间】:2014-05-06 07:14:42
【问题描述】:

我正在使用 apache poi api 在我的 Java 应用程序中生成 Excel 工作表。在 excel 中设置的数据以字符串类型动态出现。 对于 column1,值是字母数字。当我生成 Excel 时,它会给我绿色指示,并在单元格上显示警告 "Number Stored as Text""Text date with 2-digit ye​​ar"

我想删除该警告。 我发现从 excel 中我们可以将一个单元格标记为“忽略错误”,以忽略警告。

如何以编程方式完成此任务,或者是否有其他替代方法可以完成此任务?

我还附上了带有绿色标记警告的屏幕截图。

代码:

if (cellValue != null && (shouldBeRightAlign))
{
 cellType = Cell.CELL_TYPE_NUMERIC;
}
else if (cellValue != null)
{
 cellType = Cell.CELL_TYPE_STRING;
}
cell.setCellValue(cellValue);

【问题讨论】:

标签: java excel apache-poi


【解决方案1】:

The API now provides a corresponding method

public void addIgnoredErrors(CellRangeAddress region,
                    IgnoredErrorType... ignoredErrorTypes)

【讨论】:

    【解决方案2】:

    显然,Apache POI 目前无法实现这一点。有许多关于该主题的错误报告/RFE:

    https://issues.apache.org/bugzilla/show_bug.cgi?id=58641

    https://issues.apache.org/bugzilla/show_bug.cgi?id=54868

    https://issues.apache.org/bugzilla/show_bug.cgi?id=46136

    实际属性(表示忽略此类警告的属性)以 Excel 持久格式存在,并以每个单元格为基础记录。只是 Apache POI 没有公开它,据我从错误报告中可以看出。

    为了让您了解这在 Excel 的 xlsx 格式中是什么样子的:

    </worksheet>
        ...
        <ignoredErrors>
            <ignoredError sqref="K192 E181 E186" numberStoredAsText="1"/>
        </ignoredErrors>    
    </worksheet>
    

    我在某处读到,这仅以 xlsx(即 OOXML)形式保留,而不是 xls 格式,这意味着如果 Apache POI 团队实现这一点,它将包含在 XSSF 包中。

    【讨论】:

    • Apache POI 实际上对 HSSF 和 XSSF 的这些忽略具有大部分低级支持,它只是在等待有人提出合理的高级 API 设计,将它们包装成一种形式更加用户友好。如果您能想到一个好的方法,请为错误做出贡献!
    • @Gagravarr。是的。但是在 OOXML 中,它非常简单,恕我直言,不需要抽象。您只需要一个新方法:XSSFSheet.setIgnoredErrors(Set&lt;IgnoredErrorType&gt; x, Set&lt;CellReference&gt; y),然后忘记以 XLS 格式支持此功能。我添加了RFE 58641 来跟踪这个。
    【解决方案3】:

    对我来说,上述解决方案都不起作用,但最后通过一些复杂的解决方法摆脱了警告:将值写成这样的公式。

    String asFormula = "\"" + value + "\"";
    cell.setCellType(SXSSFCell.CELL_TYPE_FORMULA);
    cell.setCellFormula(asFormula);
    

    不要认为它总是一个好的解决方案,但在我的例子中,输出文件的值永远不会被修改。但它可能会对某人有所帮助。

    我正在使用 3.14 版的 apache POI,以防万一(在解决方法之前我尝试了几个不同的版本,但没有效果)。

    【讨论】:

    • cell.setCellType(SXSSFCell.CELL_TYPE_FORMULA);这解决了我的问题谢谢:)
    【解决方案4】:

    设置cell type 喜欢:

    HSSFRow row = sheet.createRow(sheet.getLastRowNum());
    HSSFCell cell = row.createCell(0);
    cell.setCellType(Cell.CELL_TYPE_STRING);
    cell.setCellType(Cell.CELL_TYPE_NUMERIC);
    

    对于字母数字和Character,单元格类型将为Cell.CELL_TYPE_STRING,对于数字,单元格类型将为CELL_TYPE_NUMERIC

    您可以从 CellHSSFCell 文档中获取有关单元类型的更多信息。

    【讨论】:

    • 查看已编辑的问题,我在其中提到 column1 的值是字母数字。它可以有字符,也可以只有数字。
    • 但你还是会收到警告,他的问题是删除警告
    • @CharveeShah 检查编辑后的答案。如果数据类型为Character,则必须在Java 端检查,然后使用CELL_TYPE_STRINGCELL_TYPE_NUMERIC 作为数字。
    • @vels4j 通过设置单元格类型,警告将被删除。
    • @Vishrant 数据类型将始终为字符串。
    【解决方案5】:

    旧的,但仍然如此,这将有助于 .NET 中使用 NPOI 的一些人

    我试过了

    cell.SetCellType(NPOI.SS.UserModel.CellType.NUMERIC); 
    

    这根本没有帮助。但是下面的代码可以工作

    dCell.setCellValue(Convert.ToDouble(112.45)); //.NET syntax
    
    dCell.setCellValue(new Double("123"));  // Java Syntax
    

    【讨论】:

    • 该值不具体是数字,可以是数字也可以是字母数字。
    • @CharveeShah 那么什么是字符串? CellType 的用途是什么?
    • 值来自 mysql 查询。所以第一列只有字母数字或数字值。当只有数字值出现时,它显示绿色指示符。对于第 5 列,数据带有“,”值.那里也有绿色指示器。
    【解决方案6】:

    我遇到了同样的问题。我通过检查数据是否为整数/浮点数并相应地放置条件(CELL_TYPE)来解决它。请找到代码片段:

    if(!isInteger(data))
                {
                cell.setCellValue(data);
                }
                else
                {
                    cell.setCellType(Cell.CELL_TYPE_NUMERIC);
                    cell.setCellValue(Float.parseFloat(data));//.parseInt(data));   
                }
    public static boolean isInteger(String s) {
        try { 
            java.lang.Float.parseFloat(s); 
        } catch(NumberFormatException e) { 
            return false; 
        }
        return true;
    }
    

    这里的数据是来自数据源列表数组的字符串(excel/csv) 这解决了绿色警告。

    【讨论】:

    • 我已经这样做了,但我仍然面临数据问题,因为我用逗号获得了 1,00 类型值,所以它在 parseFloat 方法上给了我错误。
    • 您可以添加具有整数的列。私有静态 ArrayList intColRef = new ArrayList(){{ for(int i=0;i
    • 所有值都是动态出现的,只有格式相同。在一种情况下,我可能拥有所有字符串值。或值的组合。我没有预定义值。
    【解决方案7】:

    我知道这个问题已经很久没有问过了,但仍然...... 你试过这个吗:

    DataFormat df = workbook.createDataFormat();
    cellStyle.setDataFormat(df.getFormat("@"));
    

    【讨论】:

      【解决方案8】:

      旧但仍然相关。

      你应该使用“。”在文本中作为小数分隔符并将单元格格式化为 NUMERIC。

      还可以使用带有 de 模式“#.00”的 DataFormat,瞧!没有警告,一切都很好。

      cell.setCellType(Cell.CELL_TYPE_NUMERIC);
      cell.setCellValue(Double.parseDouble(data));
      DataFormat format = hwb.createDataFormat();
      CellStyle numbercellStyle = hwb.createCellStyle();
      numbercellStyle.setDataFormat(format.getFormat("#.00"));
      cell.setCellStyle(numbercellStyle);
      

      【讨论】:

        【解决方案9】:

        简单,你也可以在poi 4.1.1中使用下面的代码

        cell.setCellValue(Double.parseDouble(yourvalue));

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-06-19
          • 1970-01-01
          • 2022-07-25
          • 1970-01-01
          • 2011-09-07
          • 2014-12-07
          • 1970-01-01
          • 2014-12-05
          相关资源
          最近更新 更多