我用delphi第三方控件DataSetToExcel把查询结果从Oracle导出到Excel
查询结果为:
合同编号楼层 单元 开始日期 结束日期 最后付款日期
A12899 1G 1GS041 01-04-2012 30-04-2012 30-04-2012
A12902 15 15009 01-04-2012 30-04-2012 15-04-2012
A12907 11 11005B 01-04-2012 30-04-2012 30-04-2012
A12908 11 11001J 01-04-2012 30-04-2012 30-04-2012
A12911 15 15045 01-04-2012 30-04-2012 30-04-2012
A12911 15 15045 01-04-2012 30-04-2012 30-04-2012当使用控件导出到Excel时,日期格式就变成了
A12482 13 13091 4/1/2012 30/04/2012
A12483 13 13092 4/1/2012 30/04/2012
A12489 13 13104A 4/1/2012 30/04/2012
A12490 13 13104B 4/1/2012 30/04/2012
A12491 13 13105 4/1/2012 30/04/2012
A12494 13 13109 4/1/2012 30/04/2012不仅是日期格式和日期都不正确了,有朋友遇到这样的问题吗?如何解决?

解决方案 »

  1.   

    可以这样:
    控制面板->区域和语言选项->区域选项[选项卡中]->自定义->日期[选项卡中]
    设置你需要的时间格式试一试。
      

  2.   

    可以这样:
    控制面板->区域和语言选项->区域选项[选项卡中]->自定义->日期[选项卡中]
    设置你需要的时间格式试一试。
      

  3.   

    那个控件没有用过,你可以用cxgrid这个控件或者自己编写导出代码。自己编写导出excel的代码,网上很好找的。cxgrid有一个函数可以导出到excel。
      

  4.   

    我觉得不是grid的问题,应该是控件输出到Excel的问题,应该数据在数据库的格式是没有问题的,导到Excel才有问题,但是我也不知道是什么原因,一列出现两种格式,如何设置都不统一。
      

  5.   

    把DataSetToExcel的代码找出来,把日期字段汇出时都转换成文本就行了。
      

  6.   

    把DataSetToExcel的代码找出来看下,将日期格式汇出的全部转换为字符串汇出。
    这个跟电脑的操作系统的版本,和设置的区域和语言选项有关。你可以试着换一台电脑试下。
      

  7.   


    默认情况下 UK 和 US 的short formatting 月和日就是反过来的 
      

  8.   

    不行就用cxgrid这个控件吧,这个控件还是不错的。最后要还是不行的话就自己写代码导入,想怎么导入都可以。
    我平常都是自己写代码导入excel的。
      

  9.   

    几种方式:
    1:设置excel单元格range的format,设置成你想要的日期格式,在deiphi中访问range的value是variant类型的属性,给他赋值的时候直接赋给它一个日期类型的值
    2:在给range的value赋值时,赋的是日期字符串,该字符串已经是format成你指定的格式
    3:可以对range赋值,赋的是variant array,你在生成variant array时就将日期部分写成字符串你在oracle中查看到的日期格式 是数据库默认的日期格式 转换成string 显示在终端的
      

  10.   

    几种方式:
    1:设置excel单元格range的format,设置成你想要的日期格式,在delphi中访问range的value是variant类型的属性,给他赋值的时候直接赋给它一个日期类型的值
    2:在给range的value赋值时,赋的是日期字符串,该字符串已经是format成你指定的格式
    3:可以对range赋值,赋的是variant array,你在生成variant array时就将日期部分写成字符串你在oracle中查看到的日期格式 是数据库默认的日期格式 转换成string 显示在终端的
      

  11.   

    function TDataSetToExcel.Execute;
      procedure SetFileName;
      var fn:TSaveDialog;
          msgID:integer;
      begin
        fn:=TSaveDialog.Create(self);
        fn.Filter := 'Excel文件|*.xls';
        if not fn.Execute then
           Abort;
        FileName:=fn.FileName;
        if FileExists(FileName) then
        begin
          msgID := MessageBox(0,'文件已经存在,是否覆盖旧文件?','找到旧文件',MB_YESNOCANCEL+MB_ICONQUESTION+MB_DEFBUTTON1);
          case msgID of
            IDYES:deletefile(FileName);
            IDNO:SetFileName;
            IDCANCEL:Abort;
          end;
        end;
        fn.Free;
        fn := nil;
      end;
    var XLApp,Sheet:variant;
      i,j:integer;
    begin
      if not Assigned(FDataSet) then
         Raise Exception.Create('请设置要转出的数据集!');
      if (not FDataSet.Active) or (FDataSet.IsEmpty) then
         Raise Exception.Create('没有数据可以转出!');  SetFileName;
      try
        XLApp := CreateOleObject('Excel.Application');
        XLApp.visible := False;
        XLApp.workbooks.Add(xlWBatWorkSheet);
        if Trim(FSheetName)='' then
           FSheetName:='From Delphi App';
        XLApp.workbooks[1].workSheets[1].Name:=FSheetName;
        Sheet:=XLApp.Workbooks[1].WorkSheets[FSheetName];
        for i:= 0 to FDataSet.FieldCount -1  do
          Sheet.Cells[1,i+1] := FDataSet.Fields[i].DisplayName;
        frmProgress.Show;
        j:=2;
        FDataSet.DisableControls;
        FDataSet.First;
        while not FDataSet.Eof do
        begin
          for i := 1 to FDataSet.FieldCount  do
          begin
            Sheet.Cells[j,i] := FDataSet.Fields[i-1].AsString;
            StepProgress;
          end;
          FDataSet.Next;
          Inc(j);
        end;
        XLApp.ActiveWorkbook.SaveAs(FileName, xlNormal, '','',False, False);
      finally
        XLApp.Quit;
        frmProgress.Free;
        frmProgress:=nil;
      end;
    end;
      

  12.   

    是在以上代码哪个位置设Excel格式呢?
      

  13.   

    楼上代码没有给Excel设置格式给Excel的Cell赋值的代码他是写成
    Sheet.Cells[j,i] := FDataSet.Fields[i-1].AsString;这样也是不可以的,因为Excel会识别到,如果传入的是一个日期字符串,他会自动转成日期类型,按照日期格式显示的,如果你一定要传入字符串,且按照字符串原样显示的话,可以写成
    if 日期字段 then
      Sheet.Cells[j,i] := ''''+FormatDateTime('dd-MM-yyyy', FDataSet.Fields[i-1].AsDateTime);注意,在字符串前面加上一个单引号‘是为了让Excel强制将值当成string来显示和处理
      

  14.   

     while not FDataSet.Eof do
      begin
      for i := 1 to FDataSet.FieldCount do
      begin
      Sheet.Cells[j,i] := FDataSet.Fields[i-1].AsString;
      if 日期字段 then
      Sheet.Cells[j,i] := ''''+FormatDateTime('dd-MM-yyyy', FDataSet.Fields[i-1].AsDateTime); 
      StepProgress;
      end;
      FDataSet.Next;
      Inc(j);
      end;
    这个日期字段是 什么条件?还是具体是哪一列?
      

  15.   


    j=1
    while not FDataSet.Eof do
    begin
      for i := 1 to FDataSet.FieldCount do
      begin
        if (i=2)or(i=3) then //假设第二三列是日期字段
          Sheet.Cells[j,i] := ''''+FormatDateTime('dd-MM-yyyy', FDataSet.Fields[i-1].AsDateTime);  // 这里不是两个双引号 是 四个单引号 表示添加一个单引号
        StepProgress;
      end;
      FDataSet.Next;
      Inc(j);
    end;