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;