2

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

2 回答 2

2

而不是Field.Value, 它将日期的表示形式返回Variant为 a string(因为您将其分配给 a stringin Cells[]),将其用作 aTDateTime并将其转换为您想要的格式。

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;
于 2013-05-02T00:23:13.060 回答
1

在写入所有数据后,我总是使用自动化解决这个问题

 xlApp.Columns['C:C'].Select;
 xlApp.Selection.NumberFormat:=  'yyyy-mm-dd';

顺便说一句,我最近发现将值写入字符串列表、将该字符串列表保存为 csv 文件然后将该 csv 文件导入 Excel 而不是像您在示例中所做的那样为 excel 单元格分配值要快得多。CSV 文件显然不允许任何格式设置,但您可以在将数据导入 Excel 后执行此操作。

(我写得令人吃惊,因为这可能是众所周知的事情——但我从未见过它被记录在案)。我在这里写过。

于 2013-05-02T05:23:09.053 回答