Delphi:如何将时间字符串写入Excel单元格,但保留常规数字格式

Delphi:如何将时间字符串写入Excel单元格,但保留常规数字格式,excel,delphi,formatting,delphi-2009,Excel,Delphi,Formatting,Delphi 2009,我有来自客户端的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

我有来自客户端的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.260416667。我可以观察到两种奇怪的场景:

  • 如果我将单元格格式化为常规格式,则写入6:15:00,在这种情况下,格式将自动转换为自定义格式,并将格式转换为常规格式,结果为0.26041666
  • 如果我用鼠标点击客户端Excel的单元格(常规:6:15:00),Excel会将单元格格式转换为自定义格式,随后转换为文本的常规格式也会导致0.26
  • 因此,我应该找到如何在常规单元格中写入字符串“06:15:00”,同时保留常规格式的方法。从记录的VBA宏代码中生成Delphi代码是不可能的,因为我找不到编写visual Excel命令的方法来达到这种状态

    我正在使用OLE Excel\u 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…

    使用AnsiChar是解决方案:

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

    回答指出,在此处使用AnsiChar@非常重要,而不是Delphi2009默认提供的UnicodeChar。

    添加一个前导撇号,因此输入
    '06:15:00
    ,但该值将被视为文本。客户端Excel中没有前导撇号。客户在is集成流程中使用Excel,必须严格遵守。一旦意识到我已经回答了问题,我就删除了最后一条(错误的)评论-使用VBA。OP在评论中说,这种方法在Excel 2016中不起作用-仍然添加了撇号,因此确切的行为可能是特定于版本的。仍有待理解,为什么录制的宏只使用“@”而不转换为Ansi。我猜-Excel和宏都是Unicode,这就是为什么录制纯'@'可能会产生误导的原因。