Unigui的TUniDBGrid导出到Excel


ehr,wms,mes,两化融合贯标

http://360mes.cn
http://www.360mes.cn
http://ks.360mes.cn
http://tc.360mes.cn
http://cs.360mes.cn
http://jy.360mes.cn
http://sz.360mes.cn
http://tc.360mes.cn
http://ha.360mes.cn
http://ls.360mes.cn

TUniDBGrid自带的导出功能,如果grid进行了分页,只能导出当前显示的页的内容。本文利用Tms FlexCel,可以导出整个grid的内容,与是否分页没有关系http://ehr.kopsoft.cn?url=TUniFrame_hr_User

1,利用tms 的FlexCel

2,调用方法UniSession.SendFile(a.DataSetToXls(undbgrd_user,'人员明细'),'人员明细.xls');

3,主要功能:导出Excel,加入Excel的标题,根据grid的标题为excel增加首行标题,设置自动适应列宽,首列增加为序号列

 免费人力资源管理软件,免费Mes系统,免费仓库管理软件WMS

function TUnit_DataExport.DataSetToXls(DbGrid:TUniDBGrid;Tile:string): string;
var
xls: TXlsFile;
Row: integer;
Fmt: TFlxFormat;
DateXF, DateTimeXF,FontSizeTitleXF,FontSizeDataXF,FontSizePageTitleXF: integer;
file_name: string;
ds: TDataSet;
Alignment:THFlxAlignment;
ColExcel,ColDbgrid:Integer;
begin
ds:=DbGrid.DataSource.DataSet;

xls := TXlsFile.Create(1, TExcelFileFormat.v2003, true);
try
//excel标题格式
Fmt := xls.GetDefaultFormat;
Fmt.Font.Size20:=280;
Fmt.Font.Style:=[TFlxFontStyles.Bold];
Fmt.HAlignment:=THFlxAlignment.center;
FontSizeTitleXF := xls.AddFormat(Fmt);


//excel页标题格式
Fmt := xls.GetDefaultFormat;
Fmt.Font.Size20 :=360;
Fmt.Font.Style:=[TFlxFontStyles.Bold];
Fmt.HAlignment:=THFlxAlignment.center;
FontSizePageTitleXF := xls.AddFormat(Fmt);


xls.SheetName:=Tile;

//第一行进行合并,作为页面标题
xls.MergeCells(1,1,1,DbGrid.Columns.Count+1);
xls.SetCellValue(1, 1, Tile,FontSizePageTitleXF);

//Now loop over all records and send them to the file.
ds.First;
Row := 2;

xls.SetCellValue(Row, 1, '序号',FontSizeTitleXF);
xls.SetColWidthInternal(ColExcel,40);

//第二行根据grid标题写入excel标题
for ColDbgrid := 0 to DbGrid.Columns.Count-1 do
begin
ColExcel:=ColDbgrid+2;
xls.SetCellValue(Row, ColExcel, DbGrid.Columns.Items[ColDbgrid].Title.Caption,FontSizeTitleXF);
xls.SetColWidthInternal(ColExcel,DbGrid.Columns.Items[ColDbgrid].Width*35);
end;

//第三行开始数据写入
Row := 3;
while not ds.Eof do
begin
for ColDbgrid := 0 to DbGrid.Columns.Count-1 do
begin

//获取grid的对齐方式
if DbGrid.Columns[ColDbgrid].Alignment=TAlignment.taLeftJustify then
Alignment:=THFlxAlignment.left
else if DbGrid.Columns[ColDbgrid].Alignment=TAlignment.taCenter then
Alignment:=THFlxAlignment.center
else if DbGrid.Columns[ColDbgrid].Alignment=TAlignment.taRightJustify then
Alignment:=THFlxAlignment.right
else
Alignment:=THFlxAlignment.center;


//设置日期、普通数据的单元格格式
//长日期格式
Fmt := xls.GetDefaultFormat;
Fmt.Format := 'yyyy-mm-dd hh:MM:ss';
Fmt.Font.Size20:=240;
Fmt.HAlignment:=Alignment;
DateTimeXF := xls.AddFormat(Fmt);

//短日期格式
Fmt := xls.GetDefaultFormat;
Fmt.Format := 'yyyy-mm-dd';
Fmt.Font.Size20:=240;
Fmt.HAlignment:=Alignment;
DateXF := xls.AddFormat(Fmt);


//excel数据格式
Fmt := xls.GetDefaultFormat;
Fmt.Font.Size20 :=240;
Fmt.HAlignment:=Alignment;
FontSizeDataXF := xls.AddFormat(Fmt);

//第一列写入序号
if ColDbgrid=0 then
begin
//excel数据格式
Fmt := xls.GetDefaultFormat;
Fmt.Font.Size20 :=240;
Fmt.HAlignment:=THFlxAlignment.center;

xls.SetCellValue(Row, 1, (row-2),xls.AddFormat(Fmt));
end;


//从exce第二列开始写入数据(第一列被手动写入了序号)
ColExcel:=ColDbgrid+2;
//grid列没有绑定字段的,则该列写入空字符
if ds.FieldList.IndexOf(DbGrid.Columns.Items[ColDbgrid].FieldName)=-1 then
begin
xls.SetCellValue(Row, ColExcel, '',FontSizeDataXF);

Continue;
end;

//根据字段的三种类型进行设置,长时间格式,短时间格式,其他格式,写入数据
case ds.FieldByName(DbGrid.Columns.Items[ColDbgrid].FieldName).DataType of
TFieldType.ftDateTime:
begin
if ds.FieldByName(DbGrid.Columns.Items[ColDbgrid].FieldName).IsNull then
xls.SetCellValue(Row, ColExcel, '')
else
xls.SetCellValue(Row, ColExcel, ds.FieldByName(DbGrid.Columns.Items[ColDbgrid].FieldName).AsDateTime, DateTimeXF);

xls.SetColWidthInternal(ColExcel,DbGrid.Columns.Items[ColDbgrid].Width*50);
end;

TFieldType.ftDate:
begin
if ds.FieldByName(DbGrid.Columns.Items[ColDbgrid].FieldName).IsNull then
xls.SetCellValue(Row, ColExcel, '')
else
xls.SetCellValue(Row, ColExcel, ds.FieldByName(DbGrid.Columns.Items[ColDbgrid].FieldName).AsDateTime, DateXF);

xls.SetColWidthInternal(ColExcel,DbGrid.Columns.Items[ColDbgrid].Width*50);
end;

else
begin
xls.SetCellValue(Row, ColExcel, ds.FieldByName(DbGrid.Columns.Items[ColDbgrid].FieldName).Value,FontSizeDataXF);
end;
end;

end;

ds.Next;

Inc(Row);
end;
//写入公式
//xls.SetCellValue(row+1,1,xls.RecalcExpression('=Sum(A3:A'+IntToStr(row)+')',False),FontSizePageTitleXF);

//设置各列的自动最佳列宽
xls.AutofitCol(1,DbGrid.Columns.Count+1,False,1.2);

file_name:='temp\'+formatdatetime('yyyymmddhhMMss',now())+'.xls';
xls.Save(file_name);
Result:=file_name;
finally
xls.Free;
end;


end;


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM