2020/03/12

Delphi Easy Excel 基礎類別設計


Excel是許多從事行政人員必用且愛用的工具之一,所以在程式開發上最常遇到的就是客戶拿產品來和Excel做比較。


這能比嗎!(怒吼)


忠孝不能兩全的情況下,拿Excel檔案進行匯入似乎是很常見的折衷方案。

Delphi號稱VB Killer,操作個Excel自然是基本款,來看看Delphi準備了哪些方案?

Microsoft Office 2000/XP Sample Automation Server Wrapper Components

Microsoft Office 2000/XP Sample Automation Server Wrapper Components


Delphi很貼心的提供Office元件,自Delphi 7~10.3以來,也就這麼兩套。(2020.03.19更新:XE5之後有單獨提供 2010 套件,但只要 Office 更新也是會有相容性問題。延伸閱讀:Delphi XE5 Office 2013 组件更新)

Office 至目前為止已經2019了,許多使用者都開始使用XLSX新格式,這個元件很早就出現相容性不足的問題。

另一個類似元件的做法是使用Import ActiveX Control,匯入新版Excel ActiveX控制項,實務上還蠻類似元件的操作方式,只是問題在Excel升級後仍有可能會有相容性問題產生。

3rd party

三方元件最好的地方在於使用者電腦並不需要安裝Excel即可進行XLS檔案操作,速度和品質都非常好,我用過的有:

NikaSoft NativeExcel

NativeExcel設計上非常貼近OLE的操作方式,在轉換上十分方便,操作XLS檔效率也非常棒,體驗後就離不開它。

但NativeExcel現在已經沒有維護,對XLSX相容性問題也開始浮現。

無奈之餘,還是只能忍痛放棄它。

XLSReadWriteII


這套是資深Delphier Jason Wong 愛用的Excel元件,而且仍有維護,據稱其優點和NatvieExcel相同,但設計概念非OLE操作,所以沒有深入了解。


看來看去,似乎只能回歸OLE設計方式才能達到最高相容的可能性。

畢竟穩定比效能更加重要!

使用OLE開發


使用官方元件很像是使用全域變數的概念,如果OLE也這樣設計如何?


var FExcelApp: Variant;

function ExcelApp: Variant;
  function IsExcelInstalled: Boolean;
  var
    ClassID: TCLSID;
    strOLEObject: string;
  begin
    strOLEObject := 'Excel.Application';
    Result := (CLSIDFromProgID(PWideChar(WideString(strOLEObject)), ClassID) = S_OK);
  end;
begin
  if IsExcelInstalled then
  begin
    if VarIsEmpty(FExcelApp) then
      FExcelApp := CreateOleObject('Excel.Application');
    Result := FExcelApp;
  end
  else
    WinMsgBox.WinError('Not found Excel, call EdenWu, please.');
end;

procedure CloseExcelApp;
begin
  if not VarIsEmpty(FExcelApp) then
  begin
    FExcelApp.ActiveWorkBook.Saved:= 1;
    FExcelApp.DisplayAlerts:= 0;
    FExcelApp.ActiveWorkBook.Close(SaveChanges:=0);
    FExcelApp.Quit;
    VarClear(FExcelApp);
    FExcelApp:=Unassigned;
  end;
end;

initialization
  //FExcelApp := unassinged; // this should not be necessary
finalization
  CloseExcelApp;

把Excel Application視為全域變數,隨時要使用Excel Application都沒問題,非常方便。

開始要寫一些關於Worksheet相關的處理了。咦?

好像還不錯,但不夠OOP,還要更多的OOP

寫著寫著,全域變數和全域函式跑來跑去,程式碼看起來就不夠簡潔了,如果使用OOP設計方式會不會更好呢?

自己刻好像不錯,只是有個臨摹的對象更好,來看看有沒有好範本可以參考。

Github搜尋一陣後,發現有高手寫了個SimpleExcel,仔細看了下程式碼,嗯,很OO,這我可以。

這樣的程式碼要自己來寫到底要花多少時間呢?
如果站在巨人的肩膀上會不會省下更多時間做更重要的事呢?

一邊使用SimpleExcel的同時,一邊思考著。


-全文完-

See also

2020/03/04

外掛小幫手FastReport

原來是報表工具啊,我還以為是外掛開發程式呢! (笑)


Delphi最有趣的地方是它有很多三方元件可以支撐開發專案,以上圖為例,功能不多,通常列為小專案,這時使用諾大的Delphi開發專案顯得太小題大作。


這時FastReport就派上用場,FastReport雖然是報表工具,別小看它,它搭載的Report Designer備有Pascal直譯功能,還有內建VCL基礎元件,有效利用下,可以大幅減少小專案開發時間,還能降低Delphi升級所帶來的改版衝擊呢!


報表工具當然要著重在報表的設計,Report Designer提供的函式庫想當然是不夠使用。FastReport也明白這點,便在FR Document也寫了很多的輔助說明,在藉助FR Document的神奇力量後,我也添加了許多常用函式到Report Desinger中,開發起來便利度提高非常多!


除了可視元件外,像是常常用到的TStringList基礎類別也有提供,程式寫起來超安心。


還有ADO, DBX等資料庫元件,用了Report Designer,很多小型專案都在移轉到FR後就刪除,專案存放目錄差點手殘到刪光光!


和Delphi一樣可以下中斷點,這Debug很可以。

一想到Delphi要開個幾十秒,開啟FastReport Report Designer不僅快,刻起程式也是趣味十足,提供各位參考。


See also

購買連結:Fast-Report官方網站