注册 | 登录
收藏 | 帮助
热门文章
编辑推荐
相关文章  
增强Web的安全性
增强Sendmail的抗DoS攻击能力
ROM-DOS启动盘(增强)下载
巧用Win32 API函数增强VB位操作功
文档定义类型(DTD)
新版PHP极大的增强功能和性能
您现在的位置: 顶尖设计 >> IT学院 >> 编程开发 >> Delphi >> 文章正文
增强型DBGrid2Excel-- 支持标题粗体,对齐格式与避免科学计算法
作者:dogbear2000  来源:csdn  点击:  更新:2006-12-19
简介:
unit dbgrid2excel;
{
功能描述:把DBGrid输出到Excel表格(支持多Sheet)
调用格式:DBGridToExcel([DBGrid1, DBGrid2]);
对于数字用AsString, 其它可能含有格式的文本用DisplayText
长数字字符 的Tag  C_LongNumber_FieldTag = 9; 避免科学计算格式,如身份证号的显示
自动采用对齐属性, 标题粗体

     
}
interface
uses
  classes, comctrls, stdctrls, windows, Dialogs, controls, SysUtils,
  Db,DBGrids,forms,ComObj,Variants;
const
  C_LongNumber_FieldTag = 9;
//这些不可运算文字可能含有格式
function MayHasFormatText(const AFieldType:TFieldType):Boolean;
procedure DBGridToExcel(Args: array of const);
implementation
function MayHasFormatText(const AFieldType:TFieldType):Boolean;
begin
  Result := AFieldType in
    [ftBoolean,  ftDate, ftTime, ftDateTime, ftTimeStamp,
     ftString,  ftFixedChar, ftWideString] ;
end;

{
功能描述:把DBGrid输出到Excel表格(支持多Sheet)
调用格式:DBGridToExcel([DBGrid1, DBGrid2]);
}
procedure DBGridToExcel(Args: array of const);
const
  xlHAlignCenter = -4108;
  xlHAlignLeft  = -4131;
  xlHAlignRight  = -4152;
var
  iCount, jCount: Integer;
  XLApp: Variant;
  Sheet: Variant;
  I: Integer;
  BK : TBookMark;
  DataSet:TDataSet;
  Col : TColumn;
  CellStr : string;
  GAL :TAlignment;
  EAL : Integer;

begin
  Screen.Cursor := crHourGlass;
  if not VarIsEmpty(XLApp) then
  begin
    XLApp.DisplayAlerts := False;
    XLApp.Quit;
    VarClear(XLApp);
  end;
  try
    XLApp := CreateOleObject('Excel.Application');
  except
    Screen.Cursor := crDefault;
    Exit;
  end;
  XLApp.WorkBooks.Add;
  XLApp.SheetsInNewWorkbook := High(Args) + 1;
  for I := Low(Args) to High(Args) do
  begin
    XLApp.WorkBooks[1].WorkSheets[I+1].Name := TDBGrid(Args[I].VObject).Name;
    Sheet := XLApp.Workbooks[1].WorkSheets[TDBGrid(Args[I].VObject).Name];
    if not TDBGrid(Args[I].VObject).DataSource.DataSet.Active then
    begin
      Screen.Cursor := crDefault;
      Exit;
    end;
    DataSet := TDBGrid(Args[I].VObject).DataSource.DataSet;
    DataSet.DisableControls;
    BK := DataSet.GetBookmark();
    DataSet.First;
    //标题
    for iCount := 0 to TDBGrid(Args[I].VObject).Columns.Count - 1 do
    begin
      Col := TDBGrid(Args[I].VObject).Columns.Items[iCount];
      Sheet.Cells[1, iCount + 1] := Col.Title.Caption;
      Sheet.Cells[1, iCount + 1].Font.Bold :=True ;//粗体
      GAL := Col.Alignment;
      if GAL = taLeftJustify then
        EAL := xlHAlignLeft
      else if GAL = taCenter then
        EAL := xlHAlignCenter
      else EAL := xlHAlignRight;
      //列数据对齐格式
      Sheet.Columns[iCount + 1].HorizontalAlignment := EAL ;
      //列标题对齐格式
      Sheet.Cells[1, iCount + 1].HorizontalAlignment := xlHAlignCenter;
      //自定义格式, 避免把长数字字符转换为科学记数法
      if Col.Field.Tag=C_LongNumber_FieldTag then
        Sheet.Columns[iCount + 1].NumberFormatLocal :='@';
    end;
    //数据
    jCount := 1;
    while not DataSet.Eof do
    begin
      for iCount := 0 to TDBGrid(Args[I].VObject).Columns.Count - 1 do
      begin
        Col := TDBGrid(Args[I].VObject).Columns.Items[iCount];
        if MayHasFormatText(Col.Field.DataType) then
          CellStr := Col.Field.DisplayText
        else
          CellStr:=  Col.Field.AsString;
        Sheet.Cells[jCount + 1, iCount + 1] := CellStr;
      end;
      Inc(jCount);
      DataSet.Next;
      Application.ProcessMessages;
    end;
    DataSet.GotoBookmark(BK);
    DataSet.FreeBookmark(BK);
    DataSet.EnableControls;
    XlApp.Visible := True; //用户关掉, 就可以关掉内存中的Excel试验通过2005.2.5
    Sheet := unAssigned;   //可以不要
  end;
  Screen.Cursor := crDefault;
end;

end.






  • 上一篇文章:
  • 下一篇文章:
  • 分享此文:该页面添加到 Mister Wong 添加到雅虎Yahoo!收藏 Add to:Del.icio.us Post to Furl Digg this 添加到Google书签 reddit spurl blogmarks 365Key 评论  收藏  分享  打印
     我来说两句
    姓名:       验证码:   
    主页: 
    评分: 1分 2分 3分 4分 5分
    本频道近期热评文章:
      关于我们 | 联系我们 | 站点地图 | 广告投放 | 友情链接 | 在线留言 | 版权申明
    版权所有 © 2004-2007 顶尖设计(bobd.cn)
    未经授权禁止转载,摘编,复制本站内容或建立镜像. 沪ICP备07504942号 
    网络110
    报警服务