Delphi 控制/操作 Excel 方法 大全

  1. [size=3](一) 使用动态创建的方法
  2. 首先创建 Excel 对象,使用ComObj:
  3. var ExcelApp: Variant;
  4. ExcelApp := CreateOleObject( 'Excel.Application' );
  5. 1) 显示当前窗口:
  6. ExcelApp.Visible := True;
  7. 2) 更改 Excel 标题栏:
  8. ExcelApp.Caption := '应用程序调用 Microsoft Excel';
  9. 3) 添加新工作簿:
  10. ExcelApp.WorkBooks.Add;
  11. 4) 打开已存在的工作簿:
  12. ExcelApp.WorkBooks.Open( 'C:\Excel\Demo.xls' );
  13. 5) 设置第2个工作表为活动工作表:
  14. ExcelApp.WorkSheets[2].Activate;   或 ExcelApp.WorksSheets[ 'Sheet2' ].Activate;
  15. 6) 给单元格赋值:
  16. ExcelApp.Cells[1,4].Value := '第一行第四列';
  17. 7) 设置指定列的宽度(单位:字符个数),以第一列为例:
  18. ExcelApp.ActiveSheet.Columns[1].ColumnsWidth := 5;
  19. 8) 设置指定行的高度(单位:磅)(1磅=0.035厘米),以第二行为例:
  20. ExcelApp.ActiveSheet.Rows[2].RowHeight := 1/0.035; // 1厘米
  21. 9) 在第8行之前插入分页符:
  22. ExcelApp.WorkSheets[1].Rows.PageBreak := 1;
  23. 10) 在第8列之前删除分页符:ExcelApp.ActiveSheet.Columns[4].PageBreak := 0;
  24. 11) 指定边框线宽度:
  25. ExcelApp.ActiveSheet.Range[ 'B3:D4' ].Borders[2].Weight := 3;
  26. 1-左     2-右    3-顶     4-底    5-斜( \ )      6-斜( / )
  27. 12) 清除第一行第四列单元格公式:
  28. ExcelApp.ActiveSheet.Cells[1,4].ClearContents;
  29. 13) 设置第一行字体属性:ExcelApp.ActiveSheet.Rows[1].Font.Name := '隶书';
  30. ExcelApp.ActiveSheet.Rows[1].Font.Color   := clBlue;
  31. ExcelApp.ActiveSheet.Rows[1].Font.Bold    := True;
  32. ExcelApp.ActiveSheet.Rows[1].Font.UnderLine := True;
  33. 14) 进行页面设置:
  34. a.页眉:
  35.     ExcelApp.ActiveSheet.PageSetup.CenterHeader := '报表演示';
  36. b.页脚:
  37.     ExcelApp.ActiveSheet.PageSetup.CenterFooter := '第&P页';
  38. c.页眉到顶端边距2cm:
  39.     ExcelApp.ActiveSheet.PageSetup.HeaderMargin := 2/0.035;
  40. d.页脚到底端边距3cm:
  41.     ExcelApp.ActiveSheet.PageSetup.HeaderMargin := 3/0.035;
  42. e.顶边距2cm:
  43.     ExcelApp.ActiveSheet.PageSetup.TopMargin := 2/0.035;
  44. f.底边距2cm:
  45.     ExcelApp.ActiveSheet.PageSetup.BottomMargin := 2/0.035;
  46. g.左边距2cm:
  47.     ExcelApp.ActiveSheet.PageSetup.LeftMargin := 2/0.035;
  48. h.右边距2cm:
  49.     ExcelApp.ActiveSheet.PageSetup.RightMargin := 2/0.035;
  50. i.页面水平居中:
  51.     ExcelApp.ActiveSheet.PageSetup.CenterHorizontally := 2/0.035;
  52. j.页面垂直居中:
  53.     ExcelApp.ActiveSheet.PageSetup.CenterVertically := 2/0.035;
  54. k.打印单元格网线:
  55.     ExcelApp.ActiveSheet.PageSetup.PrintGridLines := True;
  56. 15) 拷贝操作:
  57. a.拷贝整个工作表:    ExcelApp.ActiveSheet.Used.Range.Copy;
  58. b.拷贝指定区域:    ExcelApp.ActiveSheet.Range[ 'A1:E2' ].Copy;
  59. c.从A1位置开始粘贴:    ExcelApp.ActiveSheet.Range.[ 'A1' ].PasteSpecial;
  60. d.从文件尾部开始粘贴:    ExcelApp.ActiveSheet.Range.PasteSpecial;
  61. 16) 插入一行或一列:
  62. a. ExcelApp.ActiveSheet.Rows[2].Insert;
  63. b. ExcelApp.ActiveSheet.Columns[1].Insert;
  64. 17) 删除一行或一列:
  65. a. ExcelApp.ActiveSheet.Rows[2].Delete;
  66. b. ExcelApp.ActiveSheet.Columns[1].Delete;
  67. 18) 打印预览工作表:
  68. ExcelApp.ActiveSheet.PrintPreview;
  69. 19) 打印输出工作表:
  70. ExcelApp.ActiveSheet.PrintOut;
  71. 20) 工作表保存:
  72. if not ExcelApp.ActiveWorkBook.Saved then
  73.    ExcelApp.ActiveSheet.PrintPreview;
  74. 21) 工作表另存为:
  75. ExcelApp.SaveAs( 'C:\Excel\Demo1.xls' );
  76. 22) 放弃存盘:
  77. ExcelApp.ActiveWorkBook.Saved := True;
  78. 23) 关闭工作簿:
  79. ExcelApp.WorkBooks.Close;
  80. 24) 退出 Excel:
  81. ExcelApp.Quit;
  82. (二) 使用Delphi 控件方法
  83. 在Form中分别放入ExcelApplication, ExcelWorkbook和ExcelWorksheet。
  84. 1)   打开Excel
  85. ExcelApplication1.Connect;
  86. 2) 显示当前窗口:
  87. ExcelApplication1.Visible[0]:=True;
  88. 3) 更改 Excel 标题栏:
  89. ExcelApplication1.Caption := '应用程序调用 Microsoft Excel';
  90. 4) 添加新工作簿:
  91. ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks.Add(EmptyParam,0));
  92. 5) 添加新工作表:
  93. var Temp_Worksheet: _WorkSheet;
  94. begin
  95. Temp_Worksheet:=ExcelWorkbook1.
  96. WorkSheets.Add(EmptyParam,EmptyParam,EmptyParam,EmptyParam,0) as _WorkSheet;
  97. ExcelWorkSheet1.ConnectTo(Temp_WorkSheet);End;
  98. 6) 打开已存在的工作簿:
  99. ExcelApplication1.Workbooks.Open (c:\a.xls
  100. EmptyParam,EmptyParam,EmptyParam,EmptyParam,
  101. EmptyParam,EmptyParam,EmptyParam,EmptyParam,
  102.     EmptyParam,EmptyParam,EmptyParam,EmptyParam,0)
  103. 7) 设置第2个工作表为活动工作表:
  104. ExcelApplication1.WorkSheets[2].Activate;   或
  105. ExcelApplication1.WorksSheets[ 'Sheet2' ].Activate;
  106. 8) 给单元格赋值:
  107. ExcelApplication1.Cells[1,4].Value := '第一行第四列';
  108. 9) 设置指定列的宽度(单位:字符个数),以第一列为例:
  109. ExcelApplication1.ActiveSheet.Columns[1].ColumnsWidth := 5;
  110. 10) 设置指定行的高度(单位:磅)(1磅=0.035厘米),以第二行为例:
  111. ExcelApplication1.ActiveSheet.Rows[2].RowHeight := 1/0.035; // 1厘米
  112. 11) 在第8行之前插入分页符:
  113. ExcelApplication1.WorkSheets[1].Rows.PageBreak := 1;
  114. 12) 在第8列之前删除分页符:
  115. ExcelApplication1.ActiveSheet.Columns[4].PageBreak := 0;
  116. 13) 指定边框线宽度:
  117. ExcelApplication1.ActiveSheet.Range[ 'B3:D4' ].Borders[2].Weight := 3;
  118. 1-左     2-右    3-顶     4-底    5-斜( \ )      6-斜( / )
  119. 14) 清除第一行第四列单元格公式:
  120. ExcelApplication1.ActiveSheet.Cells[1,4].ClearContents;
  121. 15) 设置第一行字体属性:
  122. ExcelApplication1.ActiveSheet.Rows[1].Font.Name := '隶书';
  123. ExcelApplication1.ActiveSheet.Rows[1].Font.Color   := clBlue;
  124. ExcelApplication1.ActiveSheet.Rows[1].Font.Bold    := True;
  125. ExcelApplication1.ActiveSheet.Rows[1].Font.UnderLine := True;
  126. 16) 进行页面设置:
  127. a.页眉:
  128.     ExcelApplication1.ActiveSheet.PageSetup.CenterHeader := '报表演示';
  129. b.页脚:
  130.     ExcelApplication1.ActiveSheet.PageSetup.CenterFooter := '第&P页';
  131. c.页眉到顶端边距2cm:
  132.     ExcelApplication1.ActiveSheet.PageSetup.HeaderMargin := 2/0.035;
  133. d.页脚到底端边距3cm:
  134.     ExcelApplication1.ActiveSheet.PageSetup.HeaderMargin := 3/0.035;
  135. e.顶边距2cm:
  136.     ExcelApplication1.ActiveSheet.PageSetup.TopMargin := 2/0.035;
  137. f.底边距2cm:
  138.     ExcelApplication1.ActiveSheet.PageSetup.BottomMargin := 2/0.035;
  139. g.左边距2cm:
  140.     ExcelApplication1.ActiveSheet.PageSetup.LeftMargin := 2/0.035;
  141. h.右边距2cm:
  142.     ExcelApplication1.ActiveSheet.PageSetup.RightMargin := 2/0.035;
  143. i.页面水平居中:
  144.     ExcelApplication1.ActiveSheet.PageSetup.CenterHorizontally := 2/0.035;
  145. j.页面垂直居中:
  146.     ExcelApplication1.ActiveSheet.PageSetup.CenterVertically := 2/0.035;
  147. k.打印单元格网线:
  148.     ExcelApplication1.ActiveSheet.PageSetup.PrintGridLines := True;
  149. 17) 拷贝操作:
  150. a.拷贝整个工作表:
  151.     ExcelApplication1.ActiveSheet.Used.Range.Copy;
  152. b.拷贝指定区域:
  153.     ExcelApplication1.ActiveSheet.Range[ 'A1:E2' ].Copy;
  154. c.从A1位置开始粘贴:
  155.     ExcelApplication1.ActiveSheet.Range.[ 'A1' ].PasteSpecial;
  156. d.从文件尾部开始粘贴:
  157.     ExcelApplication1.ActiveSheet.Range.PasteSpecial;
  158. 18) 插入一行或一列:
  159. a. ExcelApplication1.ActiveSheet.Rows[2].Insert;
  160. b. ExcelApplication1.ActiveSheet.Columns[1].Insert;
  161. 19) 删除一行或一列:
  162. a. ExcelApplication1.ActiveSheet.Rows[2].Delete;
  163. b. ExcelApplication1.ActiveSheet.Columns[1].Delete;
  164. 20) 打印预览工作表:
  165. ExcelApplication1.ActiveSheet.PrintPreview;
  166. 21) 打印输出工作表:
  167. ExcelApplication1.ActiveSheet.PrintOut;
  168. 22) 工作表保存:
  169. if not ExcelApplication1.ActiveWorkBook.Saved then
  170.    ExcelApplication1.ActiveSheet.PrintPreview;
  171. 23) 工作表另存为:
  172. ExcelApplication1.SaveAs( 'C:\Excel\Demo1.xls' );
  173. 24) 放弃存盘:
  174. ExcelApplication1.ActiveWorkBook.Saved := True;
  175. 25) 关闭工作簿:
  176. ExcelApplication1.WorkBooks.Close;
  177. 26) 退出 Excel:
  178. ExcelApplication1.Quit;
  179. ExcelApplication1.Disconnect;
  180. 本人 收藏[/size]
  181. [size=3]对不起我还需要一个锁定功能啊,就是输出到EXCEL后只能看,不能进行手工修改[/size]
  182. [size=3]Xl.Cells.Select;//Select All Cells
  183. Xl.Selection.Locked = True;// Lock Selected Cells[/size]
  184. [size=3]//Xl:=CreateOleObject('Excel.Application');[/size]
  185. [size=3][hr][/size]
  186. [size=3]procedure TForm1.BitBtn4Click(Sender: TObject);
  187. var
  188.    ExcelApp, Sheet: Variant;
  189. begin
  190.    if OpenDialog1.Execute then
  191.    begin
  192.      ExcelApp := CreateOleObject( 'Excel.Application' );
  193.      ExcelApp.Workbooks.Open(OpenDialog1.FileName);
  194.      Sheet     := ExcelApp.ActiveSheet;
  195.      Caption   := 'Row Count: ' + IntToStr(Sheet.UsedRange.Rows.Count);
  196.      ExcelApp.Quit;
  197.      Sheet     := Unassigned;
  198.      ExcelApp := Unassigned;
  199.    end;
  200. end;
  201. [/size]
  202. [size=3][hr][/size]
  203. [size=3]procedure CopyDbDataToExcel(Target: TDbgrid);
  204. var
  205.    iCount, jCount: Integer;
  206.    XLApp: Variant;
  207.    Sheet: Variant;
  208. begin
  209.    Screen.Cursor := crHourGlass;
  210.    if not VarIsEmpty(XLApp) then
  211.    begin
  212.      XLApp.DisplayAlerts := False;
  213.      XLApp.Quit;
  214.      VarClear(XLApp);
  215.    end;
  216.    //通过ole创建Excel对象
  217.    try
  218.      XLApp := CreateOleObject('Excel.Application');
  219.    except
  220.      Screen.Cursor := crDefault;
  221.      Exit;
  222.    end;
  223.    XLApp.WorkBooks.Add[XLWBatWorksheet];
  224.    XLApp.WorkBooks[1].WorkSheets[1].Name := '测试工作薄';
  225.    Sheet := XLApp.Workbooks[1].WorkSheets['测试工作薄'];
  226.    if not Target.DataSource.DataSet.Active then
  227.    begin
  228.       Screen.Cursor := crDefault;
  229.       Exit;
  230.    end;
  231.    Target.DataSource.DataSet.first;[/size]
  232. [size=3]   for iCount := 0 to Target.Columns.Count - 1 do
  233.    begin
  234.       Sheet.cells[1, iCount + 1] := Target.Columns.Items[iCount].Title.Caption;
  235.    end;
  236.    jCount := 1;
  237.    while not Target.DataSource.DataSet.Eof do
  238.    begin
  239.       for iCount := 0 to Target.Columns.Count - 1 do
  240.       begin
  241.         Sheet.cells[jCount + 1, iCount + 1] := Target.Columns.Items[iCount].Field.AsString;
  242.       end;
  243.       Inc(jCount);
  244.       Target.DataSource.DataSet.Next;
  245.    end;
  246.    XlApp.Visible := True;
  247.    Screen.Cursor := crDefault;
  248. end;[/size]
  249. [size=3]看看我的函数
  250. function ExportToExcel(Header: String;
  251.    vDataSet: TDataSet): Boolean;
  252. var
  253.    I,VL_I,j: integer;
  254.    S,SysPath: string;
  255.    MsExcel:Variant;
  256. begin
  257.    Result:=true;
  258.    if Application.MessageBox('您确信将数据导入到Excel吗?','提示!',MB_OKCANCEL + MB_DEFBUTTON1) = IDOK then
  259.    begin
  260.        SysPath:=ExtractFilePath(application.exename);
  261.        with TStringList.Create do
  262.        try
  263.          vDataSet.First ;
  264.          S:=S+Header;
  265.      //     system.Delete(s,1,1);
  266.          add(s);
  267.          s:=';
  268.          For I:=0 to vDataSet.fieldcount-1 do
  269.            begin
  270.              If vDataSet.fields[I].visible=true then
  271.                 S:=S+#9+vDataSet.fields[I].displaylabel;
  272.            end;
  273.          system.Delete(s,1,1);
  274.          add(s);
  275.          while not vDataSet.Eof do
  276.          begin
  277.            S := ';
  278.            for I := 0 to vDataSet.FieldCount -1 do
  279.              begin
  280.                If vDataSet.fields[I].visible=true then
  281.                   S := S + #9 + vDataSet.Fields[I].AsString;
  282.              end;
  283.            System.Delete(S, 1, 1);
  284.            Add(S);
  285.            vDataSet.Next;
  286.          end;
  287.          Try
  288.            SaveToFile(SysPath+'\Tem.xls');
  289.          Except
  290.            ShowMessage('写文件时发生保护性错误,Excel 如在运行,请先关闭!');
  291.            Result:=false;
  292.            exit;
  293.          end;
  294.        finally
  295.          Free;
  296.        end;
  297.        Try
  298.          MSExcel:=CreateOleObject('Excel.Application');
  299.        Except
  300.          ShowMessage('Excel 没有安装,请先安装!');
  301.          Result:=false;
  302.          exit;
  303.        end;
  304.        Try
  305.          MSExcel.workbooks.open(SysPath+'\Tem.xls');
  306.        Except
  307.          ShowMessage('打开临时文件时出错,请检查'+SysPath+'\Tem.xls');
  308.          Result:=false;
  309.          exit;
  310.        end;
  311.          MSExcel.visible:=True;
  312.          for VL_I :=1 to 4 do
  313.          MSExcel.Selection.Borders[VL_I].LineStyle := 0;
  314.          MSExcel.cells.select;
  315.          MSExcel.Selection.HorizontalAlignment :=3;
  316.          MSExcel.Selection.Borders[1].LineStyle := 0;[/size]
  317. [size=3]       MSExcel.Range['A1'].Select;
  318.        MSExcel.Selection.Font.Size :=24;[/size]
  319. [size=3]       J:=0 ;
  320.        for i:=0 to vdataset.fieldcount-1 do
  321.            if vDataSet.fields[I].visible   then
  322.               J:=J+1;[/size]
  323. [size=3]       VL_I :=J;
  324.        MSExcel.Range['A1:'+F_ColumnName(VL_I)+'1'].Select;
  325.        MSExcel.Range['A1:'+F_ColumnName(VL_I)+'1'].Merge;
  326.    end
  327.    else
  328.      Result:=false;
  329. end;[/size]
posted @ 2010-03-04 10:13  Talo  阅读(1279)  评论(0)    收藏  举报