【问题标题】:cell formatting not applied after formula公式后未应用单元格格式
【发布时间】:2017-12-11 21:48:53
【问题描述】:

我正在使用 NPOI。 我在一个 Excel 工作簿中阅读,其中两张表充当我将要生成的结果工作簿的“模板”。除了一些标题行之外,工作表 0 是空的,工作表 1 有许多行公式。公式通常引用工作表 0 并从中提取数据。

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

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

一般情况看起来不错,除了我有单元格格式之外,似乎没有应用格式。 当我在 Excel 中获取单元格格式属性时,格式就在那里。 例如,我的数据中可能有作为日期时间的文本数据,显示为: 2016 年 7 月 7 日上午 9:54:55 这是原始数据文本,但在我的公式表上,我有一个自定义单元格格式 yyyymmdd。 然而,单元格仍然显示:7/7/2016 9:54:55 AM 然后在 Excel 中,我执行手动编辑值之类的操作,例如删除最后一个“M”并重新键入“M”并按 Enter,该单元格将更改为所需的格式并显示: 20160707 再说一遍,格式是存在的,只是没有应用。

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

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

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

【问题讨论】:

  • “例如,我可能有一个日期时间的文本数据”:日期时间值不是 Excel 中的文本,而是具有整数部分为日期和小数部分为时间的双精度值(1 /24 = 1 小时,1/24/60 = 1 分钟,1/24/60/60 = 1 秒,...)。 Excel 将不会将文本格式化为日期。所以你需要使用SetCellValue(DateTime value) 输入日期时间值,而不是字符串。
  • 不幸的是,我的代码不允许解释数据。它只是我的代码的一个字符串,是单独处理的结果,在运行时不能解释为日期时间。有时数据已经格式化,有时不是。如果不是,则 Excel 单元格格式有望成为解决方案。在我撕掉 Excel 互操作代码并切换到 NPOI 之前,这以某种方式起作用。我明白你所说的关于 SetCellValue 的内容,但这需要我的代码知道数据是什么以及它已经采用的格式。它没有。
  • “很遗憾,我的代码不允许解释数据。”不幸的是,我无能为力。

标签: apache-poi npoi


【解决方案1】:

你可以在设置单元格公式时尝试这两种方法中的任何一种吗

方法 1

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

方法 2

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-11-13
      相关资源
      最近更新 更多