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

APACHE POI设置单元格样式清除现有日期格式

归松
2023-03-14

我是Java编程的新手,这是我的第一篇文章,所以希望这是一个有效的问题。我翻遍了档案,但找不到合适的答案。

我的班级正在阅读和验证一个电子表格。错误的单元格被设置为带有红色背景的样式,有效的单元格被设置为没有反循环的样式。这一切都很好,直到遇到日期单元格。setCellStyle语句似乎正在清除日期格式。有人能告诉我如何防止这种情况吗?

因此,首先在Excel中查看单元格时,它显示25/08/20。

在我的程序中将样式更新为背景红色后,然后返回到Excel中,单元格显示为红色,但有一个数值,如92345678.0000(我现在不记得确切的值了)。

XSSFCellStyle styleBad = wb.createCellStyle();
XSSFCellStyle styleGood = wb.createCellStyle();
styleGood.setFillPattern(FillPatternType.NO_FILL);
styleBad.setFillForegroundColor(IndexedColors.RED.getIndex());
styleBad.setFillPattern(FillPatternType.SOLID_FOREGROUND);
if (!validateCell(cell, tca[cx], cellValues)) {
  cell.setCellStyle(styleBad);
  errorMessage += ("Cell " + (cx + 1) + " " + cellValues.cellMessage + ". ");
  wbValid = false;
  }
else {
  cell.setCellStyle(styleGood);                        Mucks up date formatting??                                                                     
}

共有1个答案

武向文
2023-03-14

数字格式模式是单元格样式的一部分。因此,当您将单元格样式设置为new时,还将数字格式模式设置为default。

您可以使用cellutil向现有的单元格样式添加属性,而不是将其设置为新的。方法Cellutil.SetCellStyleProperties可以添加新的单元格样式属性,但保留单元格已经存在的单元格样式属性。

...
Map<String, Object> properties = new HashMap<String, Object>();
...

if (!validateCell(cell, tca[cx], cellValues)) {
  properties = new HashMap<String, Object>();
  properties.put(CellUtil.FILL_PATTERN, FillPatternType.SOLID_FOREGROUND);
  properties.put(CellUtil.FILL_FOREGROUND_COLOR, IndexedColors.RED.getIndex());
  CellUtil.setCellStyleProperties(cell, properties); 
  errorMessage += ("Cell " + (cx + 1) + " " + cellValues.cellMessage + ". ");
  wbValid = false;
}
else {
  properties = new HashMap<String, Object>();
  properties.put(CellUtil.FILL_PATTERN, FillPatternType.NO_FILL);
  CellUtil.setCellStyleProperties(cell, properties);       
}
...
 类似资料:
  • 如何为单个单元格设置两种不同的样式?当前我正在显示中的单元格值 粗体 货币格式,例如:.

  • 我无法将此行的样式设置为: 它给我的错误是“无法在基元类型void上调用setCellValue(String)”。这种情况下的错误是什么?我如何在单行代码中实现所有3个目标?

  • setColumn 样式影响范围为整列。 设置 range 参数为 A1:D1,第一反应是设置第一行的前四个单元格样式,但是实际效果确是设置 第一列、第二列、第三列、第四列 整列。 函数原型 setColumn(string $range, double $width [, resource $formatHandler]); string $range $config = ['path' =>

  • setRow 样式影响范围为整行。 设置 range 参数为 A1:D1,第一反应是设置第一行的前四个单元格样式,但是实际效果确是设置 第一行整行。 如果是 A1:B3 ,就会设置 第一行、第二行、第三行样式,因为单元格范围覆盖了 第一行、第二行、第三行。 函数原型 setRow(string $range, double $height [, resource $formatHandler]);

  • 问题内容: 我已经使用Apache POI一段时间来以编程方式读取现有的Excel 2003文件。现在,我有一个新的要求,即在内存中创建整个.xls文件(仍然使用Apache POI),然后将它们最后写入文件中。困扰我的唯一问题是带日期的单元格的处理。 考虑以下代码: 当我将包含此单元格的工作簿写到文件中并用Excel打开它时,该单元格将显示为数字。是的,我确实意识到Excel将其“日期”存储为自