公式后未应用单元格格式

cell formatting not applied after formula

我正在使用 NPOI。 我读到一个 Excel 工作簿,其中有两个 sheet 作为我将要生成的结果工作簿的 "template"。 Sheet 0 除了一些 header 行之外是空的,而 sheet 1 有许多行的公式。公式通常引用 sheet 0 并从中提取数据。

我不能直接写入模板工作簿,因为我不得不将行移开,这样很快就会变得丑陋,所以在代码中我创建了一个新的结果工作簿,其中包含两个 sheets。基于预设的配置文件,我用数据逐行填充此结果工作簿的 sheet 0,从模板工作簿中克隆某些行的样式和公式。 Sheet 0 最终填满了数据,而 sheet 1 基本上是一行公式复制和相对调整,通常从 sheet 0 中拉取数据,在这里或那里进行一些小的计算。 我在 sheet 0 中的所有数据都是文本,不能解释为数字、日期等。所以我将我的数据单元格类型设置为字符串。

在代码中,我然后遍历 sheet 1 和 EvaluateInCell 中的所有单元格。 我这样做显然是为了评估公式,但也是为了删除公式并保留 copied/calculated 结果。这只是我正在做的工作的要求。我们提供最终结果,没有公式。 我保存生成的工作簿。

总的来说看起来不错,除了我有单元格格式的地方,格式似乎没有应用。 当我在 Excel 中获取单元格格式属性时,格式就在那里。 例如,我的数据中可能有文本数据 date-time,显示为: 2016 年 7 月 7 日 9:54:55 上午 这就是原始数据文本,但在我的公式 sheet 中,我有一个自定义单元格格式 yyyymmdd。 然而,单元格仍然显示:7/7/2016 9:54:55 AM 在 Excel 然后我做一些像手动编辑值的事情,例如删除最后一个 'M' 并重新键入 'M' 并按回车键,该单元格更改为所需的格式并显示: 20160707 同样,格式在那里,只是没有应用。

我不想手动编辑单元格,也不想在我的客户在 Excel 中打开工作簿后执行任何操作。我希望生成的工作簿以格式化的值打开。 我尝试了一些看起来像是在黑暗中拍摄的东西,比如:

this.ResultWorkbook.GetCreationHelper().CreateFormulaEvaluator().EvaluateAll(); ((XSSFWorkbook)this.ResultWorkbook).SetForceFormulaRecalculation(true);

但这并没有帮助。 有什么想法吗?

在为单元格

设置公式时,你能试试这两种方法中的任何一种吗?

方法一

ICellStyle dateCellStyle = workbook.CreateCellStyle();
dateCellStyle.DataFormat = workbook.CreateDataFormat().GetFormat("yyyymmdd"); // Or prefix single quote for data when writing it to excel file like 'yyymmdd ex: '20160707

方法二

 XSSFCellStyle dateCellStyle = (XSSFCellStyle)workbook.CreateCellStyle();
 XSSFDataFormat dateDataFormat = (XSSFDataFormat)workbook.CreateDataFormat();
 dateCellStyle.SetDataFormat(dateDataFormat.GetFormat("yyyymmdd"));

我最终查看了正在写入的模板 Excel 文件的单元格。看起来如果它不是 DateUtil.IsCellDateFormatted 并且 cellStyle.DataFormat 不是 0x31(基于 BuiltInFormats 的文本),那么它必须是数字。 基于此,我尝试将我的文本转换为 DateTime 或适用的 double,并使用这些转换后的变量调用 SetCellValue。否则我写正文。 这似乎适用于我遇到的情况。