Delphi xe8在fmx下如何导入导出Excel文件?

ooooh 2019-07-13 09:30:36
不是vcl下,fmx下没有office组件,如何实现操作呢
...全文
84 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
jitly 2022-03-23
  • 打赏
  • 举报
回复

用数据流导出,可用。导入还没用过。。。
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(FileName: string; bWriteTitle: Boolean; aDataSet: TQNDataSet);
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(Ansistring(AValue));
arXlsString[1] := 8 + L;
arXlsString[2] := Row;
arXlsString[3] := Col;
arXlsString[5] := L;
aFileStream.WriteBuffer(arXlsString, SizeOf(arXlsString));
aFileStream.WriteBuffer(Pointer(Ansistring(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(Pwidechar(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;

2,497

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 数据库相关
社区管理员
  • 数据库相关社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧