我正在努力从excel文件导入日期值。 导入部分工作正常!唯一的问题是它的格式。
在excel文件中,所有日期值都以“yyyy-mm-dd”格式输入,但单元格本身将其显示为“dd-mm-yyyy”。当我的程序从excel文件导入值时,它会将日期导入为'dd-mm-yyyy',而不是用户实际输入'yyyy-mm-dd'的格式 - 基本上是格式化的日期。
好吧,我可以操纵'dd-mm-yyyy'到'yyyy-mm-dd'但是我想避免这个解决方案,除非我真的没有别的办法去做。
是否有任何预定义的delphi函数将'dd-mm-yyyy'反转为'yyyy-mm-dd'? 或者是否有任何特殊的方法来提供实际未格式化的原始日期,而不是格式化的日期?
不幸的是,更改excel中的单元格格式不是一种选择..:'(
感谢。
更新:::
ConnectionString :='Microsoft.ACE.OLEDB.12.0;'+
'Data Source='+filename+';'+
'Extended Properties="Excel 8.0;'+
'Imex=2;HDR=NO;;';
}
// IMEX = 0: Export mode, 1: Import mode, 2: Linked mode (full update capabilities)
ADOQuery1.SQL.Clear;
query := 'SELECT * FROM [sheet1$]';
ADOQuery1.SQL.Add(query);
ADOQuery1.open;
i:=0;
while not eof do
begin
i:= i+1;
Cells[0,i] := IntToStr(i);
Cells[1,i] := Fields[1].AsString;
Cells[2,i] := Fields[2].AsString;
Cells[3,i] := Fields[3].Value; // This is the date value I'm trying to import.
Cells[4,i] := Fields[4].AsString;
Cells[5,i] := Fields[5].AsString;
Cells[6,i] := Fields[6].AsString;
Cells[7,i] := Fields[7].AsString;
Cells[8,i] := Fields[8].AsString;
Cells[9,i] := Fields[9].AsString;
RowCount := RowCount+1;
next;
end;
答案 0 :(得分:2)
而不是Field.Value
,它将Variant
日期的string
表示形式返回string
(因为您将其分配给Cells[]
中的TDateTime
),将其用作Cells[3,i] := DateToStr(Fields[3].AsDateTime);
并将其转换为您想要的格式。
Cells[3,i] := FormatDateTime('yyyy-mm-dd', Fields[3].AsDateTime);
或
try
Cells[3, i] := FormatDateTime('yyyy-mm-dd', VarToDateTime(Fields[3].Value));
except
raise Exception.CreateFmt('Unable to convert %s to DateTime',
[Fields[3].Value]);
end;
根据您对我的回答的评论,该字段似乎实际上不包含日期,但包含文本值。在这种情况下,您可以尝试这样的事情:
{{1}}
答案 1 :(得分:1)
在写完所有数据后,我总是使用自动化解决这个问题
xlApp.Columns['C:C'].Select;
xlApp.Selection.NumberFormat:= 'yyyy-mm-dd';
顺便提一下,我最近发现令人吃惊的发现,将值写入字符串列表要快得多,将该字符串列表保存为csv文件,然后将该csv文件导入Excel,而不是将值分配给Excel就像你在你的例子中所做的一样。 Csv文件显然不允许任何格式化,但您可以在将数据导入Excel后执行此操作。
(我写令人吃惊的,因为这可能会成为众所周知的东西 - 但我从来没有见过它记录过)。我写了here。