2091-08-24
本測試使用 LibreOffice 6.2.6 SDK,是 x64 版。
https://zh-tw.libreoffice.org/download/libreoffice-still/
OpenOffice SDK 4.1.6 實際測試也可以用 ,但它還在 x86 版。
https://www.openoffice.org/zh-tw/
(下圖) 測試用的檔案,做好記得要關閉,否則後面程式跑會出錯。
(下圖) 執行結果,抓出 Cell (2,2) 的 9
Form1.cs
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using uno.util; using unoidl.com.sun.star.beans; using unoidl.com.sun.star.frame; using unoidl.com.sun.star.lang; using unoidl.com.sun.star.sheet; using unoidl.com.sun.star.table; using unoidl.com.sun.star.uno; namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Button1_Click(object sender, EventArgs e) { string fileName = ""; Stream myStream = null; OpenFileDialog openFileDialog1 = new OpenFileDialog(); openFileDialog1.InitialDirectory = "c:\\"; openFileDialog1.Filter = "ods files (*.ods)|*.ods|All files (*.*)|*.*"; openFileDialog1.FilterIndex = 2; openFileDialog1.RestoreDirectory = true; openFileDialog1.InitialDirectory = System.IO.Directory.GetCurrentDirectory(); if (openFileDialog1.ShowDialog() == DialogResult.OK) { try { if ((myStream = openFileDialog1.OpenFile()) != null) { label1.Text = openFileDialog1.FileName; // 包含路徑 string inputFilePath = openFileDialog1.FileName; // 包含路徑 fileName = openFileDialog1.FileName; // 包含路徑 XComponentContext context = Bootstrap.bootstrap(); XMultiServiceFactory factory = (XMultiServiceFactory)context.getServiceManager(); XComponentLoader loader = (XComponentLoader)factory.createInstance("com.sun.star.frame.Desktop"); PropertyValue[] args1 = new PropertyValue[1]; args1[0] = new PropertyValue(); args1[0].Name = "Hidden"; args1[0].Value = new uno.Any((Boolean)true); XSpreadsheetDocument doc = (XSpreadsheetDocument)loader.loadComponentFromURL("file:///" + fileName, "_blank", 0, args1); XSpreadsheets sheets = doc.getSheets(); //XSpreadsheet sheet = (XSpreadsheet)sheets.getByName("Sheet1").Value; XSpreadsheet sheet = (XSpreadsheet)sheets.getByName("工作表1").Value; // 繁體中文版 Office XCell cell = sheet.getCellByPosition(2, 2); label1.Text = cell.getValue().ToString(); } } catch (unoidl.com.sun.star.uno.Exception ex) { MessageBox.Show(ex.Message); } } } } } |
增加寫入測試
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.IO; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Forms; using uno.util; using unoidl.com.sun.star.beans; using unoidl.com.sun.star.frame; using unoidl.com.sun.star.lang; using unoidl.com.sun.star.sdbc; using unoidl.com.sun.star.sheet; using unoidl.com.sun.star.table; using unoidl.com.sun.star.uno; namespace WindowsFormsApp1 { public partial class Form1 : Form { public Form1() { InitializeComponent(); } private void Button1_Click(object sender, EventArgs e) { string fileName = ""; Stream myStream = null; OpenFileDialog openFileDialog1 = new OpenFileDialog(); openFileDialog1.InitialDirectory = "c:\\"; openFileDialog1.Filter = "ods files (*.ods)|*.ods|All files (*.*)|*.*"; openFileDialog1.FilterIndex = 2; openFileDialog1.RestoreDirectory = true; openFileDialog1.InitialDirectory = System.IO.Directory.GetCurrentDirectory(); if (openFileDialog1.ShowDialog() == DialogResult.OK) { try { if ((myStream = openFileDialog1.OpenFile()) != null) { label1.Text = openFileDialog1.FileName; // 包含路徑 string inputFilePath = openFileDialog1.FileName; // 包含路徑 fileName = openFileDialog1.FileName; // 包含路徑 XComponentContext context = Bootstrap.bootstrap(); XMultiServiceFactory factory = (XMultiServiceFactory)context.getServiceManager(); XComponentLoader loader = (XComponentLoader)factory.createInstance("com.sun.star.frame.Desktop"); PropertyValue[] args1 = new PropertyValue[1]; args1[0] = new PropertyValue(); args1[0].Name = "Hidden"; args1[0].Value = new uno.Any((Boolean)true); XSpreadsheetDocument doc = (XSpreadsheetDocument)loader.loadComponentFromURL("file:///" + fileName, "_blank", 0, args1); XSpreadsheets sheets = doc.getSheets(); //XSpreadsheet sheet = (XSpreadsheet)sheets.getByName("Sheet1").Value; XSpreadsheet sheet = (XSpreadsheet)sheets.getByName("工作表1").Value; // 繁體中文版 Office XCell cell = sheet.getCellByPosition(2, 2); label1.Text = cell.getValue().ToString(); // ----- Write test cell.setValue(1000); cell = sheet.getCellByPosition(1, 1); cell.setFormula("Title"); XStorable xstorable = (XStorable)doc; PropertyValue[] storeProps = new PropertyValue[1]; storeProps[0] = new PropertyValue(); storeProps[0].Name = "Overwrite"; storeProps[0].Value = new uno.Any((Boolean)true); try { String sURL = "file:///d:/Temp/SaveTest2.ods"; xstorable.storeAsURL(sURL, storeProps); //if (doc != null) //{ // //XCloseable xCloseable = (XCloseable)doc; // //xCloseable.close(); // doc = null; // } } catch (unoidl.com.sun.star.uno.Exception ex) { MessageBox.Show(ex.Message); } } } catch (unoidl.com.sun.star.uno.Exception ex) { MessageBox.Show(ex.Message); } } } } } |
********************************************************************************
2020-05-21 補充
安裝 LibreOffice_6.3.6_Win_x64_sdk.msi,不安裝 LibreOffice_6.3.6_Win_x64.msi
( 實際測試只安裝 SDK,不安裝 LibreOffice 本身)
Visual Studio 2019 v16.6.0 ,方案使用 .NET Framework 4.7.2 或 4.8,編譯正常,執行出錯
WindowsFormsApp1.exe' (CLR v4.0.30319: DefaultDomain): 已載入 'C:\WINDOWS\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll'。已略過載入符號。模組已最佳化,並已啟用 [Just My Code] 偵錯工具選項。
WindowsFormsApp1.exe' (CLR v4.0.30319: DefaultDomain): 已載入 'C:\CodeTemp\WindowsFormsApp1\WindowsFormsApp1\bin\Debug\WindowsFormsApp1.exe'。已載入符號。
WindowsFormsApp1.exe' (CLR v4.0.30319: WindowsFormsApp1.exe): 已載入 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll'。已略過載入符號。模組已最佳化,並已啟用 [Just My Code] 偵錯工具選項。
WindowsFormsApp1.exe' (CLR v4.0.30319: WindowsFormsApp1.exe): 已載入 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll'。已略過載入符號。模組已最佳化,並已啟用 [Just My Code] 偵錯工具選項。
WindowsFormsApp1.exe' (CLR v4.0.30319: WindowsFormsApp1.exe): 已載入 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Drawing\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll'。已略過載入符號。模組已最佳化,並已啟用 [Just My Code] 偵錯工具選項。
WindowsFormsApp1.exe' (CLR v4.0.30319: WindowsFormsApp1.exe): 已載入 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll'。已略過載入符號。模組已最佳化,並已啟用 [Just My Code] 偵錯工具選項。
WindowsFormsApp1.exe' (CLR v4.0.30319: WindowsFormsApp1.exe): 已載入 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll'。已略過載入符號。模組已最佳化,並已啟用 [Just My Code] 偵錯工具選項。
WindowsFormsApp1.exe' (CLR v4.0.30319: WindowsFormsApp1.exe): 已載入 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Xml\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.dll'。已略過載入符號。模組已最佳化,並已啟用 [Just My Code] 偵錯工具選項。
WindowsFormsApp1.exe' (CLR v4.0.30319: WindowsFormsApp1.exe): 已載入 'C:\CodeTemp\WindowsFormsApp1\WindowsFormsApp1\bin\Debug\cli_basetypes.dll'。建置的模組沒有符號。
WindowsFormsApp1.exe' (CLR v4.0.30319: WindowsFormsApp1.exe): 已載入 'C:\CodeTemp\WindowsFormsApp1\WindowsFormsApp1\bin\Debug\cli_uretypes.dll'。建置的模組沒有符號。
於 System.BadImageFormatException 擲回例外狀況: 'System.Windows.Forms.dll'
類型 'System.BadImageFormatException' 的未處理例外狀況發生於 System.Windows.Forms.dll
無法載入檔案或組件 'cli_cppuhelper, Version=1.0.23.0, Culture=neutral, PublicKeyToken=ce2cb7e279207b9e' 或其相依性的其中之一。 試圖載入格式錯誤的程式。
'[8552] WindowsFormsApp1.exe: 程式追蹤' 程式以返回碼 0 (0x0) 結束。
'[8552] WindowsFormsApp1.exe' 程式以返回碼 -1 (0xffffffff) 結束。
把 LibreOffice 6.3.6.2 安裝了,關閉方案,重新開啟,依然是編譯成功,執行失敗。
把參照 cli_cppuhelper 移除,編譯到下面這行失敗。
XComponentContext context = Bootstrap.bootstrap();
暫時解決不了。
********************************************************************************
2020-05-21 補充
loader.loadComponentFromURL() 只能用於 .NET Framework 的 Windows Form App 桌面應用程式,無法用 ASP.NET 的 WinForms 網頁程式。
********************************************************************************
2020-05-21 補充
移除 LibreOffice 和 LibreOffice SDK,改安裝
Apache_OpenOffice-SDK_4.1.7_Win_x86_install_en-US.exe
沒安裝 Apache_OpenOffice_4.1.7_Win_x86_install_zh-TW.exe
Visual Studio 2019 v16.6.0 中,把程式的舊參照砍光,參照改用
C:\Program Files (x86)\OpenOffice_4.1.7_SDK\sdk\cli
目錄的,編譯成功,執行失敗。
WindowsFormsApp1.exe' (CLR v4.0.30319: DefaultDomain): 已載入 'C:\WINDOWS\Microsoft.Net\assembly\GAC_32\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll'。已略過載入符號。模組已最佳化,並已啟用 [Just My Code] 偵錯工具選項。
WindowsFormsApp1.exe' (CLR v4.0.30319: DefaultDomain): 已載入 'C:\CodeTemp\WindowsFormsApp1\WindowsFormsApp1\bin\Debug\WindowsFormsApp1.exe'。已載入符號。
WindowsFormsApp1.exe' (CLR v4.0.30319: WindowsFormsApp1.exe): 已載入 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Windows.Forms\v4.0_4.0.0.0__b77a5c561934e089\System.Windows.Forms.dll'。已略過載入符號。模組已最佳化,並已啟用 [Just My Code] 偵錯工具選項。
WindowsFormsApp1.exe' (CLR v4.0.30319: WindowsFormsApp1.exe): 已載入 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll'。已略過載入符號。模組已最佳化,並已啟用 [Just My Code] 偵錯工具選項。
WindowsFormsApp1.exe' (CLR v4.0.30319: WindowsFormsApp1.exe): 已載入 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Drawing\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Drawing.dll'。已略過載入符號。模組已最佳化,並已啟用 [Just My Code] 偵錯工具選項。
WindowsFormsApp1.exe' (CLR v4.0.30319: WindowsFormsApp1.exe): 已載入 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Configuration\v4.0_4.0.0.0__b03f5f7f11d50a3a\System.Configuration.dll'。已略過載入符號。模組已最佳化,並已啟用 [Just My Code] 偵錯工具選項。
WindowsFormsApp1.exe' (CLR v4.0.30319: WindowsFormsApp1.exe): 已載入 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Core\v4.0_4.0.0.0__b77a5c561934e089\System.Core.dll'。已略過載入符號。模組已最佳化,並已啟用 [Just My Code] 偵錯工具選項。
WindowsFormsApp1.exe' (CLR v4.0.30319: WindowsFormsApp1.exe): 已載入 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\System.Xml\v4.0_4.0.0.0__b77a5c561934e089\System.Xml.dll'。已略過載入符號。模組已最佳化,並已啟用 [Just My Code] 偵錯工具選項。
WindowsFormsApp1.exe' (CLR v4.0.30319: WindowsFormsApp1.exe): 已載入 'C:\CodeTemp\WindowsFormsApp1\WindowsFormsApp1\bin\Debug\cli_basetypes.dll'。建置的模組沒有符號。
WindowsFormsApp1.exe' (CLR v4.0.30319: WindowsFormsApp1.exe): 已載入 'C:\CodeTemp\WindowsFormsApp1\WindowsFormsApp1\bin\Debug\cli_uretypes.dll'。建置的模組沒有符號。
WindowsFormsApp1.exe' (CLR v4.0.30319: WindowsFormsApp1.exe): 已載入 'C:\WINDOWS\Microsoft.Net\assembly\GAC_MSIL\mscorlib.resources\v4.0_4.0.0.0_zh-Hant_b77a5c561934e089\mscorlib.resources.dll'。建置的模組沒有符號。
於 System.IO.FileLoadException 擲回例外狀況: 'System.Windows.Forms.dll'
類型 'System.IO.FileLoadException' 的未處理例外狀況發生於 System.Windows.Forms.dll
混合模式組件是針對版本 'v2.0.50727' 的執行階段建置的,無法在沒有其他組態資訊的情況下載入 4.0 執行階段中。
WindowsFormsApp1.exe' (CLR v4.0.30319: WindowsFormsApp1.exe): 已載入 'C:\Program Files (x86)\Microsoft Visual Studio\2019\Enterprise\common7\ide\PrivateAssemblies\Runtime\Microsoft.VisualStudio.Debugger.Runtime.dll'。已略過載入符號。模組已最佳化,並已啟用 [Just My Code] 偵錯工具選項。
'[6548] WindowsFormsApp1.exe: 程式追蹤' 程式以返回碼 0 (0x0) 結束。
'[6548] WindowsFormsApp1.exe' 程式以返回碼 -1 (0xffffffff) 結束。
(下圖)本電腦是 Windows 10 Version 1909,確認 .NET Framework 2.0 是有安裝的。
又碰上以前某版本 LibreOffice SDK 和 OpenOffice SDK 時碰到的不好經驗了。
(完)
相關
[研究] [C#] 使用 LibreOffice 6.2.6 SDK、OpenOffice 4.1.6 SDK讀取/寫入試算表(Calc) 檔案 (.ods)
https://shaurong.blogspot.com/2019/08/c-libreoffice-626-sdk-calc-ods.html
[研究] [C#] 使用 OpenOffice 4.1.3 SDK 讀取試算表(Calc) 檔案 (.ods)
http://shaurong.blogspot.com/2016/12/c-openoffice-413-sdk-calc-ods.html
[研究] [C#] 使用 LibreOffice 5.1.6、5.3.0 SDK 讀取試算表(Calc) 檔案 (.ods)
http://shaurong.blogspot.com/2016/12/c-libreoffice-516-sdk-calc-ods.html
[研究] [C#] 讀取 LibreOffice、OpenOffice 的試算表(Calc) 檔案 (.ods)(使用 .NET 4.5 的 ZipFile)
http://shaurong.blogspot.com/2016/12/c-libreoffice-516-calc-ods-net-45.html
[研究] [C#] 使用 Apose.Cells 讀取 LibreOffice 5.1.6、OpenOffice 4.1.3 試算表(Calc) 檔案 (.ods)
http://shaurong.blogspot.com/2017/01/c-aposecells-libreoffice-516openoffice.html
[研究] [C#] 使用 GemBox.Spreadsheet 讀取LibreOffice、OpenOffice試算表(Calc) 檔案 (.ods)
http://shaurong.blogspot.com/2016/12/c-gemboxspreadsheet-libreofficeopenoffi.html
[研究] OpenOffice 4.1.3 試算表(Calc) 保護鎖定儲存格不被修改
http://shaurong.blogspot.com/2016/12/openoffice-413-calc.html
[研究] 使用OpenOffice 4.1.3試算表(Calc)建立「下拉式選單」來輸入資料
http://shaurong.blogspot.com/2016/12/openoffice-413calc.html
相關
[研究] [C#] 使用 LibreOffice 6.2.6 SDK、OpenOffice 4.1.6 SDK讀取/寫入試算表(Calc) 檔案 (.ods)
https://shaurong.blogspot.com/2019/08/c-libreoffice-626-sdk-calc-ods.html
[研究] [C#] 使用 OpenOffice 4.1.3 SDK 讀取試算表(Calc) 檔案 (.ods)
http://shaurong.blogspot.com/2016/12/c-openoffice-413-sdk-calc-ods.html
[研究] [C#] 使用 LibreOffice 5.1.6、5.3.0 SDK 讀取試算表(Calc) 檔案 (.ods)
http://shaurong.blogspot.com/2016/12/c-libreoffice-516-sdk-calc-ods.html
[研究] [C#] 讀取 LibreOffice、OpenOffice 的試算表(Calc) 檔案 (.ods)(使用 .NET 4.5 的 ZipFile)
http://shaurong.blogspot.com/2016/12/c-libreoffice-516-calc-ods-net-45.html
[研究] [C#] 使用 Apose.Cells 讀取 LibreOffice 5.1.6、OpenOffice 4.1.3 試算表(Calc) 檔案 (.ods)
http://shaurong.blogspot.com/2017/01/c-aposecells-libreoffice-516openoffice.html
[研究] [C#] 使用 GemBox.Spreadsheet 讀取LibreOffice、OpenOffice試算表(Calc) 檔案 (.ods)
http://shaurong.blogspot.com/2016/12/c-gemboxspreadsheet-libreofficeopenoffi.html
[研究] OpenOffice 4.1.3 試算表(Calc) 保護鎖定儲存格不被修改
http://shaurong.blogspot.com/2016/12/openoffice-413-calc.html
[研究] 使用OpenOffice 4.1.3試算表(Calc)建立「下拉式選單」來輸入資料
http://shaurong.blogspot.com/2016/12/openoffice-413calc.html
您好,今天下午發布時也遇到跟你類似的困擾,編譯成功執行失敗
回覆刪除發布時出現相依性問題,平台改64就過了
部到伺服器端時 錯誤訊息變成cli_cppuhelper.DLL 找不到指定的模組
後來發現伺服器端也要裝LibreOffice_6.4.2_Win_x64
[研究][ASP.NET]讀取、匯出、寫入、匯入 Excel .xlsx .xls ODF .ods
刪除http://shaurong.blogspot.com/2020/04/caspnetwebform-excel-xlsx-xls-odf-ods.html
Amazing you are. Do you have a github repo for those test? Looking to see more your post.
回覆刪除Thanks.
Sorry ~ No ~
刪除