如何导入实际值,而不是从excel格式化

时间:2013-05-01 23:11:34

标签: excel delphi ado

我正在努力从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;

2 个答案:

答案 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