DBGridEh导出Excel出现"类range的方法PasteSpecial方法无效"的错误,请问是怎么回事?这种问题如何解决?
解决方案 »
- delphi实现分析数据,预测未来趋势功能
- delphi 有什么 "输入框" 控件 可以实现 背景 渐变色 效果 (图) !!!!!!!!!!!!! 急!!!!!!!!!!!!!!!!!
- 大家帮帮忙呀!
- dbradiogroup的问题
- 高分求打印问题
- C++和delphi中的对象(插件)调用,高手请进
- 咨询病房管理系统
- csdn好心人真多,无奈我太菜,现在又遇到了问题,关于运行期间如何创建表的
- 一起解读机械工业出版社的《Delphi5开发人员指南》
- 请谈谈你心目中的高手?
- 属性编辑器找不到DesignIntf.dcu
- 请教:从clientdataset保存到本地再上传到服务器数据库(MS server 2000 )问题,100分在线答谢!
procedure WriteDatasetToExcel(AQueryName: TQuery; xlsFileName: String);
var
EclApp,WorkBook : Variant;
I : Integer ;
column : Integer ;
Row : Integer ;
Fdate:TDateTime;
Year, Month, Day, Hour, Min, Sec, MSec: Word;
StrDate:String ;
StrDate1:String ;
Begin
Fdate:=now ;
DecodeDate(Fdate, Year, Month, Day);
DecodeTime(Fdate, Hour, Min, Sec, MSec);
StrDate:=formatdatetime('yyyy-mm-dd-hh-mm-ss',Fdate) ;
StrDate1:=formatdatetime('yyyy/mm/dd hh:mm:ss',Fdate) ;
Try
Begin
EclApp := CreateOleObject('Excel.Application');
WorkBook:=CreateOleObject('Excel.Sheet');
End
Except
MessageDlg('您的计算机上没有 Microsoft Excel!',mtWarning,[mbOK],0);
Exit;
end;
try
workBook:=EclApp.workBooks.Add ;
row:=2;
EclApp.Workbooks.Item[1].Activate;
eclApp.Cells.font.colorindex:=5 ;
EclApp.Activesheet.Cells(1,1):=xlsFileName ;
For I := 1 To AQueryName.FieldCount Do
EclApp.Activesheet.Cells(2,I):=AQueryName.Fields[I-1].FieldName ;
If Not AQueryName.Active Then AQueryName.Active := True ;
AQueryName.First ;
While Not(AQueryName.Eof) do
begin
column:=1;
for i:=1 to AQueryName.FieldCount do
begin
eclApp.Cells.Item[row+1,column]:=AQueryName.fields[i-1].AsString;
column:=column+1;
end;
AQueryName.Next;
row:=row+1;
End ;
WorkBook.saveas(xlsFileName);
WorkBook.close;
WorkBook:=eclApp.workBooks.Open(xlsFileName);
if MessageDlg('xlsFileName'+'对该文件是否保存?',mtConfirmation,[mbYes, mbNo], 0) = mrYes then
WorkBook.save
Else
workBook.Saved := True;
WorkBook.Close;
eclApp.Quit;
eclApp:=Unassigned;
MessageDlg('已成功保存到指定位置!',mtInformation,[mbOK],0);
except
MessageDlg('Excel文件保存失败!',mtWarning,[mbOK],0);
WorkBook.close;
eclApp.Quit; {释放VARIANT变量}
eclApp:=Unassigned;
end;
end;
你的这个导出函数不会出问题吗?
var ExpClass:TDBGridEhExportClass;
Ext:String;
begin
SaveDialog1.FileName := '';
if SaveDialog1.Execute then
begin
case SaveDialog1.FilterIndex of
1: begin ExpClass := TDBGridEhExportAsText; Ext := 'txt'; end;
2: begin ExpClass := TDBGridEhExportAsCSV; Ext := 'csv'; end;
3: begin ExpClass := TDBGridEhExportAsHTML; Ext := 'htm'; end;
4: begin ExpClass := TDBGridEhExportAsRTF; Ext := 'rtf'; end;
5: begin ExpClass := TDBGridEhExportAsXLS; Ext := 'xls'; end;
else
ExpClass := nil; Ext := '';
end;
if ExpClass <> nil then
begin
if UpperCase(Copy(SaveDialog1.FileName,Length(SaveDialog1.FileName)-2,3)) <>
UpperCase(Ext) then
SaveDialog1.FileName := SaveDialog1.FileName + '.' + Ext;
SaveDBGridEhToExportFile(ExpClass,dbgrideh1,
SaveDialog1.FileName,true);
end;
end;
要引用DBGridEHImpExp单元
或者用一個第三方控件即可
给的函数很好用,DBGRIDEH本身有导出功能干什么要自己写函数呢?
是这一行有问题,我不知道这一行代码具体有什么作用.
EclApp.ActiveSheet.Columns[36].NumberFormatLocal:='@';
http://community.csdn.net/Expert/topic/4353/4353721.xml?temp=.7865106
只有几句话!
希望这段代码对你有用!
procedure TfrmSaleExcel.WriteExcel(Ads: TADODataSet; sName, Title: string);
var
//声明一个excel程序对象
ExcelApplication1: TExcelApplication;
//声明一个excel工作簿对象
ExcelWorkbook1: TExcelWorkbook;
//声明一个excel工作表对象
ExcelWorksheet1: TExcelWorksheet;
//定义导出的excel文件名
filename: string;
i, j: integer;
begin
//将导出的excel文件名赋给filename变量
filename := concat(extractfilepath(application.exename), sName, '.xls');
try
//创建一个excel程序对象
ExcelApplication1 := TExcelApplication.Create(Application);
//创建一个excel工作簿对象
ExcelWorkbook1 := TExcelWorkbook.Create(Application);
//创建一个声明excel工作表对象
ExcelWorksheet1 := TExcelWorksheet.Create(Application);
//连接excel程序对象
ExcelApplication1.Connect;
except
Application.Messagebox('Excel没有安装','Hello',MB_ICONERROR + mb_Ok);
Exit;
end;
try
//在该Excel中增加一个新的工作簿
ExcelApplication1.Workbooks.Add(EmptyParam, 0);
//将ExcelWorkbook1对象与该空工作簿连接
ExcelWorkbook1.ConnectTo(ExcelApplication1.Workbooks[1]);
//将excelworksheet1对象与该工作簿的第一个表连接
ExcelWorksheet1.ConnectTo(ExcelWorkbook1.Worksheets[1] as _worksheet);
//取第一条数据集的记录
Ads.First;
//添加记录的各个字段名
for j := 0 to Ads.Fields.Count - 1 do
begin
ExcelWorksheet1.Cells.item[3, j + 1] := Ads.Fields[j].DisplayLabel;
ExcelWorksheet1.Cells.item[3, j + 1].font.size := '10';
end;
//在工作表中添加数据
for i := 4 to Ads.RecordCount + 3 do
begin
for j := 0 to Ads.Fields.Count - 1 do
begin
ExcelWorksheet1.Cells.item[i, j + 1] :=Ads.Fields[j].Asstring;
ExcelWorksheet1.Cells.item[i, j + 1].font.size :='10';
end;
Ads.Next;
end;
//调整单元格的宽度高度
ExcelWorksheet1.Columns.AutoFit;
//在工作表的第一行添加标题
ExcelWorksheet1.Cells.item[1, 2] := Title;
ExcelWorksheet1.Cells.Item[1, 2].font.size :='14';
//保存
ExcelWorksheet1.SaveAs(filename);
//显示
Application.Messagebox(pchar('导出成功'+filename),'Hello',mb_Ok);
finally
//断开Excel程序对象
ExcelApplication1.Disconnect;
//退出Excel程序对象
ExcelApplication1.Quit;
//释放Excel程序对象
ExcelApplication1.Free;
//释放表
ExcelWorksheet1.Free;
//释放簿
ExcelWorkbook1.Free;
end;
end;procedure TfrmSaleExcel.Button2Click(Sender: TObject);
begin
if (MessageDlg('导出数据?',MTWarning,[mbYes,MBNo],0)=MrYes) then
begin
Button2.Enabled:=False;
//导出前关闭ADOConnection2的连接
if ADOConnection2.Connected then
ADOConnection2.Close;
//调用writeexcel实现导入
WriteExcel(ADODataSet1,'SaleForm','出仓单报表');
Button2.Enabled:=True;
end;
end;
我觉得我已经写得够明白了,我自己的代码都没这么多注释,对了,你需要在程序前面定义一下那个私有过程,代码如下。
private
procedure WriteExcel(Ads: TADODataSet; sName, Title: string);
usesDBGridEhImpExp--
procedure TForm1.ppmSaveSelectionClick(Sender: TObject);
var ExpClass:TDBGridEhExportClass;
Ext:String;
begin
SaveDialog1.FileName := 'file1';
if (ActiveControl is TDBGridEh) then
if SaveDialog1.Execute then
begin
case SaveDialog1.FilterIndex of
1: begin ExpClass := TDBGridEhExportAsText; Ext := 'txt'; end;
2: begin ExpClass := TDBGridEhExportAsCSV; Ext := 'csv'; end;
3: begin ExpClass := TDBGridEhExportAsHTML; Ext := 'htm'; end;
4: begin ExpClass := TDBGridEhExportAsRTF; Ext := 'rtf'; end;
5: begin ExpClass := TDBGridEhExportAsXLS; Ext := 'xls'; end;
else
ExpClass := nil; Ext := '';
end;
if ExpClass <> nil then
begin
if UpperCase(Copy(SaveDialog1.FileName,Length(SaveDialog1.FileName)-2,3)) <>
UpperCase(Ext) then
SaveDialog1.FileName := SaveDialog1.FileName + '.' + Ext;
SaveDBGridEhToExportFile(ExpClass,TDBGridEh(ActiveControl),
SaveDialog1.FileName,False);
end;
end;
end;
谢谢了
谢谢了