【问题标题】:How to set a cell format to Text如何将单元格格式设置为文本
【发布时间】:2016-03-15 17:56:04
【问题描述】:

我使用的是 Apache-POI 3.14。我需要将单元格锁定为“文本”格式。我单元格中的数据可能全是数字,但仍被视为字符串。当我写单元格时,我是这样写的:

cell.setCellValue("001");
cell.setCellType(Cell.CELL_TYPE_STRING);

当我在 Excel 中打开输出工作簿时,单元格包含正确的值(“001”),并在角落显示一个绿色小三角形。将鼠标悬停在感叹号上会显示悬停文本The number in this cell is formatted as text or preceded by an apostrophe。当我查看单元格格式(右键单击-> 格式化单元格)时,“类别”显示为“常规”。我希望这是“文本”。

当用户通过仅输入数字来修改单元格中的值时,就会出现问题。因为“类别”是“常规”,所以输入值并显示为数字,去掉前导零并右对齐。

如何获得与 Excel 的“单元格格式”对话框相同的结果?

【问题讨论】:

  • 您使用什么格式 - XSSF (.xlsx) 或 HSSF (.xls)?

标签: java excel apache-poi


【解决方案1】:

您可以尝试将单元格格式设置为文本通过

DataFormat fmt = wb.createDataFormat();
CellStyle cellStyle = wb.createCellStyle();
cellStyle.setDataFormat(
    fmt.getFormat("@"));
cell.setCellStyle(cellStyle);

注意:应该为所有适用的单元格重复使用 CellStyles,不要为每个单元格创建新的。

您也可以尝试使用 .xlsx 格式的“忽略错误”功能,但尚未完全支持它,请参阅 Issue 46136Issue 58641 以了解正在进行的讨论。

有关更多信息,另请参阅 this MSDN page

【讨论】:

  • 这成功了——尽管我使用"@" 格式作为文本。我相信"#" 会使类型变为数字。
  • 46136 可能是 HSSF 的最佳选择,或者 56892 用于 XSSF/SS
  • 对不起,我不确定“@”,但显然懒得交叉检查:(
【解决方案2】:

对于 HSSF,

    DataFormat fmt = workbook.createDataFormat();
    CellStyle textStyle = workbook.createCellStyle();
    textStyle.setDataFormat(fmt.getFormat("@"));
    sheet.setDefaultColumnStyle(0, textStyle);

它只是将整个列样式设置为 Text 并将类别设置为 Text 。

但是,如果您使用的是 XSSF 格式,它就不起作用(我使用的是 Apache Poi 3.15 并且不适合我)。 在这种情况下,除了上述代码之外,您还为每个要视为文本的单元格设置样式:

cell.setCellStyle(textStyle);

关于错误,你可以使用

sheet.addIgnoredErrors(new CellRangeAddress(0,9999,0,9999),IgnoredErrorType.NUMBER_STORED_AS_TEXT );

它会忽略第 0 行到 9999 和第 0 列到 9999 的 NUMBER_STORED_AS_TEXT 错误,您不会看到它。

【讨论】:

    【解决方案3】:

    看起来 OP 要求 Apache 解决方案。经过一番搜索,我找到了这个答案:

    HSSFCellStyle style = book.createCellStyle();
    style.setDataFormat(BuiltInFormats.getBuiltInFormat("text"));
    

    【讨论】:

    • 这应该用于什么语言/库?只是它看起来不像 Apache POI + Java,这正是 OP 想要解决的问题......
    • 刚刚注意到。感谢您与我们联系。
    【解决方案4】:

    在这种情况下,我使用的是 Apache-POI 3.15,我遇到了同样的问题,所以我以我的风格验证了数据,我需要数字 >0 和字符串:

    try {
        if (Integer.parseInt(field + "") >= 0) {
            int valor = Integer.parseInt(field + "");
            cell.setCellValue(valor); //Int
        }
    } catch (NumberFormatException nfe) {
        // no int
        try {
            if (Double.parseDouble(field + "") >= 0) {
                double valor = Double.parseDouble(field + ""); //double
                cell.setCellValue(valor);
            }
        } catch (NumberFormatException nfe2) {
            cell.setCellValue(field + ""); //String
        }
    }
    

    【讨论】:

      【解决方案5】:

      对于 Apache POI 4.0.1:

      XSSFSheet sheet = workbook.createSheet("MySheetName");
      sheet.addIgnoredErrors(new CellRangeAddress(0, 9999, 0, 9999), IgnoredErrorType.NUMBER_STORED_AS_TEXT);
      

      注意将工作表转换为org.apache.poi.xssf.usermodel.XSSFSheet 而不是org.apache.poi.ss.usermodel.Sheet,否则 addIgnoredErrors 方法将是未知的。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多