• StringGrid数据导出到Excel


    1、控件:

      StringGrid1: TRzStringGrid;
      ADOConnection1: TADOConnection;
      ADOTable1: TADOTable;
      DataSource1: TDataSource;
      Button1: TButton;//导出数据
      Button2: TButton;//连接数据库
      Button3: TButton;//初始化列表

    2、双击连接数据库按钮:

     1   //使用之前先关闭
     2   ADOConnection1.Close;
     3   with ADOConnection1 do
     4   begin
     5     ConnectionString :='Provider=SQLOLEDB.1;Password=123;Persist Security Info=True;User ID=sa;Initial Catalog=Test_DBNAME;Data Source=127.0.0.1';
     6     try
     7       Connected := True;
     8       ShowMessage('数据库连接成功!');
     9     except
    10       ShowMessage('数据库连接失败!');
    11     end;
    12     //登录时不需要在输入密码了
    13     LoginPrompt := False;
    14   end;
    15   with ADOTable1 do
    16   begin
    17     //这三个顺序不能乱
    18     Connection := ADOConnection1;
    19     TableName := 'TableName';
    20     Active := True;
    21   end;  
    22   DataSource1.DataSet := ADOTable1;

    3、双击初始化列表按钮:

     1   //记得在此过程前声明i,j变量哦
     2   //初始划列表
     3   ADOTable1.First;
     4   StringGrid1.RowCount := ADOTable1.RecordCount + 1;
     5   StringGrid1.ColCount := ADOTable1.FieldCount + 1;
     6   for i := 0 to ADOTable1.RecordCount - 1 do
     7   begin
     8     for j := 0 to ADOTable1.FieldCount - 1 do
     9     begin
    10       StringGrid1.Cells[j + 1, 0] := ADOTable1.Fields.Fields[j].FieldName;
    11       StringGrid1.Cells[0, i + 1] := IntToStr(i + 1);
    12       if ADOTable1.Fields.Fields[j].Value = null then
    13         StringGrid1.Cells[j + 1, i + 1] := ''
    14       else
    15         StringGrid1.Cells[j + 1, i + 1] := ADOTable1.Fields.Fields[j].Value;
    16     end;
    17     ADOTable1.Next;
    18   end;
    19   StringGrid1.FixedCols := 0;

    4、新写一个导出数据的过程:

     1 //把他写成了一个过程,这样其他用到这个StringGrid的控件都可以刁永红这个来导出了
     2 procedure TForm6.ExportToExcel(RzStrGrid: TRzStringGrid);
     3 const
     4   xlNormal = -4143;
     5 var
     6   i, j, k, l: integer;
     7   filename: string;
     8   excel, Vrange: OleVariant;
     9   savedialog: tsavedialog;
    10 begin
    11   filename := '';
    12   if RzStrGrid.RowCount > 65536 then
    13   begin
    14     if application.messagebox('需要导出的数据过大,Excel最大只能容纳65536行,是否还要继续?', '询问', mb_yesno + mb_iconquestion) = idno then
    15       exit;
    16   end;
    17   screen.Cursor := crHourGlass;
    18 
    19   try
    20     excel := CreateOleObject('Excel.Application');
    21     excel.workbooks.add;
    22   except
    23     screen.cursor := crDefault;
    24     showmessage('无法调用Excel!');
    25     exit;
    26   end;
    27   savedialog := tsavedialog.Create(nil);
    28   savedialog.Filter := 'Excel文件(*.xls)|*.xls';
    29   if savedialog.Execute then
    30   begin
    31     if FileExists(savedialog.FileName) then
    32     try
    33       if application.messagebox('该文件已经存在,要覆盖吗?', '询问', mb_yesno + mb_iconquestion) = idyes then
    34         DeleteFile(PChar(savedialog.FileName))
    35       else
    36       begin
    37         excel.Quit;
    38         savedialog.free;
    39         screen.cursor := crDefault;
    40         Exit;
    41       end;
    42     except
    43       excel.Quit;
    44       savedialog.free;
    45       screen.cursor := crDefault;
    46       Exit;
    47     end;
    48     filename := savedialog.FileName;
    49   end;
    50   savedialog.free;
    51   if filename = '' then
    52   begin
    53     excel.Quit;
    54     screen.cursor := crDefault;
    55     exit;
    56   end;
    57   //设置字体
    58   excel.Cells.Font.Size := 10;
    59   //导出数据到Excel
    60   for i := 0 to RzStrGrid.RowCount - 1 do
    61   begin
    62     for j := 0 to RzStrGrid.ColCount - 1 do
    63     begin
    64       excel.Cells[i + 1, j + 1] := RzStrGrid.Cells[j, i];
    65     end;
    66   end;
    67   //设置列宽
    68   excel.ActiveSheet.Columns[3].ColumnWidth := 15;
    69   //需要合并的单元格
    70   Vrange := excel.range[excel.cells[RzStrGrid.RowCount + 1, 1], excel.cells[RzStrGrid.RowCount + 1, RzStrGrid.ColCount]];
    71   Vrange.Select;
    72   //合并单元格
    73   Vrange.Merge(True);
    74   //合并后单元格内容的字体大小
    75   Vrange.Font.Size := 15;
    76   Vrange.Font.Bold := True;
    77   //合并单元格后的背景色
    78   Vrange.Interior.ColorIndex := 6;
    79   //最后一行加一个注解
    80   excel.cells[RzStrGrid.RowCount + 1, 1] := '注意:导出Excel和上一篇文章导出的Excel模板一样,可以进行导入导出';
    81   //整页的文本全都居中
    82   excel.columns.HorizontalAlignment := 3;
    83   try
    84     //判断文件名后缀是不是.xls
    85     if copy(filename, length(filename) - 3, 4) <> '.xls' then
    86       filename := filename + '.xls';
    87     //保存Excel
    88     excel.ActiveWorkbook.SaveAs(filename, xlNormal, '', '', False, False);
    89   except
    90     excel.Quit;
    91     screen.cursor := crDefault;
    92     exit;
    93   end;
    94   excel.Visible := true;
    95   screen.cursor := crDefault;
    96 end;

    双击导入数据按钮,来调用导出StringGrid数据的过程:

    1 procedure TForm6.Button1Click(Sender: TObject);
    2 begin
    3   ExportToExcel(StringGrid1);
    4 end;

    好了,这样就可以了

  • 相关阅读:
    HashMap源码分析和应用实例的介绍
    Map不同具体实现类的比较和应用场景的分析
    Set集合架构和常用实现类的源码分析以及实例应用
    深入理解JVM(7)——类加载器
    深入理解JVM(5)——HotSpot垃圾收集器详解
    PoolManager 简单使用
    HDU4786_Fibonacci Tree
    UVA11653_Buses
    UVA11625_Lines of Containers
    HDU3507_Print Article
  • 原文地址:https://www.cnblogs.com/OSKnown/p/8946032.html
Copyright © 2020-2023  润新知