使用 POI 在 Excel 中将数字存储为文本警告

问题描述 投票:0回答:6

我使用

POI
创建的 Excel 文件得到 Number stored as text warning。我正在尝试显示百分比。这个question讨论了相同的内容,但它是针对python的。有人可以建议我如何使用 POI 在 java 中避免这种情况吗?

以下是我收到此警告的行。

workbook= new XSSFWorkbook();
sh1 = wb.createSheet("Data Sheet");
    cell = row.createCell(3);
    cell.setCellValue(37 + "%");

根据 Gagravarr 的回答,我是这样做的。

XSSFDataFormat df = workbook.createDataFormat();
                    CellStyle cs = wb.createCellStyle();
                    cs.setDataFormat(df.getFormat("%"));
                    cell.setCellValue(0.37);
                    cell.setCellStyle(cs);

但现在只是显示为 0.37,没有任何警告,而不是 37%。

java excel apache-poi
6个回答
11
投票

您收到警告是因为,正如它所说,您将数字存储为文本。

您可能想做的是:

CellStyle cs = wb.createCellStyle();
cs.setDataFormat(df.getFormat("%"));
cell.setCellValue(0.37);
cell.setCellStyle(cs);

这会将数字 37 存储为数字,并告诉 Excel 对它应用百分比格式字符串。哦,由于 37% 是 0.37,所以您需要存储 0.37 而不是 37!

编辑 根据大众的要求,这里有一个独立的程序,您可以使用它来查看 .xls 和 .xlsx 文件的运行情况。使用 POI 3.10 Final 进行测试,并在类路径上使用所有必需的依赖项和组件 jars

public class TestPercent {
  public static void main(String[] args) throws Exception {
    System.out.println("Generating...");

    for (Workbook wb : new Workbook[] {new HSSFWorkbook(), new XSSFWorkbook()}) {
        Sheet sheet = wb.createSheet("Data Sheet");
        Row row = sheet.createRow(0);
        Cell cell = row.createCell(3);

        DataFormat df = wb.createDataFormat();
        CellStyle cs = wb.createCellStyle();
        cs.setDataFormat(df.getFormat("%"));
        cell.setCellValue(0.37);
        cell.setCellStyle(cs);

        String output = "/tmp/text.xls";
        if (wb instanceof XSSFWorkbook) { output += "x"; }
        FileOutputStream out = new FileOutputStream(output);
        wb.write(out);
        out.close();
    }

    System.out.println("Done");
  }
}

5
投票

也尝试设置 CellType:

cell.setCellType(Cell.CELL_TYPE_NUMERIC);

2
投票
    if(NumberUtils.isDigits(text)){
        titleCell.setCellValue(Integer.parseInt(text));
    }else{
        titleCell.setCellValue(text);
    }

1
投票
    XSSFWorkbook xSSFWorkbook = new XSSFWorkbook();
    CreationHelper createHelper = xSSFWorkbook.getCreationHelper();
    XSSFCellStyle numberStyle = xSSFWorkbook.createCellStyle();             
    numberStyle.setDataFormat(createHelper.createDataFormat().getFormat("###.00"));
    double d = 50.0;
    XSSFRow dataRow = sheet.createRow(1);
    Cellcel1 = dataRow.createCell(1);
    cel1.setCellValue(d);

0
投票

这可能有点旧,但试试这个:

df.getFormat("0.00%")

0
投票

正如旧答案已经解释的那样,如果您错误地将数字写为文本,您会收到该警告;然而,在某些情况下,这并不是一个错误:例如,“产品代码”可能是一个“数字字符串”,即仅包含数字的字符串(可能带有前导零)。在这种情况下,解决方案是禁用该警告 if (sheet instanceof XSSFSheet) { XSSFSheet xsheet = (XSSFSheet)sheet; xsheet.addIgnoredErrors(new CellRangeAddress(1, sheet.getLastRowNum(), 0, 20), IgnoredErrorType.NUMBER_STORED_AS_TEXT); }

单元格范围可以是特定的“代码”列或所有填充的列。

© www.soinside.com 2019 - 2024. All rights reserved.