Delphi: как записать временную строку в ячейку Excel, но сохранить General NumberFormat - PullRequest
2 голосов
/ 08 октября 2019

У меня Excel из клиента (который сгенерировал его из функции печати в Excel), странно то, что Excel содержит строку времени '06: 15: 00 'в ячейку с общим форматом. Я должен создать идентичный Excel из Delphi.

Может код:

 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. Если я щелкаю мышью в ячейке (Общее: 6:15:00) клиентского Excel, то Excel преобразует формат ячейки в Пользовательский, а последующее преобразование в Общий текст также приводит к0.26 ...

Итак, я должен найти способ записать в ячейку General строку '06: 15: 00 'и в то же время сохранить формат General. Невозможно сгенерировать код Delphi из записанного кода макроса VBA, потому что я не могу найти способ составления визуальных команд 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 ...

1 Ответ

2 голосов
/ 08 октября 2019

Использование 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 @, а не UnicodeChar, который предоставляется Delphi2009по умолчанию.

...