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;