2012年9月20日

[.Net] 如何用 C# 將 LibreOffice 的 ods 轉成 excel 的 xls

首先,當然是要安裝 LibreOffice
接下來要安裝 LiberOffice SDK ,坦白說,這個步驟我找好久,
下圖是下載的位置:


安裝完成之後,開啟 dotNet C# 專案,將 C:\Program files\LibreOffice 3.6\sdk\cli 中的 Dll 全部加進參考。


接下來就可以開始寫程式了:
public static string FilePath2Url(string fname)
{
    return string.Format("file:///{0}", fname.Replace("\\", "/"));
}

internal static XComponent openCalcSheet(string fname)
{
    string url = FilePath2Url(fname);
    XComponentContext oStrap = uno.util.Bootstrap.bootstrap();
    XMultiServiceFactory oServMan = (XMultiServiceFactory)oStrap.getServiceManager();
    XComponentLoader desktop = (XComponentLoader)oServMan.createInstance("com.sun.star.frame.Desktop");
    PropertyValue[] loadProps = new PropertyValue[1];
    loadProps[0] = new PropertyValue();
    loadProps[0].Name = "Hidden";
    loadProps[0].Value = new uno.Any(true);
    XComponent document = desktop.loadComponentFromURL(url, "_blank", 0, loadProps);
    return document;
}

public static XSpreadsheetDocument Open(string fname)
{
    return (XSpreadsheetDocument)openCalcSheet(fname);
}

public static void Save(XSpreadsheetDocument xDoc, string fname)
{
    string url = FilePath2Url(fname);
    PropertyValue[] propVals = new PropertyValue[2];
    /* 另存成 MS Excel 97 的格式,
       格式可以參考:http://www.oooforum.org/forum/viewtopic.phtml?t=3549  (找不到官方的清單 Orz,看官知道在哪的,請通知一聲,感恩ㄚ)
       原理可以參考:http://wiki.openoffice.org/wiki/Documentation/DevGuide/OfficeDev/Integrating_Import_and_Export_Filters
     */
    propVals[0] = new PropertyValue { Name = "FilterName", Value = new uno.Any("MS Excel 97") };
    propVals[1] = new PropertyValue { Name = "Overwrite", Value = new uno.Any(true) };
    ((XStorable)xDoc).storeToURL(url, propVals);
}

public static void Convert2Xls(string fname, string new_fname)
{
    Save(Open(fname), new_fname);
}
於是只要呼叫 Convert2Xls(ods檔案位置, xls輸出檔案位置) 就可以將 ods 轉成 xls 囉。

範例程式:將選到的 ODS 另存成 XLS 並透過 oledb 讀取資料顯示在 DataGridView 上

參考資料:
http://www.oooforum.org/forum/viewtopic.phtml?t=3549
Integrating Import and Export Filters
use openoffice uno cli with c sharp to create a spreadsheet
c-cpp.r3dcode.com


2012年9月17日

[Refactoring] Demo video


原本這程式會分別出兩張報表,新的需求是要併成一張,
看到程式的第一個念頭就是「重構」,
請記住!「重構」不是「重寫」,
我們是懷著讓原本程式更容易閱讀的心情再做「重構」的。

影片不是很清楚,程式不是很容易閱讀,純粹紀錄「重構」的感覺,
如果你也進行過「重構」工作,我想你會懂我的。