300分求助输出到EXCEL报表问题(300分)

  • 主题发起人 主题发起人 timer_huang
  • 开始时间 开始时间
T

timer_huang

Unregistered / Unconfirmed
GUEST, unregistred user!
如何将数据库的内容输出到一个EXCEL的模板中?
要求:
因为数据库中的字段特别多(字段最多的表有1百多个字段)
不想逐个字段输入FieldbyName什么什么的。
可不可以直接在EXCEL中输入‘表名.字段名’来解决?如何解决?
每次只打印一条记录。
 
http://www.delphibbs.com/delphibbs/dispq.asp?lid=1549905
有“怎樣將dbgrid的數據導入到excel中? ”
 
BBS上有很多这样的资料,用循环不用考虑字段的数量的!除非Excel超容!
 
不是这样,我不是要将数据全部导出到EXCEL,
我是要导出到一个模板文件中,行列是不规则的。
也就是说,每个字段都有一个固定的位置,不可以随机摆放。
不可用循环方法。
 
那就只好一行一行的去實現啦
 
表示一个字段可以用table1.fieldbyname('field1').asstring(或as其它的类型);
也可以table1.fieldvalues['field1'];
还可以table1['field1'];//是不是很像‘表名.字段名’[:)]
// to 不想逐个字段输入FieldbyName什么什么的
//你可以这样:
j:=table1.fieldcount;
//table1指针移到要打印的记录行;
exceltable.open;
exceltable.insert;
for i:=0 to j-1do
begin
exceltable.fields.value:=table1.fields.value;
end;
//一百多个字段一句就都ok了
exceltable.post;
 
to JohnSun2002:
你不可以这样做,因为EXCEL的模板字段不同于Tabel1的字段。
再帮我重新想象。
 
//每个字段都有一个固定的位置,不可以随机摆放
//如果excel的字段名和table1的字段名相同是可以的,不必顺序一致
table1.insert;
for i:=0 to j-1do
begin
k:=0;
while table1.Fields[k].FieldName <> exceltable.Fields.FieldNamedo
begin
k:=k+1;
if k>j then
begin
showmessage(exceltable.Fields.FieldName+'列名找不到');
exit;
end;
end;
exceltable.Fields.Value:=table1.Fields[k].Value;

end;
table1.post;
 
又不按顺序,字段名称又不一样,那你就惨了,
一个字段一个字段的赋值吧;
两个表的字段不同顺序,字段名又不同,那就没有办法了啊
 
可惜,EXCEL的列名,不可能和Table字段同名
因为再EXCEL中是一种接近发票的排列形式,不是GRID式的排列
 
总共有7个表都是这样的情况,大家帮忙想一想
 
你想只把一条记录输出嘛,干吗输出到excel里去呢?
你可以用QReport做成一页纸的,然后用票据打印机打印就解决了,套打都可以;
我觉得你没必要导出到excel里去,因为你只是想定制好了显示“格式”就打印,
QReport可以满足你的任意排列“格式”了;
titleband里放 N 多 QRLabel,然后在程序中对QRLable.Caption赋值,preview。
 
客户要求输出到EXCEL
 
那么只能一个cell一个cell的赋值了,别无它法,工作量的问题而已,
加班吧, bye
 
F1Book1.Read pPathName, pFileType
F1Book1.Write pPathName, nSaveType
Part Type Description
pPathName String Name of the file to write. The name can include drive, path, and filename.
nSaveType Index Type of file to write. Following are the valid F1FileTypeConstants:
Constants Description
F1FileFormulaOne Formula One format
F1FileExcel4 Excel 4.0 format
F1FileTabbedText Tab-delimited text file
F1FileExcel5 Excel 5.0 format
F1FileFormulaOne3 Formula One v.3 format
F1FileTabbedTextValuesOnly Tab-delimited text file values only
 
哥们儿,我提个建议(使用F1BOOK)
这是DELPHI自己带的一个控件,类似于EXCEL,也是一个个的单元格
第一行第一列命令名TextRC[1,1],第一行第二列命名为TextRC[1,2]
可以这样 TextRC[1,2] := 你的内容。
比如:你有一张表名为Table1,可以这样:
var
intRow,intColumn :Integer;
begin
intRow := 1;
Table1.First;
while not Table.Eofdo
begin
for intColumn := 0 to Table1.FieldCount - 1do
begin
F1Book.TextRC[intRow,intColumn + 1] := Table1.Fields[intColumn].AsString;
end;
inc(intRow);
Table1.Next;
end;

这样你就是一个表有多少字段都不应该有问题了。
当需要将F1BOOK保存成*.XLS的文件时只需要这样:
F1Book.Write(文件名 :String,4);
只不过保存成EXCEL4。0格式的,这样不支持多个工作表。
我想这无所谓吧。
 
加入控件
ExcelApplication
ExcelWorksheet
ExcelWorkbook
有关操作查看有关书.
可提供有关资料
//////AdsData为表控件,sName为文件名,Title为任意字符
procedure WriteExcel(AdsData: TDataSet;
sName, Title: string);
var
ExcelApplication1: TExcelApplication;
ExcelWorksheet1: TExcelWorksheet;
ExcelWorkbook1: TExcelWorkbook;
i, j: integer;
//filename: string;
begin
//filename := concat(sName, '.xls');
try
ExcelApplication1 := TExcelApplication.Create(Application);
ExcelWorksheet1 := TExcelWorksheet.Create(Application);
ExcelWorkbook1 := TExcelWorkbook.Create(Application);
ExcelApplication1.Connect;
except
Application.Messagebox('Excel 没有安装!', '系统提示', MB_ICONERROR + mb_Ok);
Abort;
end;
try
Screen.Cursor := crSQLWait;
ExcelApplication1.Workbooks.Add(EmptyParam, 0);
ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks[1]);
ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Worksheets[1] as _worksheet);
AdsData.First;
for j := 0 to AdsData.Fields.Count - 1do
begin
ExcelWorksheet1.Cells.item[3, j + 1] := AdsData.Fields[j].DisplayLabel;
ExcelWorksheet1.Cells.item[3, j + 1].font.size := '10';
end;
for i := 4 to AdsData.RecordCount + 3do
begin
for j := 0 to AdsData.Fields.Count - 1do
begin
ExcelWorksheet1.Cells.item[i, j + 1] :=
AdsData.Fields[j].Asstring;
ExcelWorksheet1.Cells.item[i, j + 1].font.size := '10';
end;
AdsData.Next;
end;
ExcelWorksheet1.Columns.AutoFit;
ExcelWorksheet1.Cells.item[1, 2] := Title;
ExcelWorksheet1.Cells.Item[1, 2].font.size := '14';
ExcelWorksheet1.SaveAs(sName);
Application.Messagebox(pchar('数据成功导出' + sName), 'Hello',
mb_Ok);
finally
ExcelApplication1.Disconnect;
ExcelApplication1.Quit;
ExcelApplication1.Free;
ExcelWorksheet1.Free;
ExcelWorkbook1.Free;
Screen.Cursor := crDefault;
end;
end;
 
多谢各位问题解决了。
特别多谢JohnSun2002
 
多人接受答案了。
 
后退
顶部