导出时,先不要显示excel(MSExcel.Visible := False),结束时再显示(MSExcel.Visible := True;)
解决方案 »
- count use the same dataset for report.dataset and band.dateset
- 学习时,关于OnClick,OnKeyDown事件中参数的疑问.
- pchar和string有何不同啊
- delphi中的子窗体 能被限定在一个位置吗?能通过程序控制其大小吗?能动态控制其显示和隐藏吗?
- delphi+access问题????谢谢
- TreeView 的拷贝问题--在线等待
- 如何把DBgrid中的表示编辑状态的蓝色给去掉,只显示背景色。
- nt下面权限控制的问题
- 我想问问在深圳的朋友,深圳搞VB、ASP、DELPHI月薪多少?
- 兄弟想去大连华信,想问一下应聘的时候他们都问了什么?考了什么?
- delphi到底是什么?编程语言还是IDE?干什么用的?有没有中文版可下载?
- 请问下哪位大神用过个更改指定用户对文件夹权限的东东?
这种方式我试过,如果在导出过程中,打开另一个EXCEL,导出的这个EXCEL就会显示出来,而且也有可能会报错。
你是用的什么版本的Delphi和Excel??好像版本不同,出现的问题也不同。之前是用Delphi 7操作Excel,好像问题不多,而后来用Delphi 2010操作Excel,限制就多了。
这种方式我试过,如果在导出过程中,打开另一个EXCEL,导出的这个EXCEL就会显示出来,而且也有可能会报错。
那改用NativeExcel。这种效率更高,不是调用MS或WPS提供的COM服务,几万条几秒就搞定。需要显示时,再调用Com服务打开。
这种方式我试过,如果在导出过程中,打开另一个EXCEL,导出的这个EXCEL就会显示出来,而且也有可能会报错。
那改用NativeExcel。这种效率更高,不是调用MS或WPS提供的COM服务,几万条几秒就搞定。需要显示时,再调用Com服务打开。很感谢,我研究研究看,NativeExcel还不会用。
代码不长,主要是从数据库中读数据来显示,数据库中记录数比较多,所以花费时间比较长。function TMainfrm.DBGrid2Excel(ADO: TDataset; DBGrid: TDBGrid; Title: String; PrintHide: Boolean = False;PageSize: String = 'A4';Orientation: Integer = 1): Variant;
var
MSExcel: Variant;
i, j, Col: Integer;
ColName, Str: String;
begin
if (ADO.Active = False) or (ADO.RecordCount = 0) then
begin
Mainfrm.ShowCustWarning('劑豢ㄐㄐㄐㄐ', GetSysMessage(ADOLog, 'ERRO00000019', SelectLanguage), False);
Result := 0;
Abort;
end;
try
MSExcel := CreateOleObject('Excel.Application');
MSExcel.Caption := Title;
MSExcel.WorkBooks.Add;
MSExcel.Visible := True;
//MSExcel.ActiveSheet.Columns['R: R'].ColumnWidth := 10;
i := 1;
MSExcel.ActiveSheet.Cells[i, 1].Value := Title;
i := 3;
Col := 1;
for j := 0 to DBGrid.Columns.Count - 1 do
if (DBGrid.Columns[j].Visible = True) or (PrintHide) then
begin
MSExcel.ActiveSheet.Cells[i, Col].Value := DBGrid.Columns[j].Title.Caption;
Inc(Col);
end;
ColName := GetCol(Col-1); MSExcel.ActiveSheet.Range['a1', ColName + '1'].VerticalAlignment := xlCenter;
MSExcel.ActiveSheet.Range['a1', ColName + '1'].HorizontalAlignment := xlCenter;
MSExcel.ActiveSheet.Range['A1', ColName + '1'].MergeCells := True; i := i + 1;
Col := 1;
ADO.First;
while not ADO.Eof do
begin
for j := 0 to DBGrid.Columns.Count - 1 do
if (DBGrid.Columns[j].Visible = True) or (PrintHide) then
begin
if ADO.FieldByName(DBGrid.Columns[j].FieldName).DataType IN [ftFloat, ftAutoInc, ftInteger, ftCurrency, ftSmallint, ftBCD] then
MSExcel.ActiveSheet.Cells[i, Col].Value := Trim(ADO.FieldByName(DBGrid.Columns[j].FieldName).AsString)
else if ADO.FieldByName(DBGrid.Columns[j].FieldName).DataType IN [ftDateTime] then
begin
if ADO.FieldValues[DBGrid.Columns[j].FieldName] = Null then
MSExcel.ActiveSheet.Cells[i, Col].Value := Trim(ADO.FieldByName(DBGrid.Columns[j].FieldName).AsString)
else if FormatDateTime('yyyy/mm/dd', ADO.FieldByName(DBGrid.Columns[j].FieldName).AsDateTime) < '1901/01/01' then
MSExcel.ActiveSheet.Cells[i, Col].Value := FormatDateTime('hh:mm', ADO.FieldByName(DBGrid.Columns[j].FieldName).AsDateTime)
else
MSExcel.ActiveSheet.Cells[i, Col].Value := Trim(ADO.FieldByName(DBGrid.Columns[j].FieldName).AsString);
end
else
begin
MSExcel.ActiveSheet.Cells[i, Col].NumberFormatLocal := CellFormat;
MSExcel.ActiveSheet.Cells[i, Col].Value := Trim(ADO.FieldByName(DBGrid.Columns[j].FieldName).AsString);
end;
Inc(Col);
end;
Col := 1;
i := i + 1;
ADO.Next;
end;
//氝樓遺盄
Str := ColName + IntToStr(i - 1);
MSExcel.ActiveSheet.Range['a3', Str].HorizontalAlignment := xlCenter;
MSExcel.ActiveSheet.Range['a3', Str].VerticalAlignment := xlCenter;
//MSExcel.ActiveSheet.Range['a3', Str].WrapText := True;
MSExcel.ActiveSheet.Rows['3:3'].RowHeight := 30;
MSExcel.ActiveSheet.Rows['4' + ':' + IntToStr(i)].RowHeight := 26;
MSExcel.ActiveSheet.Range['a3', Str].Borders.LineStyle := xlContinuous;
MSExcel.ActiveSheet.Range['a3', Str].Borders.Weight := xlThin;
MSExcel.ActiveSheet.Range['a1', Str].Font.Size := 10;
MSExcel.ActiveSheet.Range['a1', Str].Font.Name := 'Times New Roman';
MSExcel.ActiveSheet.Range['a1', ColName + '1'].Font.Size := 14;
MSExcel.ActiveSheet.Range['a1', ColName + '1'].Font.Bold := True; MSExcel.ActiveSheet.Columns['A:' + ColName].EntireColumn.AutoFit; MSExcel.ActiveSheet.PageSetup.LeftMargin := 0.5 / 0.035; //扢离酘晚擒峈1CM, 1執脹衾0.035CM
MSExcel.ActiveSheet.PageSetup.RightMargin := 0.5 / 0.035; //扢离衵晚擒峈1CM, 1執脹衾0.035CM
MSExcel.ActiveSheet.PageSetup.TopMargin := 1.0 / 0.035; //扢离階晚擒峈1CM, 1執脹衾0.035CM
MSExcel.ActiveSheet.PageSetup.BottomMargin := 0.5 / 0.035;
MSExcel.ActiveSheet.PageSetup.FooterMargin := 0.5 / 0.035;
MSExcel.ActiveSheet.PageSetup.CenterFooter := '菴 &P 珜ㄛ僕 &N 珜';
if Orientation = 0 then
MSExcel.ActiveSheet.PageSetup.Orientation := xlPortrait;
if Orientation = 1 then
MSExcel.ActiveSheet.PageSetup.Orientation := xlLandscape;
MSExcel.ActiveSheet.PageSetup.PaperSize := xlPaperA4;
if UpperCase(PageSize) = 'A4' then
MSExcel.ActiveSheet.PageSetup.PaperSize := xlPaperA4;
if UpperCase(PageSize) = 'A3' then
MSExcel.ActiveSheet.PageSetup.PaperSize := xlPaperA3;
MSExcel.ActiveSheet.PageSetup.PrintTitleRows := '$1:$3';
MSExcel.ActiveWorkBook.Saved := True;
//MSExcel.Visible := True;
ADO.First;
Result := MSExcel;
except
on E: Exception do
begin
Mainfrm.ShowCustWarning('劑豢ㄐㄐㄐㄐ', E.Message, False);
MSExcel.ActiveWorkBook.Saved := True;
MSExcel.Visible := True;
MSExcel.Quit;
end;
end;
end;
MSExcel.ActiveSheet会受到用户操作的干扰
你是用的什么版本的Delphi和Excel??好像版本不同,出现的问题也不同。之前是用Delphi 7操作Excel,好像问题不多,而后来用Delphi 2010操作Excel,限制就多了。
也有可能,我是D7+Office2003环境,基本最稳定的组合