【问题标题】:Delphi: how to write time-string into Excel cell but preserve General NumberFormatDelphi:如何将时间字符串写入 Excel 单元格但保留通用 NumberFormat
【发布时间】:2019-10-08 11:01:50
【问题描述】:

我有来自客户端的 Excel(它是从 print-to-Excel 函数生成的),奇怪的是 Excel 在常规格式的单元格中包含时间字符串“06:15:00”。我应该从 Delphi 创建相同的 Excel。

可能代码为:

 FWorksheet.Cells.Item[4, 5].NumberFormat:='';
 FWorksheet.Cells.Item[4, 5].NumberFormat:='06:15:00';
 FWorksheet.Cells.Item[4, 5].NumberFormat:=''; 

但它会以通用格式生成 0.260416666666667。我可以观察到 2 个奇怪的场景:

  1. 如果我将单元格格式设置为 General,则写入 6:15:00,在这种情况下,格式会自动转换为 Custom,并将格式转换为 General 结果为 0.26041666...
  2. 如果我用鼠标单击客户端 Excel 的单元格(一般:6:15:00),则 Excel 会将单元格格式转换为自定义格式,随后转换为文本的一般格式也会导致 0.26...李>

所以,我应该找到如何将字符串“06:15:00”写入常规单元格并同时保留常规格式的方法。从录制的 VBA 宏代码中生成 Delphi 代码是不可能的,因为我找不到编写可视 Excel 命令的方法来达到这种状态。

我正在使用 OLE Excel Excel_TLB。

我在 Excel 中找到了给出所需结果的命令序列,这个序列可以记录为宏:

 Range("O4").Select
 Selection.NumberFormat = "@"
 Range("O4").Select
 ActiveCell.FormulaR1C1 = "06:15:00"
 Range("O4").Select
 Selection.NumberFormat = "General"
 Range("O6").Select

但是我在 Delphi 代码中对这个宏的翻译:

 FWorksheet.Cells.Item[4, 5].NumberFormat:='@';
 FWorksheet.Cells.Item[4, 5].FormulaR1C1:='06:15:00';
 FWorksheet.Cells.Item[4, 5].NumberFormat:=''; 

仍然产生 0.260...

【问题讨论】:

  • 添加一个前导撇号,所以输入'06:15:00,但是这个值将被视为文本。
  • 客户端 Excel 中没有前导撇号。客户在集成流程中使用 Excel,并且必须完全符合。

标签: excel delphi formatting delphi-2009


【解决方案1】:

使用AnsiChar是解决办法:

 FWorksheet.Cells.Item[4, 5].NumberFormat:=AnsiChar('@');
 FWorksheet.Cells.Item[4, 5].FormulaR1C1:='06:15:00';
 FWorksheet.Cells.Item[4, 5].NumberFormat:=''; 

回答https://stackoverflow.com/a/24034170/1375882 指出这里使用AnsiChar @ 非常重要,而不是Delphi2009 默认提供的UnicodeChar。

【讨论】:

  • 一旦我意识到我已经回答了a very similar question - 使用 VBA,我就删除了我的最后一条(错误的)评论。在 cmets OP 中说这种方法在 Excel 2016 中不起作用 - 仍然添加撇号,因此确切的行为可能是特定于版本的。
  • 还有待理解,为什么录制的宏只使用'@'而不转换为Ansi。我猜 - Excel 和宏都是 Unicode,这就是为什么记录纯“@”可能会产生误导。
猜你喜欢
  • 1970-01-01
  • 2012-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-23
  • 2019-09-17
  • 2019-05-20
相关资源
最近更新 更多