delphi7 文件流方法保存数据库数据至EXCEL,乱码
delphi吧
全部回复
仅看楼主
level 1
如题,使用文件流方法保存数据库数据至EXCEL,使用EXCEL2010打开,汉字是乱码;使用EXCEL2003打开则正常。代码如下:
var
Form1: TForm1
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);
implementation
uses unit2,unit3,unit4,unit5;
{$R *.dfm}
Procedure ExportExcelFile(FileName: string; bWriteTitle: Boolean; aDataSet: TDataSet);
var
i,j: integer;
Col,row: word;
ABookMark: TBookMark;
aFileStream: TFileStream;
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
if FileExists(FileName) then
DeleteFile(FileName);
aFileStream := TFileStream.Create(FileName, fmCreate);
Try
aFileStream.WriteBuffer(arXlsBegin, SizeOf(arXlsBegin));
Col := 0; Row := 0;
if bWriteTitle then
begin
for i := 0 to aDataSet.FieldCount - 1 do
WriteStringCell(aDataSet.Fields[i].FieldName);
end;
aDataSet.DisableControls;
ABookMark := aDataSet.GetBookmark;
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)
else
WriteStringCell(aDataSet.Fields[i].AsString);
end;
aDataSet.Next;
end;
AFileStream.WriteBuffer(arXlsEnd, SizeOf(arXlsEnd));
if ADataSet.BookmarkValid(ABookMark) then
aDataSet.GotoBookmark(ABookMark);
finally
AFileStream.Free;
ADataSet.EnableControls;
end;
end;
2015年12月26日 02点12分 1
吧务
level 14
换个方式呗
2015年12月26日 02点12分 2
这个方法速度快
2015年12月26日 03点12分
level 4
数据库需要导出内容在DBGridEh显示然后在导出
应用 DBGridEhToExcel.pas
procedure Tfrmmain.btndcClick(Sender: TObject);
var
gridtoExcel:TDBGridEhToExcel;
begin
try
gridtoExcel:= TDBGridEhToExcel.Create(nil);
gridtoExcel.DBGridEh:=DBGridEh1;//数据所显示的DBGridEh
gridtoExcel.ExFilename:= '123';
gridtoExcel.TitleName:='123';
gridtoExcel.ShowProgress:=true;
gridtoExcel.ShowOpenExcel:=true;
gridtoExcel.ExportToExcel;
finally
gridtoExcel.Free;
end;
end;
2015年12月28日 07点12分 3
能否給個源代碼
2016年01月09日 04点01分
这个是eh自带的函数
2022年04月30日 11点04分
level 1
这个确实只能用Excel2003才能打开,超过Excel2007的版本都不行。
2019年03月20日 09点03分 6
level 4
在delphi的版本低了
2019年04月16日 12点04分 7
level 2
Delphi下数据库内容以文件流方式导出EXCEL(无汉字乱码!)
bbs.bccn.net/thread-508969-1-1.html
2022年04月30日 01点04分 9
1