Excel导出的文件只有office的excel打开能看到数据内容,永中,wps等其他软件的打开都显示不了数据???不知何解?以下是我的导出代码:
var
arXlsBegin: array[0..5] of Word = ($809, 8, 0, $10, 0, 0);
arXlsEnd: array[0..1] of Word = ($0A, 00);
arXlsString: array[0..5] of Word = ($204, 0, 0, 0, 0, 0);
arXlsNumber: array[0..4] of Word = ($203, 14, 0, 0, 0);
arXlsInteger: array[0..4] of Word = ($27E, 10, 0, 0, 0);
arXlsBlank: array[0..4] of Word = ($201, 6, 0, 0, $17);Procedure ExportExcelFile(aDataSet: TDataSet);
var
i,j:integer;
col, row: word;
aBookMark: TBookMark;
aFileStream: TFileStream;
savedialog1:tsavedialog;
filename:string;
procedure incColRow; //增加行列号
begin
if Col=ADataSet.FieldCount - 1 then
begin
Inc(Row);
Col :=0;
end
else
Inc(Col);
end;procedure WriteStringCell(AValue: string);//写字符串数据
var
L:Word;
begin
L:= Length(AValue);
arXlsString[1] := 8 + L;
arXlsString[2] := Row;
arXlsString[3] := Col;
arXlsString[5] := L;
aFileStream.WriteBuffer(arXlsString, SizeOf(arXlsString));
aFileStream.WriteBuffer(Pointer(AValue)^, L);
IncColRow;
end;procedure WriteIntegerCell(AValue: integer);//写整数
var
v:Integer;
begin
arXlsInteger[2]:=Row;
arXlsInteger[3] := Col;
aFileStream.WriteBuffer(arXlsInteger, SizeOf(arXlsInteger));
V := (AValue shl 2) or 2;
aFileStream.WriteBuffer(V, 4);
IncColRow;
end;
procedure WriteFloatCell(AValue: double);//写浮点数
begin
arXlsNumber[2] := Row;
arXlsNumber[3] := Col;
aFileStream.WriteBuffer(arXlsNumber, SizeOf(arXlsNumber));
aFileStream.WriteBuffer(AValue, 8);
IncColRow;
end;begin
savedialog1:=tsavedialog.Create(nil);
if savedialog1.Execute then
if sysutils.FileExists(savedialog1.FileName) then
begin
if application.MessageBox('文件已存在,替换?','提示',mb_yesno+mb_defbutton1+mb_iconquestion+mb_systemmodal)=idyes then
begin
if aDataSet.Active=false then
begin
application.MessageBox('当前数据表未打开,操作被中止','警告',MB_ICONINFORMATION);
exit;
end;
if aDataSet.IsEmpty then
begin
application.MessageBox('当前数据表未打开,操作被中止','警告',MB_ICONINFORMATION);
exit;
end;
if sysutils.DeleteFile(savedialog1.FileName)=false then
begin
showmessage(savedialog1.FileName+'文件正在使用,无法替换.'+chr(13)+chr(10)+'请关闭excel 文件:'+savedialog1.FileName+'.在重新导入。');
exit;
end;
end;
end;
filename:=savedialog1.FileName;
if filename='' then
exit
else
begin
if rightstr(FileName,4)<>'.xls' then
filename:=filename+'.xls';
end;
aFileStream := TFileStream.Create(FileName, fmCreate);
Try
//写文件头
aFileStream.WriteBuffer(arXlsBegin, SizeOf(arXlsBegin));
//写列头
Col := 0; Row := 0;
for i := 0 to aDataSet.FieldCount - 1 do
WriteStringCell(aDataSet.Fields[i].FieldName);
//写数据集中的数据
aDataSet.DisableControls;
ABookMark := aDataSet.GetBook;
aDataSet.First;
while not aDataSet.Eof do
begin
for i := 0 to aDataSet.FieldCount - 1 do
case ADataSet.Fields[i].DataType of
ftSmallint, ftInteger, ftWord, ftAutoInc, ftBytes:
WriteIntegerCell(aDataSet.Fields[i].AsInteger);
ftFloat, ftCurrency, ftBCD:WriteFloatCell(aDataSet.Fields[i].AsFloat);
ftBlob,ftGraphic:WriteStringCell('图片无法显示');
else
WriteStringCell(aDataSet.Fields[i].AsString);
end;
aDataSet.Next;
end;
//写文件尾
AFileStream.WriteBuffer(arXlsEnd, SizeOf(arXlsEnd));
if ADataSet.BookValid(ABookMark) then aDataSet.GotoBook(ABookMark);
Finally
AFileStream.Free;
ADataSet.EnableControls;
showmessage('文件已成功保存'+'文件位置 : '+filename);
end;
end;
var
arXlsBegin: array[0..5] of Word = ($809, 8, 0, $10, 0, 0);
arXlsEnd: array[0..1] of Word = ($0A, 00);
arXlsString: array[0..5] of Word = ($204, 0, 0, 0, 0, 0);
arXlsNumber: array[0..4] of Word = ($203, 14, 0, 0, 0);
arXlsInteger: array[0..4] of Word = ($27E, 10, 0, 0, 0);
arXlsBlank: array[0..4] of Word = ($201, 6, 0, 0, $17);Procedure ExportExcelFile(aDataSet: TDataSet);
var
i,j:integer;
col, row: word;
aBookMark: TBookMark;
aFileStream: TFileStream;
savedialog1:tsavedialog;
filename:string;
procedure incColRow; //增加行列号
begin
if Col=ADataSet.FieldCount - 1 then
begin
Inc(Row);
Col :=0;
end
else
Inc(Col);
end;procedure WriteStringCell(AValue: string);//写字符串数据
var
L:Word;
begin
L:= Length(AValue);
arXlsString[1] := 8 + L;
arXlsString[2] := Row;
arXlsString[3] := Col;
arXlsString[5] := L;
aFileStream.WriteBuffer(arXlsString, SizeOf(arXlsString));
aFileStream.WriteBuffer(Pointer(AValue)^, L);
IncColRow;
end;procedure WriteIntegerCell(AValue: integer);//写整数
var
v:Integer;
begin
arXlsInteger[2]:=Row;
arXlsInteger[3] := Col;
aFileStream.WriteBuffer(arXlsInteger, SizeOf(arXlsInteger));
V := (AValue shl 2) or 2;
aFileStream.WriteBuffer(V, 4);
IncColRow;
end;
procedure WriteFloatCell(AValue: double);//写浮点数
begin
arXlsNumber[2] := Row;
arXlsNumber[3] := Col;
aFileStream.WriteBuffer(arXlsNumber, SizeOf(arXlsNumber));
aFileStream.WriteBuffer(AValue, 8);
IncColRow;
end;begin
savedialog1:=tsavedialog.Create(nil);
if savedialog1.Execute then
if sysutils.FileExists(savedialog1.FileName) then
begin
if application.MessageBox('文件已存在,替换?','提示',mb_yesno+mb_defbutton1+mb_iconquestion+mb_systemmodal)=idyes then
begin
if aDataSet.Active=false then
begin
application.MessageBox('当前数据表未打开,操作被中止','警告',MB_ICONINFORMATION);
exit;
end;
if aDataSet.IsEmpty then
begin
application.MessageBox('当前数据表未打开,操作被中止','警告',MB_ICONINFORMATION);
exit;
end;
if sysutils.DeleteFile(savedialog1.FileName)=false then
begin
showmessage(savedialog1.FileName+'文件正在使用,无法替换.'+chr(13)+chr(10)+'请关闭excel 文件:'+savedialog1.FileName+'.在重新导入。');
exit;
end;
end;
end;
filename:=savedialog1.FileName;
if filename='' then
exit
else
begin
if rightstr(FileName,4)<>'.xls' then
filename:=filename+'.xls';
end;
aFileStream := TFileStream.Create(FileName, fmCreate);
Try
//写文件头
aFileStream.WriteBuffer(arXlsBegin, SizeOf(arXlsBegin));
//写列头
Col := 0; Row := 0;
for i := 0 to aDataSet.FieldCount - 1 do
WriteStringCell(aDataSet.Fields[i].FieldName);
//写数据集中的数据
aDataSet.DisableControls;
ABookMark := aDataSet.GetBook;
aDataSet.First;
while not aDataSet.Eof do
begin
for i := 0 to aDataSet.FieldCount - 1 do
case ADataSet.Fields[i].DataType of
ftSmallint, ftInteger, ftWord, ftAutoInc, ftBytes:
WriteIntegerCell(aDataSet.Fields[i].AsInteger);
ftFloat, ftCurrency, ftBCD:WriteFloatCell(aDataSet.Fields[i].AsFloat);
ftBlob,ftGraphic:WriteStringCell('图片无法显示');
else
WriteStringCell(aDataSet.Fields[i].AsString);
end;
aDataSet.Next;
end;
//写文件尾
AFileStream.WriteBuffer(arXlsEnd, SizeOf(arXlsEnd));
if ADataSet.BookValid(ABookMark) then aDataSet.GotoBook(ABookMark);
Finally
AFileStream.Free;
ADataSet.EnableControls;
showmessage('文件已成功保存'+'文件位置 : '+filename);
end;
end;
===========================================
请问楼主:你不用导出的excel,而是直接用office-excel编辑一个电子表格,保存后看用wps能打开吗?呵呵