【问题标题】:APACHE POI setting cell style clears existing date formatAPACHE POI 设置单元格样式清除现有日期格式
【发布时间】:2020-12-14 08:31:49
【问题描述】:

我是 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??                                                                     
}

【问题讨论】:

  • 单元格样式包括数据格式。所以,你需要复制数据格式模式

标签: java excel date apache-poi


【解决方案1】:

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

您可以使用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);       
}
...

【讨论】:

  • 谢谢 Axel,这真的很有帮助。遗憾的是,这是在 IBM i 上运行的,它只支持 Java 8,因此只支持 POI 3.9。因此我不得不使用 setStyleProperty,所​​以没什么大不了的。我还没有完全让它工作,错误单元格直到你点击它才会填充,然后它被填充为黑色而不是红色!我希望自己能在接下来的一两天内解决这个问题。
  • @Russell Catchpole:不清楚为什么要使用旧的(非常古老的)apache poi 3.9。但要求Java 8 不能成为原因。所有当前的apache poi 版本都在Java 8 上运行。
猜你喜欢
  • 2012-12-28
  • 2012-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多