- procedure dbgridtoexcel(atitle: string; Adbgrid: Tdbgrid; Afontsize: integer = 9; Asum: boolean = true);
- var xlapp, xlsheet: variant;
- row, j, CCC, nnn: integer;
- bookmark: Tbookmark;
- nn_i, nn_f: array[0..100] of integer;
- function GetColumnCharacters(IntNumber: Integer): string;
- begin
- if IntNumber < 1 then
- Result := 'A'
- else
- begin
- if IntNumber > 702 then
- Result := 'ZZ'
- else
- begin
- if IntNumber > 26 then begin
- if (IntNumber mod 26) = 0 then
- Result := Chr(64 + (IntNumber div 26) - 1)
- else
- Result := Chr(64 + (IntNumber div 26));
- if (IntNumber mod 26) = 0 then
- result := result + chr(64 + 26)
- else
- result := Result + Chr(64 + (IntNumber mod 26));
- end
- else
- Result := Chr(64 + IntNumber);
- end;
- end;
- end;
- begin
- for j := 0 to 100 do begin nn_i[j] := 500; nn_f[j] := 500; end;
- if Adbgrid.datasource.dataset.IsEmpty then exit;
- showmessage('现在导出Excel表格,可能需要几分钟时间,请耐心等候...');
- try
- xlapp := createoleobject('excel.application');
- except
- showmessage('not found excel in your system, so can not create file!');
- exit;
- end;
- try
- screen.Cursor := crHourGlass;
- ccc := Adbgrid.Columns.Count;
- xlapp.workbooks.add; //添加新工作簿
- xlapp.visible := false;
- xlsheet := xlapp.activesheet;
- xlapp.activewindow.windowstate := 2;
- xlapp.range[xlsheet.cells[1, 1], xlsheet.cells[1, ccc]].MERGE;
- xlsheet.cells[1, 1].value := Atitle; //页头第一行;
- xlsheet.cells[1, 1].HorizontalAlignment := -4108;
- bookmark := Adbgrid.datasource.dataset.GetBookmark;
- try
- Adbgrid.datasource.dataset.DisableControls;
- Adbgrid.datasource.dataset.First;
- row := 2;
- for nnn := 1 to ccc do
- begin
- xlsheet.cells[row, nnn] := trim(Adbgrid.Columns[nnn - 1].title.caption);
- end;
- inc(row);
- while not Adbgrid.datasource.dataset.Eof do
- begin
- for nnn := 1 to ccc do
- begin
- if not Adbgrid.datasource.dataset.FieldByName(trim(adbgrid.Columns[nnn - 1].FieldName)).isnull then
- begin
- if Adbgrid.columns[nnn - 1].field.DataType in [ftwidestring, ftstring, ftmemo] then
- xlsheet.cells[row, nnn] := trim(Adbgrid.datasource.dataset.FieldByName(trim(adbgrid.Columns[nnn - 1].FieldName)).asstring)
- else
- if Adbgrid.columns[nnn - 1].field.DataType in [ftdate, ftdatetime] then
- xlsheet.cells[row, nnn] := Adbgrid.datasource.dataset.FieldByName(trim(adbgrid.Columns[nnn - 1].FieldName)).asdatetime
- else
- if Adbgrid.columns[nnn - 1].field.DataType in [ftinteger, ftSmallint, ftWord] then
- begin
- xlsheet.cells[row, nnn] := Adbgrid.datasource.dataset.FieldByName(trim(adbgrid.Columns[nnn - 1].FieldName)).asinteger;
- nn_i[nnn] := nnn - 1;
- end
- else
- if Adbgrid.columns[nnn - 1].field.DataType in [ftFloat, ftCurrency, ftBCD] then
- begin
- xlsheet.cells[row, nnn] := Adbgrid.datasource.dataset.FieldByName(trim(adbgrid.Columns[nnn - 1].FieldName)).asfloat;
- nn_f[nnn] := nnn - 1;
- end
- else
- xlsheet.cells[row, nnn] := Adbgrid.datasource.dataset.FieldByName(trim(adbgrid.Columns[nnn - 1].FieldName)).Value;
- end;
- end;
- xlsheet.rows[row].RowHeight := 18;
- inc(row);
- Adbgrid.datasource.dataset.Next;
- end;
- finally
- Adbgrid.datasource.dataset.GotoBookmark(bookmark);
- Adbgrid.datasource.dataset.FreeBookmark(bookmark);
- Adbgrid.datasource.dataset.EnableControls;
- end;
- xlapp.visible := true;
- //格式调整
- xlapp.range[xlsheet.cells[row, 1], xlsheet.cells[row, 13]].WrapText := True;
- xlapp.range[xlsheet.cells[row, 1], xlsheet.cells[row, 13]].HorizontalAlignment := -4108;
- xlsheet.pagesetup.headerMargin := 1 / 0.035; //页眉到顶端边距1cm
- xlsheet.pagesetup.footerMargin := 0.6 / 0.035; //页脚到底端边距1cm
- xlsheet.pagesetup.topMargin := 1 / 0.035; //顶边距1cm
- XLSHEET.pagesetup.bottomMargin := 1.3 / 0.035; //底边距1cm
- xlsheet.pagesetup.leftMargin := 0.5 / 0.035; //左边距1cm
- xlsheet.pagesetup.rightMargin := 0.5 / 0.035; //右边距1cm
- xlsheet.pagesetup.leftfooter := '制表: ';
- xlsheet.pagesetup.centerfooter := ''; //页脚
- xlsheet.pagesetup.rightfooter := '第&P页/共&N页';
- xlsheet.pagesetup.leftHeader := '';
- xlsheet.pagesetup.orientation := 1; //横向
- xlsheet.pagesetup.printtitlerows := '$1:$1';
- xlsheet.rows[1].font.name := '宋体'; //设置第一行字体属性
- xlsheet.rows[1].font.bold := true;
- xlsheet.rows[1].font.size := 20;
- xlsheet.rows[1].RowHeight := 28;
- for nnn := 1 to ccc do
- begin
- xlsheet.columns[nnn].columnwidth := Adbgrid.Columns[nnn - 1].Width * 0.1188;
- end;
- for nnn := 1 to 4 do begin
- xlapp.range[xlsheet.cells[2, 1], xlsheet.cells[row - 1, CCC]].borders[nnn].linestyle := 1;
- xlapp.range[xlsheet.cells[2, 1], xlsheet.cells[row - 1, CCC]].borders[nnn].weight := 1;
- end;
- if asum then
- begin
- inc(row);
- for nnn := 0 to CCC - 1 do
- if ((nnn = nn_i[nnn + 1]) or (nnn = nn_f[nnn + 1])) then
- XLSHEET.CELLS[row, nnn + 1].value := '=sum(' + GetColumnCharacters(nnn + 1) + '2:' + GetColumnCharacters(nnn + 1) + trim(inttostr(row - 1)) + ')';
- end;
- xlapp.range[xlsheet.cells[2, 1], xlsheet.cells[row - 1, CCC]].font.size := Afontsize;
- xlapp.range[xlsheet.cells[2, 1], xlsheet.cells[row - 1, ccc]].WrapText := True;
- varclear(xlsheet);
- varclear(xlapp);
- except
- on E: Exception do
- begin
- xlapp.quit;
- end;
- end;
- screen.Cursor := crDefault;
- end;
dbgridtoexcel
最新推荐文章于 2020-03-18 10:36:12 发布