開發工具:delphi7+SQL2000
從系統匯出的EXCEL檔案無法用exce2010打開:
用DBGRIDEh控制元件直接匯出一個excel檔案,發現無法用excel2010打開,一打開報錯:
‘Microsoft Excel 遇到問題需要關閉。我們對此引起的不便表示抱歉’。
2. 若是不用DBGRIDEh控制元件,用delphi自帶控制元件一行一行的往Excel寫資料,也沒有問題。
之前用的是Excel2003沒有問題,裝了2010后就出現了上面的狀況。
若是轉出的EXCEL檔案先用2003打開,再另存,然后在用2010打開,又是可以的。
上網查了查說是版本的問題,按道理excel版本是向下兼容的,不應該出現這樣的情況。
請問,誰也遇到過這樣的情況,有沒有解決辦法?
uj5u.com熱心網友回復:
建議匯出為CSV檔案,我以前也碰過uj5u.com熱心網友回復:
有些報表轉出后,還會設定公式什么的,保存為CSV檔案不行。
這些報錯也出現在匯入程序,用戶都是直接在EXCEL檔案中作業,然后匯入系統,讓他們另存為CSV格式再匯入估計也不現實。
uj5u.com熱心網友回復:
可能是匯出的檔案不完整。不知你是用控制元件,或是使用D7的Server中的控制元件。建議使用XLS4控制元件,生成的EXCEL無問題。
uj5u.com熱心網友回復:
我也遇到了,下面的代碼肯定可以。procedure DBGridSaveXLS(aDBGrid: TDBGrid; sFileName: string);
function LineFeedsToXLS(s:string):string;
var
Res: string;
i: Integer;
begin
Res := '';
for i := 1 to Length(s) do
if s[i] <> #13 then
Res := Res + s[i];
Result:=res;
end;
var
FExcel: Variant;
FWorkbook: Variant;
FWorksheet: Variant;
FArray: Variant;
s, z: Integer;
RangeStr, sTitle: string;
aBookMark: TBookMark;
StrtCol, StrtRow, RowCount, ColCount: Integer;
begin
Screen.Cursor := crHourGlass;
try
FExcel := CreateOleObject('excel.application');
except
Screen.cursor := crDefault;
MessageDlg('Could not start Microsoft Excel!', mtError, [mbCancel], 0);
Exit;
end;
aBookMark := aDBGrid.DataSource.DataSet.GetBookMark;
aDBGrid.DataSource.DataSet.DisableControls;
try
StrtCol := 0;
StrtRow := 0;
FWorkBook := FExcel.WorkBooks.Add;
//FWorkSheet := FWorkBook.WorkSheets.Add;
FWorkSheet := FExcel.WorkBooks[1].WorkSheets[1];
RowCount := aDBGrid.DataSource.DataSet.RecordCount + 1;//加上標題行
ColCount := aDBGrid.Columns.Count;
FArray := VarArrayCreate([0, RowCount - 1 - StrtRow, 0, ColCount - 1 - StrtCol], VarVariant);
//Title
for z := StrtCol to ColCount - 1 do
begin
sTitle := aDBGrid.Columns[z].Title.Caption;
if sTitle = '' then
sTitle := aDBGrid.Columns[z].FieldName;
FArray[0, z - StrtCol] := LineFeedsToXLS(sTitle);
end;
//data
{for s := StrtRow to RowCount - 1 do
for z := StrtCol to ColCount - 1 do
FArray[s - StrtRow, z - StrtCol] := LineFeedsToXLS();}
s := 1;//s := StrtRow;
aDBGrid.DataSource.DataSet.First;
while not aDBGrid.DataSource.DataSet.Eof do
begin
for z := StrtCol to ColCount - 1 do
FArray[s - StrtRow, z - StrtCol] := LineFeedsToXLS(aDBGrid.Columns[z].Field.DisplayText);
Inc(s);
aDBGrid.DataSource.DataSet.Next;
end;
RangeStr := 'A1:';
if (ColCount - StrtCol) > 26 then
begin
if (ColCount - StrtCol) mod 26 = 0 then
begin
RangeStr := RangeStr + Chr(Ord('A') - 2 + ((ColCount - StrtCol) div 26));
RangeStr := RangeStr + 'Z';
end
else
begin
RangeStr := RangeStr + Chr(Ord('A') - 1 + ((ColCount - StrtCol) div 26));
RangeStr := RangeStr + Chr(Ord('A') - 1 + ((ColCount - StrtCol) mod 26));
end;
end
else
RangeStr := RangeStr + Chr(Ord('A') - 1 + (ColCount - StrtCol));
RangeStr := RangeStr + IntToStr(RowCount - StrtRow);
FWorkSheet.Range[RangeStr].Value := FArray;
if sFileName <> '' then
begin
FWorkbook.SaveAs(sFileName);
FExcel.Quit;
FExcel := unAssigned;
end
else
FExcel.Visible := True;
finally
aDBGrid.DataSource.DataSet.GotoBookMark(aBookMark);
aDBGrid.DataSource.DataSet.EnableControls;
aDBGrid.DataSource.DataSet.FreeBookMark(aBookMark);
Screen.Cursor := crDefault;
end;
end;
uj5u.com熱心網友回復:
我用的也是dbgrideh的控制元件,匯出的excel也是用office 2010,可以正常匯出excel,并打開,我把代碼貼出來,希望有幫助,ps:我是用xe2寫的,delphi 7 也可以用的。uses COMobj,DBGridEhImpExp;
procedure TfrmDetail.Button8Click(Sender: TObject);
var
pExpClass: TDBGridEhExportClass; //匯出檔案型別
pExt:string ; //匯出檔案擴展名
pExpFile:string; //匯出檔案路徑及檔案名稱
pExpFileExt:string; //SaveDialog1回傳的檔案名的擴展名
ExcelApp: Variant; //Excel變數
Ret:integer;
begin
Ret := Application.MessageBox(pchar('是否只匯出選中的資料?'
+#13+#10+#13+#10+' 確認 - 選中部分'
+#13+#10+#13+#10+' 取消 - 全部'),pchar(Application.title),MB_OKCANCEL);
SaveDialog1.FileName := '';
if SaveDialog1.Execute then
begin
pExpClass := TDBGridEhExportAsXLS;
pExt := 'xls';
pExpFile:= trim(SaveDialog1.FileName);
if UpperCase(Copy(pExpFile,Length(pExpFile)-2,3)) <> UpperCase(pExt) then
pExpFile := pExpFile + '.' + pExt;
if Ret = IDOK then
SaveDBGridEhToExportFile(pExpClass,DBGridEh2,pExpFile,False)
else
SaveDBGridEhToExportFile(pExpClass,DBGridEh2,pExpFile,true);
ExcelApp := CreateOleObject('Excel.Application');
ExcelApp.Visible := true;
ExcelApp.WorkBooks.Open(pExpFile);
ExcelApp.WorkSheets[1].Activate;
end;
end;
uj5u.com熱心網友回復:
xe2 下匯出的EXCEL,在e2010下打不開啊uj5u.com熱心網友回復:
我的xe2中怎么沒有你說的dbgrideh控制元件啊?
uj5u.com熱心網友回復:
求解,我用DBgridEh匯出Excel檔案后無法打開提示:檔案已損壞,無法打開
用2003,2007都可以正常打開,唯獨2010打不開,2010以上的版本沒試過
SaveDBGridEhToExportFile(pExpClass,dbgrdh1,pExpFile,True)
uj5u.com熱心網友回復:
這個會不會因為匯出excel版本格式太久緣故?
你試試03打開另存為97或者以上格式版本
uj5u.com熱心網友回復:
不會的,我用2000,2003,2007,2010,2013分別打開過了
只有2010無法打開呢
uj5u.com熱心網友回復:
那就不知道了
uj5u.com熱心網友回復:

做個標記,建議使用cxgrid...自帶匯出!
uj5u.com熱心網友回復:
我用的也是dbgrideh的控制元件,匯出的excel也是用office 2010,可以正常匯出excel,并打開,我把代碼貼出來,希望有幫助,ps:我是用xe2寫的,delphi 7 也可以用的。
uses COMobj,DBGridEhImpExp;
procedure TfrmDetail.Button8Click(Sender: TObject);
var
pExpClass: TDBGridEhExportClass; //匯出檔案型別
pExt:string ; //匯出檔案擴展名
pExpFile:string; //匯出檔案路徑及檔案名稱
pExpFileExt:string; //SaveDialog1回傳的檔案名的擴展名
ExcelApp: Variant; //Excel變數
Ret:integer;
begin
Ret := Application.MessageBox(pchar('是否只匯出選中的資料?'
+#13+#10+#13+#10+' 確認 - 選中部分'
+#13+#10+#13+#10+' 取消 - 全部'),pchar(Application.title),MB_OKCANCEL);
SaveDialog1.FileName := '';
if SaveDialog1.Execute then
begin
pExpClass := TDBGridEhExportAsXLS;
pExt := 'xls';
pExpFile:= trim(SaveDialog1.FileName);
if UpperCase(Copy(pExpFile,Length(pExpFile)-2,3)) <> UpperCase(pExt) then
pExpFile := pExpFile + '.' + pExt;
if Ret = IDOK then
SaveDBGridEhToExportFile(pExpClass,DBGridEh2,pExpFile,False)
else
SaveDBGridEhToExportFile(pExpClass,DBGridEh2,pExpFile,true);
ExcelApp := CreateOleObject('Excel.Application');
ExcelApp.Visible := true;
ExcelApp.WorkBooks.Open(pExpFile);
ExcelApp.WorkSheets[1].Activate;
end;
end;
那請問這個哥們的Ehlib 是什么版本的
uj5u.com熱心網友回復:
在日常操作中,Excel、PPT偶爾會碰到2003、2007、2010互相打不開的情況。轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/90335.html
標籤:VCL組件開發及應用
