我有一段将数据集导出到excel的代码,可是时间类型导出后显示不正确,有没有好的办法解决.(50分)

  • 主题发起人 主题发起人 爱睡的狗狗
  • 开始时间 开始时间

爱睡的狗狗

Unregistered / Unconfirmed
GUEST, unregistred user!
我有一段将数据集导出到excel的代码,可是时间类型导出后显示不正确,有没有好的办法解决.如果时间是 2006-10-12 16:02:00,那么在excel中显示如下;39006.4472222222
还有就是有没有好是方法可以在将数据集导入到excel中,可以给它加标题 如
单位 时间 产品
11 2006-10-12 16:02:00 a (此行数据为数据集中的内容)
代码如下:
//将数据集中的数据导入到excel表中
begin
DrExcel(Query);
end;
//----------------导入Excel过程实现----------------
Procedure TForm_AlertMessage.DrExcel(AdoQry:TAdoQuery);
var
DrExcelApp:TExCelApplication;
DrExcelWb:TExcelWorkbook;
DrExcelWs:TExcelWorkSheet;
Empty:OleVariant;
Col:Char;
Row,j:integer;
R:String;
Begin
//----创建Excel对象
DrExcelApp:=TExCelApplication.Create(application);
DrExcelWb:=TExcelWorkBook.Create(Application);
DrExcelWs:=TExcelWorkSheet.Create(Application);
Try
DrExcelApp.Connect;
except
messagedlg('Excel可能没有安装',mtError,[mbok],0);
Abort;
end;

DrExcelapp.Visible[0]:=true;
try
Empty:=EmptyParam;
//---添加一个新的工作簿
DrExcelApp.Workbooks.Add(Empty,0);
//---组件和工作簿相连
DrExcelWb.ConnectTo(DrExcelapp.Workbooks.Item[DrExcelApp.Workbooks.count]);
//----激活工作簿
DrExcelWb.Activate;
//----组件和工作表相连
DrExcelWs.ConnectTo(DrExcelWb.Worksheets[1] as _WorkSheet);
//-------------------导入数据-------------------------------------------------
if adoqry.IsEmpty then
begin
//showmessage('您好,没有要导出到excel中的数据');
exit;
end;
With AdoQry do
begin
First; //--移到第一条
Col:='A'; //--第一列为A
Row:=2; //--从第一行开始

drexcelws.Range['A1','A1'].Value2:='单位';
drexcelws.Range['B1','B1'].Value2:='时间';
//-------从数据库中读取纪录
While not eof do begin
For j:=0 to fields.Count-1 do begin
R:=String(Col)+inttostr(Row);
//----将数据库中的数据写入Excel中
DrExcelws.Range[R,R].Value2:=Fields.Fields[j].Value;

//-----得到下一列,依次为A,B,C

Col:=Chr(ord(Col)+1);
end;

inc(Row); //--下一行
Col:='A'; //--重新指向第一列

next; //--下一条记录
end;
end;

DrExcelWb.Close(xlDonotsaveChanges);
//-------------------导入数据结束-------------------------------------------------

//-------------------释放对象-----------------
AdoQry.First;
DrExcelApp.Free;
DrExcelWb.Free;
DrExcelWs.Free;

Except

//----关闭连接--------
DrExcelWb.Close(xldonotsavechanges);
DrExcelApp.Disconnect;
DrExcelApp.Free;
DrExcelWb.Free;
DrExcelWs.Free;
AdoQry.First;
end;
end;
 
我用的是Excel:=CreateOleObject('Excel.Application')方式,只要设定Excel.Columns[2].NumberFormat:='@'就可以了。
 
我贴一段代码给你参考,完全可以满足你的要求:
procedure TfmIn.btn_2Click(Sender: TObject);
var
i,j,iPos,iCnt1,iCnt2:integer;
sFileName,s,sStaffNo,sMoney,sExcelName,sPayNo,sNo:string;
dAmt1,dAmt2:Double;
F:TextFile;
Excel:Variant;
begin
if edFileName.Text='' then
Exit;
sFileName:=edFileName.Text;
if not FileExists(sFileName) then
begin
MessageDlg('²»´æÔÚÎļþ '+sFileName,mtError,[mbOK],0);
Exit;
end;

iPos:=Pos('.',sFileName);
sExcelName:=Copy(sFileName,1,iPos-1)+'.xls';


{ SHOWMESSAGE(sExcelName);
Exit; }

AssignFile(F,sFileName);
Reset(F);
try
if EOF(F) then
Exit;

if not dbs.Connected then
try
dbs.Connected:=TRUE;
except
MessageDlg('ÎÞ·¨Á¬½Ó¹¤×Êϵͳ·þÎñÆ÷!',mtError,[mbOK],0);
Exit;
end;

sts.Panels[0].Text:='ÕýÔÚ´ò¿ªExcel ...';
Application.ProcessMessages;

CoInitialize(nil);
try
Excel:=CreateOleObject('Excel.Application');
try
Excel.Workbooks.Add;

Excel.WorkSheets[1].Name:='³É¹¦¿Û¿îÈËÔ±';
Excel.WorkSheets[2].Name:='δ³É¹¦¿Û¿îÈËÔ±';

Excel.WorkSheets[1].Activate;
Excel.Columns[1].ColumnWidth:=10;
Excel.Columns[1].NumberFormat:='@';
Excel.Columns[2].ColumnWidth:=14;
Excel.Columns[2].NumberFormat:='@';
Excel.Columns[3].ColumnWidth:=14;
Excel.Columns[3].NumberFormat:='@';
Excel.Columns[4].ColumnWidth:=16;
Excel.Columns[4].NumberFormat:='#,###,##0.00';

Excel.Cells(1,2):=edRefmonth.Text+'³äÖµ³É¹¦¿Û¿îÃûµ¥ ';
Excel.Cells(2,1):='ÐòºÅ';
Excel.Cells(2,2):='¹¤ºÅ';
Excel.Cells(2,3):='ÐÕÃû';
Excel.Cells(2,4):='³äÖµ½ð¶î';

Excel.WorkSheets[2].Activate;
Excel.Columns[1].ColumnWidth:=10;
Excel.Columns[1].NumberFormat:='@';
Excel.Columns[2].ColumnWidth:=14;
Excel.Columns[2].NumberFormat:='@';
Excel.Columns[3].ColumnWidth:=14;
Excel.Columns[3].NumberFormat:='@';
Excel.Columns[4].ColumnWidth:=16;
Excel.Columns[4].NumberFormat:='#,###,##0.00';

Excel.Cells(1,2):=edRefmonth.Text+'³äֵδ³É¹¦¿Û¿îÃûµ¥ ';
Excel.Cells(2,1):='ÐòºÅ';
Excel.Cells(2,2):='¹¤ºÅ';
Excel.Cells(2,3):='ÐÕÃû';
Excel.Cells(2,4):='³äÖµ½ð¶î';

i:=3;
j:=3;
dAmt1:=0;
dAmt2:=0;
iCnt1:=0;
iCnt2:=0;

while not EOF(F) do
begin
sts.Panels[0].Text:='¶Á×ÊÁÏ ...';
Application.ProcessMessages;
Readln(F,s);

iPos:=Pos(#9,s);
sNo:=Copy(s,1,iPos-1);
s:=Copy(s,iPos+1,Length(s)-iPos);

s:= UnEncryptStr(s);
iPos:=Pos('%',s);
sStaffNo:=Copy(s,1,iPos-1);
s:=Copy(s,iPos+1,Length(s)-iPos);

iPos:=Pos('%',s);
sMoney:=Copy(s,iPos+1,Length(s)-iPos);
s:=Copy(s,1,iPos-1);

sts.Panels[0].Text:='ÅжÏ×ÊÁÏÊÇ·ñÒ»Ö ...';
Application.ProcessMessages;
qryPub.Close;
qryPub.SQL.Clear;
qryPub.SQL.Add('select paytranno from pay_hd where refmonth=:v1 and staffno=:v2');
qryPub.ParamByName('v1').asString:=edRefmonth.Text;
qryPub.ParamByName('v2').asString:=sStaffNo;
qryPub.Open;
if qryPub.EOF then
begin
sts.Panels[0].Text:='´¦Àí '+sStaffNo+'('+s+') ...';
Application.ProcessMessages;

Excel.WorkSheets[2].Activate;
Excel.Cells(j,1):=sNo;
Excel.Cells(j,2):=sStaffNo;
Excel.Cells(j,3):=s;
Excel.Cells(j,4):=sMoney;

Inc(j);
dAmt2:=dAmt2+StrToFloat(sMoney);
Inc(iCnt2);
end
else
begin
sts.Panels[0].Text:='´¦Àí '+sStaffNo+'('+s+') ...';
Application.ProcessMessages;

sPayNo:=qryPub.FieldByName('paytranno').asString;
qryPub.Close;
qryPub.SQL.Clear;
qryPub.SQL.Add('update pay_dl1 set payamt=:v1 where paytranno=:v2 and paycode=:v3');
qryPub.ParamByName('v1').asString:=sMoney;
qryPub.ParamByName('v2').asString:=sPayNo;
qryPub.ParamByName('v3').asString:=edCode.Text;
qryPub.ExecSQL;

qryPub.Close;
qryPub.SQL.Clear;
qryPub.SQL.Add('update pay_hd set adjust=adjust-:v1,netamt=netamt-:v1 where paytranno=:v2');
qryPub.ParamByName('v1').asFloat:=StrToFloat(sMoney);
qryPub.ParamByName('v2').asString:=sPayNo;
qryPub.ExecSQL;

Excel.WorkSheets[1].Activate;
Excel.Cells(i,1):=sNo;
Excel.Cells(i,2):=sStaffNo;
Excel.Cells(i,3):=s;
Excel.Cells(i,4):=sMoney;

dAmt1:=dAmt1+StrToFloat(sMoney);
Inc(iCnt1);

Inc(i);
end;

end;

if iCnt1>0 then
begin
Inc(i);
Inc(i);
Excel.WorkSheets[1].Activate;
Excel.Cells(i,1):='ºÏ¼Æ';
Excel.Cells(i,2):=IntToStr(iCnt1);
Excel.Cells(i,4):=FloatToStr(dAmt1);
end;

if iCnt2>0 then
begin
Inc(j);
Inc(j);
Excel.WorkSheets[2].Activate;
Excel.Cells(j,1):='ºÏ¼Æ';
Excel.Cells(j,2):=IntToStr(iCnt2);
Excel.Cells(j,4):=FloatToStr(dAmt2);
end;

Excel.WorkSheets[1].Activate;

Excel.ActiveWorkbook.SaveAs(sExcelName);
finally
Excel.ActiveWorkbook.Close;
Excel:=NULL;
end;
finally
CoUnInitialize;
end;
finally
CloseFile(F);
sts.Panels[0].Text:='Íê³É';
end;
Application.ProcessMessages;
if ckDel.Checked then
DeleteFile(sFileName);
end;
 
你可以试着采用Ehlib中,导出数据到Excel文件
又快又简单.(采用时流的方法)
对于你说的时间问题,你自己使用函数转换成字符串,就是啦.
 
没错!导入前转换为字符串格式即可!
 
好像DrExcelws.Range[R,R].Value2对应的是double型.将数据转换成字符串型后,把值赋给DrExcelws.Range[R,R].Value2会出错.说不能将字符串转换成double型
 
不好意思,我先前贴的代码是我在用的,这里再给出简化带注释的。

//进入COM环境
CoInitialize(nil);
try
//建立Excel
Excel:=CreateOleObject('Excel.Application');
try
//增加一个工作薄
Excel.Workbooks.Add;
//命名sheet
Excel.WorkSheets[1].Name:='测试';
//设定栏位属性,@字符型
Excel.Columns[1].ColumnWidth:=10;
Excel.Columns[1].NumberFormat:='@';
Excel.Columns[2].ColumnWidth:=14;
Excel.Columns[2].NumberFormat:='@';
Excel.Columns[3].ColumnWidth:=14;
Excel.Columns[3].NumberFormat:='@';
Excel.Columns[4].ColumnWidth:=16;
//数值型
Excel.Columns[4].NumberFormat:='#,###,##0.00';

//标题
Excel.Cells(1,2):='工资表';
//栏名
Excel.Cells(2,1):='姓名';
Excel.Cells(2,2):='工号';
Excel.Cells(2,3):='卡号';
Excel.Cells(2,4):='金额';

...
//写值
i:=3;
while ... do
begin
Excel.Cells(i,1):=sNo;
Excel.Cells(i,2):=sStaffNo;
Excel.Cells(i,3):=s;
Excel.Cells(i,4):=sMoney;

inc(i);
end

//保存文件
Excel.ActiveWorkbook.SaveAs(sExcelName);
finally
//关闭
Excel.ActiveWorkbook.Close;
Excel:=NULL;
end;
finally
//离开COM环境
CoUnInitialize;
end;
 
http://www5.skycn.com/soft/29751.html
这项技术可较好地解决你的问题
QQ:292044357
 
谢谢各位。问题已经解决。
 
多人接受答案了。
 
后退
顶部