線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2910
推到 Plurk!
推到 Facebook!

office 2013 delphi api失效(自己解決了)

缺席
skywillnosky
一般會員


發表:12
回覆:11
積分:4
註冊:2012-12-14

發送簡訊給我
#1 引用回覆 回覆 發表時間:2013-04-24 17:07:30 IP:61.220.xxx.xxx 訂閱
 小弟最近在做EXCEL報表產生自動化的程式
而內容是從多個資料庫分別取得資料,做成一個RecordSet Array
寫入EXCEL時便依序寫入,寫入的方式是用API CopyFromRecordset
以往 excel 2010 都可以的程式到 excel 2013都是空的
以下是我的CODE
輸出附檔為.xlsm

XLApp := CreateOleObject('Excel.Application');
Screen.Cursor := crHourGlass;
try
try
try
XLApp.Application.Workbooks.Open(AXLSFile);
sleep(5000);
XLApp.Application.Visible := false;
XLApp.Application.DisplayAlerts := False;
XLApp.Application.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[InitSheet].Activate;
Sheet := XLApp.Application.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[InitSheet];
Sheet.Cells.SpecialCells(xlCellTypeLastCell, EmptyParam).Activate;
dwTick := Windows.GetTickCount();
loc_NumOfRecordSet := Length(p_RecordSetArray);
for loc_SessionCount := 0 to loc_NumOfRecordSet - 1 do
begin
if loc_SessionCount = 0 then
loc_BeginRow := 4
else
loc_BeginRow := loc_BeginRow p_RecordSetArray[loc_SessionCount - 1].RecordCount;
//下一組資料的起始位置是上一組資料的結束位置
if p_RecordSetArray[loc_SessionCount].RecordCount > 0 then
begin
Sheet.Cells[loc_BeginRow, 1].CopyFromRecordset(p_RecordSetArray[loc_SessionCount]);// excel 2013輸出無資料
end;
end;
XLApp.Application.cells[1, 1].Value := CellDeforbiddenion;// excel 2013輸出無資料
XLApp.Application.cells[2, 1].Value := DateRangeStr;// excel 2013輸出無資料
XLApp.Application.Workbooks[ExtractFileName(AXLSFile)].WorkSheets[1].Activate;
XLApp.Application.Save;
dwTick := WIndows.GetTickCount() - dwTick;
except
On E:EOleException Do
end;
finally
if not VarIsEmpty(XLApp) then
begin
XLApp.Quit;
XLAPP := Unassigned;
Sheet := Unassigned;
end;
p_OrderList.Clear;
p_FieldCount := 0;
end;
finally
Screen.Cursor := crDefault;
end;

編輯記錄
skywillnosky 重新編輯於 2013-04-24 17:08:05, 註解 無‧
skywillnosky 重新編輯於 2013-04-24 17:08:23, 註解 無‧
skywillnosky 重新編輯於 2013-04-24 17:08:58, 註解 無‧
skywillnosky 重新編輯於 2013-04-24 17:09:41, 註解 無‧
skywillnosky 重新編輯於 2013-04-24 17:12:55, 註解 無‧
skywillnosky 重新編輯於 2013-04-24 17:13:40, 註解 無‧
skywillnosky 重新編輯於 2013-04-24 17:16:10, 註解 無‧
skywillnosky 重新編輯於 2013-04-29 14:42:43, 註解 無‧
skywillnosky
一般會員


發表:12
回覆:11
積分:4
註冊:2012-12-14

發送簡訊給我
#2 引用回覆 回覆 發表時間:2013-04-26 15:50:44 IP:61.220.xxx.xxx 訂閱
 後來發現問題不是出在 CopyFromRecordSet上
是發生在XLApp.Application.Save;
Exception:class application 的 save 方法失敗
錯誤代碼:800A03EC(-2146827284)
LastErrorCode:87
網路上的說法解釋眾說紛紜
大部分圍繞在權限問題上
參考過
Microsoft Office Excel 錯誤'800a03ec'
www.blueshop.com.tw/board/show.asp
win7 x64 asp存取excel的問題
social.msdn.microsoft.com/Forums/zh-TW/236/thread/79273558-47c8-46d5-955b-46b2a405863e/
也試過用他們的解決方法
依然會卡在存檔的地方(就是不讓你存)

更詭異的是 同樣得情況Excel 2010沒有發生過
出問題的環境配置
WIN7 x64
EXCEL 2013 x86

PS:還有從事件檢視器也沒看到任何錯誤。
搞了一個禮拜,又回到原點了...
skywillnosky
一般會員


發表:12
回覆:11
積分:4
註冊:2012-12-14

發送簡訊給我
#3 引用回覆 回覆 發表時間:2013-04-29 14:42:00 IP:211.20.xxx.xxx 訂閱
呼 問題解決了 雖然有點治標不治本
不過貌似EXCEL2013已經可以正常運作

解決方法是

XLApp.Application.Save;
改為
XLApp.ActiveWorkbook.SaveAs(AXLSFile);//AXLSFile為原檔名
在此分享
試出來的剎那真的有想哭的感覺
系統時間:2018-01-21 13:05:54
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!