最近编了一个小软件,需要将Stringgrid中的内容导出到Excel中。
由于使用的是Delphi2010 + Office2010,中间有点小曲折,现把代码贴出来,供参考。
代码
procedure TFormMain.btn3Click(Sender: TObject);
var
ExcelApp,workbook,sheet:Variant;
begin
dlgSavedlg1.Filter := 'Excel2007格式文件|*.xlsx|Excel2003格式文件|*.xls';
ExcelApp:=UnAssigned();
ExcelApp := CreateOleObject('Excel.application'); (* 创建一个Excel的OLE对象,使用OLE去创建Excel文件时,需要uses ComObj *)
workbook := ExcelApp.WorkBooks.Add; (* 创建一个WorkBook *)
Sheet := ExcelApp.Sheets[1]; (* 创建一个Sheet变量 *)
for i := 0 to 21 do
begin
Sheet.cells[i+1,1].value := strngrd1.Cells[1,i]; (* 将Delphi的Stringgrid中的内容保存到Excel的Sheet中去 *)
Sheet.cells[i+1,2].value := strngrd1.Cells[2,i];
Sheet.cells[i+1,3].value := strngrd1.Cells[3,i];
end;
(*ExcelApp.Visible := True;*) (* 将这句话取消注释,就会弹出Excel *)
(*ExcelApp.ActiveSheet.Rows[2].RowHeight := 1/0.035;*) (* 这就话可以设置行高 *)
ExcelApp.ActiveSheet.Columns[1].Columnwidth := 20; (* 设置列宽,网上的很多资料都把Columnwidth 写成了 ColumnsWidth,多写了一个s,误导了很多人 *)
ExcelApp.ActiveSheet.Columns[2].Columnwidth := 20;
ExcelApp.ActiveSheet.Columns[3].Columnwidth := 20;
if dlgSavedlg1.Execute then (* 如果点击了保存对话框的"保存"按键的话,将当前活动的Workbook保存到SaveDialog指定的位置 *)
begin
ExcelApp.ActiveWorkbook.saveas(dlgSavedlg1.FileName);
end
else (* 如果点击了保存对话框的"取消"按键的话,放弃存盘,这句话一定要加上,否则,在点击"取消"按键时,会出现问题 *)
ExcelApp.ActiveWorkBook.Saved := True;
workbook.Close; (* 最后,将WorkSheet关闭 *)
ExcelApp.quit; (* 退出ExcelApp *)
ExcelApp := unassigned; (* 使用unassigned时,要uses Variants *)
end;
(* 由于使用创建OLE对象的方法去创建Excel时,是使用的您电脑上安装的Excel,因此,生成的文件的格式和您电脑上安装的Excel的版本有关系。
比如:我的电脑上安装的是office2010,如果将Excel文件保存为xls格式,在打开时就会出错。(血的教训啊...害的俺浪费了好几个小时...)
*)