我使用
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%。
您收到警告是因为,正如它所说,您将数字存储为文本。
您可能想做的是:
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");
}
}
也尝试设置 CellType:
cell.setCellType(Cell.CELL_TYPE_NUMERIC);
if(NumberUtils.isDigits(text)){
titleCell.setCellValue(Integer.parseInt(text));
}else{
titleCell.setCellValue(text);
}
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);
这可能有点旧,但试试这个:
df.getFormat("0.00%")
正如旧答案已经解释的那样,如果您错误地将数字写为文本,您会收到该警告;然而,在某些情况下,这并不是一个错误:例如,“产品代码”可能是一个“数字字符串”,即仅包含数字的字符串(可能带有前导零)。在这种情况下,解决方案是禁用该警告:
if (sheet instanceof XSSFSheet) {
XSSFSheet xsheet = (XSSFSheet)sheet;
xsheet.addIgnoredErrors(new CellRangeAddress(1, sheet.getLastRowNum(), 0, 20),
IgnoredErrorType.NUMBER_STORED_AS_TEXT);
}
单元格范围可以是特定的“代码”列或所有填充的列。