vs+openoffice

參考1:

    大家好!想必大家都知道OpenOffice這個一個跨平臺的免費辦公軟件吧!OpenOffice是Apache的開源項目,不僅僅使用起來方便,它還具備一個強大的開發套件——UNO組件.這也使得我們開發者可以在不同平臺,不同語言下開發辦公類軟件.其實OpenOffice的架構非常清晰,學習起來難度不會特別大,而且也非常有趣.其功能也是相當強大,可以操作很多類型的文件,例如MS office的文件,時下比較流行的pdf文檔,jpg圖片等各種文件.建議有這方面需要的朋友去學習下如何使用OpenOffice.不過使用OpenOffice還有個小問題,就是環境配置非常的麻煩,特別是for vc++,這個可能難倒了不少初學者.在此我總結了一些方法並且記錄下來,讓自己方便翻看的同時也幫助一些初學的朋友們.

  在開始前,我首先要說明下,我引用過的資料.分別是 

  http://blog.csdn.net/douyangyang/article/details/4085703 小南地帶的文章

  http://www.codeproject.com/KB/wtl/Wtl_OOo.aspx 的Alain Rist的文章,有一些腳本和配置的東西都是來自他們的文章的

  好吧,廢話說了這麼多,讓我們開始正題吧!

  

  1.首先我們要去下載OpenOffice.org和OpenOffice.org SDK我們可以在http://www.openoffice.org/download/http://www.openoffice.org/download/other.html#tested-sdk找到它們,記得要下windows的喔!

  分別安裝OpenOffice.org和SDK

  安裝就不多說了,值得說下的SDK的安裝目錄下面有個index.html,打開可以裏面有很很多關於安裝和使用的好東東
  Installation Guide是必須要看下的,裏面有很多關於配置方面的.

  Developer's Guide就儘量下載回來,非常全面,講述了OpenOffice的技術原理和API用法,可惜例子都是java的,不過相信對各位搞C++朋友來說,看懂也不會成爲一個很大的障礙吧~
  

  2.好,第二步就是下載一些必要的軟件

    (1)JDK (1.4.1_01 or higher) 地址 http://java.sun.com/products,這個不是必須的,可以根據自己的語言需求來下載

    (2)C++ compiler...

     沒有的話我就不知道說什麼好了..反正有vs就可以了- -!

     ps:我的配置使用vs2008的,vc6和其他會怎麼樣,我也不太清楚,不過應該問題不大.
    (3)Microsoft .NET Framework SDK version 1.0 or higher
      也是可選的,如果你安裝vs的時候有安裝了C#模塊就會有的了~

    (4)GNU make (3.79.1 or higher)

      這個必須有,你可以在http://sourceforge.net/projects/mingw/files/找到它
      我是下載了mingw-get-inst那個的~注意不要下了Cygwin的make tool,可能會有問題

      PS:在解壓安裝完以後,找到<安裝目錄>/bin下的mingw32-make.exe,並且在這個目錄下改名備份一個make.exe

    (5)zip tool (2.3 or higher) 

      必須的,你可以到http://www.info-zip.org找到,我下載的是Wiz,記得下win32的

   嗯~如果你都下好了,那就可以正式開始配置了.

  3.找到SDK安裝目錄下的一個setsdkenv_windows.bat,它是用來批處理環境變量的,你配置好它以後,每次編譯例子的時候就在CMD先使用它來設置好即可

  

  我們首先看到的是要我們輸入一個SDK路徑,"[]"裏面的是它從系統環境變量讀取出來的值,你可以修改,不修改就直接enter跳過

  然後分別是mingw32-make.exezip.exe的目錄,例如:我的mingw32-make.exe在g:/MinGW/bin/mingw32-make.exe,那就輸入g:/MinGW/bin即可

  接下來分別是c++,java,c#編譯器的設置,vc++的就是<vs安裝目錄>/vc/bin,其他的也是類似的,因爲是可選的項如果你不願意輸入就直接enter跳過,

  它會詢問你是否跳過,我們輸入"YES"即可忽略.

  

  最後批處理程序還會讓你設定一個默認的編譯輸出目錄,以後你使用這個方法編譯的東東都會輸出到那裏去,

  在這裏我們可以直接使用默認好的.

  最後再輸入一次"YES"就可以了.
  都設置好了以後程序會生成一個setsdkenv_windows.bat
  
在winXP下是在C:/Documents and Settings/<用戶名>/Application Data/<openoffice版本名>/setsdkenv_windows.bat

  而win7就是在C:/Users/<用戶名>/AppData/Roaming/<openoffice版本名>/setsdkenv_windows.bat

  這個要根據個人的操作系統去找.

  經過一次設定一個SDK目錄下的setsdkenv_windows.bat就不會再"運行"了,只會調用剛剛生成的新程序,如果你想重新設定,可以把新生成的程序刪除掉即可.

  完成這些以後,我們的初步設置已經完成了.

  我們可以去編譯一下SDK目錄下examples的文件
  我們可以打開CMD然後,

  (1)運行setsdkenv_windows.bat

  (2)cd到sdk的例子目錄,例如我的是"cd G:\OpenOfficeSDK\sdk\examples\cpp\DocumentLoader"

  (3)輸入make或者mingw32-make來編譯.

  PS:你可以你默認的輸出目錄找到編譯好的文件,然後在裏面的include可以找到很多SDK開發需要的但是SDK又沒有的頭文件!(至於爲什麼這樣,爲什麼一開始沒有...我也不明白,有高手知   道的..也請告訴下我)

  好了,編譯SDK自帶examples的配置到這裏就結束了.如果setsdkenv_windows.bat提示類似err:XXXXXX is missing這樣的錯誤,你就應該參考Installation Guide的環境變   量配置,到計算機->屬性->高級系統設置 裏面找到 環境變量 ,並且在當前用戶的那個項下面配置好環境變量.

  但是我們可是要在VC下開發啊,下面我將介紹下一些比較方便的配置方法,

  這些方法都是把http://blog.csdn.net/douyangyang/article/details/4134816小南地帶的方法稍微進行改進下的.

  好了,在開始前我先要上一個來自http://www.codeproject.com/KB/wtl/Wtl_OOo.aspx 的Alain Rist的腳本文件

  

複製代碼
  1 // OOoCpp.js
  2 //
  3 // OpenOffice.org 3.0 SDK C++ code generation
  4 //
  5 // Note: This script MUST be run from the OpenOffice.org 3.0 SDK folder: <OpenOffice.org_3.0_SDK>\sdk
  6 //
  7 // Copyright (c) Alain Rist 2008, 2009
  8 //
  9 // The use and distribution terms for this software are covered by the
 10 // Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php)
 11 // By using this software in any fashion, you are agreeing to be bound by
 12 // the terms of this license. You must not remove this notice, or
 13 // any other, from this software.
 14 
 15 
 16 // Elevated privilege check
 17 try 
 18 {
 19     var bElevated = false;
 20     var Args = WScript.Arguments;
 21     for (var i = 0; i < Args.length; i++)
 22         if (bElevated = (Args(i) == "/elevated"))
 23             break;
 24 
 25     var AppShell = WScript.CreateObject("Shell.Application");
 26 
 27     if (!bElevated && AppShell.IsRestricted("System", "EnableLUA"))
 28         throw (WScript.Interactive == true) ? "Restricted" : "Elevation required.";
 29 }
 30 catch (e) 
 31 {
 32     if (e == "Restricted")
 33         AppShell.ShellExecute("WScript.exe", "\"" + WScript.ScriptFullName + "\"" + " /elevated", null, "RunAs");
 34     else
 35         WScript.Echo("Error: " + e);
 36 
 37     WScript.Quit();
 38 }
 39 
 40 // OpenOffice.org 3.0 SDK C++ code generation
 41 try 
 42 {
 43     var fso = WScript.CreateObject("Scripting.FileSystemObject");
 44     var SDKBase = fso.GetParentFolderName(WScript.ScriptFullName);
 45     
 46     var Prog = SDKBase + "\\bin\\cppumaker.exe";
 47     if (!fso.FileExists(Prog))
 48         throw(Prog +" not found!\n");
 49 
 50     var Dest = SDKBase + "\\includecpp";
 51     if (!fso.FolderExists(Dest))
 52         fso.CreateFolder(Dest);
 53 
 54     var shell = WScript.CreateObject("WScript.Shell");
 55 
 56     var Key = "\\SOFTWARE\\OpenOffice\.org\\Layers_\\OpenOffice.org\\3\\";
 57     var InstallKey = "HKCU" + Key;
 58     
 59     try 
 60     {
 61         shell.RegRead(InstallKey);
 62     }
 63     catch (e) 
 64     {
 65         InstallKey = "HKLM" + Key;
 66         shell.RegRead(InstallKey);
 67     }
 68         
 69     var Source1 = shell.RegRead(InstallKey + "UREINSTALLLOCATION") + "misc\\types.rdb";
 70     if (!fso.FileExists(Source1))
 71         throw(Source1 + " not found!\n");
 72 
 73     var Source2 = shell.RegRead(InstallKey + "BASISINSTALLLOCATION") + "Program\\offapi.rdb";
 74     if (!fso.FileExists(Source2))
 75         throw (Source2 + " not found!\n");
 76         
 77     shell.CurrentDirectory = shell.RegRead(InstallKey + "UREINSTALLLOCATION") + "bin"
 78     var Command = Prog + " -BUCR -O  \"" + Dest + "\" \"" + Source1 + "\" \"" + Source2 + "\"";
 79     var exec = shell.Exec(Command);
 80     
 81     var PropFile = SDKBase + "\\OOo.vsprops";
 82     if (fso.FileExists(PropFile)) 
 83     {
 84         var ts = fso.OpenTextFile(PropFile, 1);
 85         var Text = ts.ReadAll();
 86         ts.Close();
 87         Text = Text.replace(/Value=".+"/, "Value=\"" + SDKBase + "\"");
 88         ts = fso.OpenTextFile(PropFile, 2);
 89         ts.Write(Text);
 90         ts.Close();
 91         shell.Popup("Path updated to " + SDKBase + " in OOo.vsprops", 10, WScript.ScriptName, 64);
 92     }
 93     
 94     while (exec.Status == 0) 
 95         WScript.Sleep(100);
 96 
 97     if (exec.ExitCode)
 98         WScript.Echo(Command + "\nReturned: " + exec.ExitCode);
 99     else 
100     {
101         WScript.Echo(Command + "\nExecuted without error.");
102         shell.Run(SDKBase);
103     }
104 }
105 
106 catch (e) 
107 {
108     WScript.Echo("Error " + e);
109 }
複製代碼

  這個腳本本來有一個地方是有錯誤的,Alain Rist也提到了,不過它已經被我修改好了,就是56行的Layers_那裏,貌似英文版的是Layers,所以是會出錯的.把這個腳本保存成OOoCpp.js在   SDK的.../sdk/的安裝目錄下

  運行!

  如果沒有error出來,那麼!恭喜你!你已經配置好了.如果沒有成功,我後面會說說手動配置的方法

  接下來,我們假設已經成功

  我們需要把一下的代碼修改下,並且保存成OOo.vsprops到你每一個需要用到OpenOffice的工程下,這個文件只是一個vs的屬性設定文件,如果不使用它,講意味着你需要自己手動配置vs,   這個是比較麻煩的

  

複製代碼
 1 <?xml version="1.0" encoding="Windows-1252"?>
 2 <VisualStudioPropertySheet
 3     ProjectType="Visual C++"
 4     Version="8.00"
 5     Name="OOo"
 6     >
 7     <Tool
 8         Name="VCCLCompilerTool"
 9         AdditionalIncludeDirectories="&quot;$(OOoSdkDir)\include&quot;;&quot;$(OOoSdkDir)\includecpp&quot;"
10         PreprocessorDefinitions="WNT"
11     />
12     <Tool
13         Name="VCLinkerTool"
14         AdditionalDependencies="isal.lib icppu.lib icppuhelper.lib isal.lib isalhelper.lib ireg.lib stlport_vc71.lib"
15         AdditionalLibraryDirectories="$(OOoSdkDir)\lib"
16         DelayLoadDLLs="sal3.dll;cppu3.dll;cppuhelper3MSC.dll"
17     />
18     <UserMacro
19         Name="OOoSdkDir"
20         Value="G:\OpenOfficeSDK\sdk"
21         PerformEnvironmentSet="true"
22     />
23 </VisualStudioPropertySheet>
複製代碼

  值得注意的是,在http://www.codeproject.com/KB/wtl/Wtl_OOo.aspx 上下載到的這個屬性文件有個地方有點問題,就是irmcxt.lib,這個lib貌似在OpenOffice3.4的版本就已經沒有了,我重裝過SDK幾次都沒有發現,我猜測可能被合併去另外的了,可能能在一些地方生成,但是我實在不清楚,如果有高手看到,請幫我指正下~感激不盡!

  然後,根據每個人的電腦,這個屬性文件是需要修改的,就是在20行的字符串裏,它是一個指向SDK安裝目錄的字符串,我的是G:\OpenOfficeSDK\sdk,各位朋友請自行修改.

  搞好了以後,我們打開vs,在項目->屬性->配置屬性->常規->繼承的項目屬性表上面填寫OOo.vsprops的路徑就可以了,

如果你放在項目下了,就直接./OOo.vsprops就可以了.

  好了,最後一步就是複製下Alain Rist的代碼了,我在這裏就直接貼出來了,但是我們要注意,在引用他的代碼的時候寫明出處和作者! http://www.codeproject.com/KB/wtl/Wtl_OOo.aspx Alian Rist

  

複製代碼
 1 //Alian Rist
 2 #include <Windows>
 3 inline LRESULT FindInstallAndSetPath()
 4 {
 5     // OpenOffice.org 3 installation key
 6     static LPCWSTR sSubKey = L"SOFTWARE\\OpenOffice.org\\Layers_\\URE\\1";
 7     HKEY hk = NULL;
 8 
 9     // check for machine install
10     LRESULT lRes = ::RegOpenKeyEx(HKEY_LOCAL_MACHINE, sSubKey, 0, KEY_READ, &hk);
11 
12     // check for user install
13     if (lRes != ERROR_SUCCESS)
14         if (::RegOpenCurrentUser(KEY_READ, &hk) == ERROR_SUCCESS)
15             lRes = ::RegOpenKeyEx(hk, sSubKey, 0, KEY_READ, &hk);
16 
17     if (lRes != ERROR_SUCCESS)
18         return lRes;
19 
20     // Allocate new PATH environment variable 
21     PVOID pNewPath = calloc(MAX_PATH, sizeof(WCHAR));
22     if (!pNewPath)
23         return GetLastError();
24 
25     // Get the UREINSTALLLOCATION directory 
26     DWORD dwsize = MAX_PATH;
27     PWCHAR sNewPath = (PWCHAR)pNewPath;
28     if (lRes = RegQueryValueEx(hk, L"UREINSTALLLOCATION", NULL, NULL, (LPBYTE)sNewPath, &dwsize) == ERROR_SUCCESS)
29         lRes = wcsncat_s(sNewPath + wcslen(sNewPath), MAX_PATH - wcslen(sNewPath), L"bin;", 4);
30     RegCloseKey(hk);
31 
32     // Return if no UREINSTALLLOCATION directory 
33     if (lRes != ERROR_SUCCESS)
34     {
35         free(pNewPath);
36         return lRes;
37     }
38 
39     // Get the old PATH environment variable
40     size_t sizeOldPath;
41     lRes = _wgetenv_s(&sizeOldPath, NULL, 0, L"PATH");
42     LPWSTR sOldPath = (PWCHAR)malloc(sizeOldPath * sizeof(WCHAR));
43     if (sOldPath && SUCCEEDED(lRes))
44         lRes = _wgetenv_s(&sizeOldPath, sOldPath, sizeOldPath, L"PATH");
45 
46     // Add directory to PATH if not already there
47     if (SUCCEEDED(lRes) && !wcsstr(sOldPath, sNewPath))
48     {
49         // Resize mem for new PATH environment variable
50         if (sNewPath = (PWCHAR)(pNewPath = realloc(pNewPath, (wcslen(sNewPath) + sizeOldPath) * sizeof(WCHAR))))
51             // Append old PATH content to new
52             if SUCCEEDED(lRes = wcsncat_s(sNewPath + wcslen(sNewPath), sizeOldPath, sOldPath, sizeOldPath))
53                 // Change PATH environment variable
54                 lRes = _wputenv_s(L"PATH", sNewPath);
55     }
56 
57     // Cleanup
58     free(sOldPath);
59     free(pNewPath);
60 
61     return lRes;
62 }
複製代碼

  如你所見,這個是一個啓動openoffice一些加載項的函數,有了它我們可以更方便,直接複製到代碼裏面,然後在使用openoffice組件之前調用這個函數就可以了!

  下面,前面提到在使用腳本失敗的朋友可以看看如何手動配置.

  我們可以發現SDK安裝目錄下.../sdk/bin下面有一個cppumaker.exe,它需要OpenOffice安裝目錄下.../URE/bin下面的一些dll,我們可以全部複製過去.

  然後我們到.../sdk/下建立一個includecpp文件夾,再到CMD下cd到cppumaker.exe所在的目錄,例如我的是"G:\OpenOfficeSDK\sdk\bin",然後直接使用cppumaker -BUCR -O "G:\OpenOfficeSDK\sdk\includecpp C:\Program Files\OpenOffice.org 3\URE\misc\types.rdb" "C:\Program Files\OpenOffice.org 3\URE\misc\services.rdb"這句命令,注意,裏面有些路徑是我的,各位朋友自己修改下吧.然後,手動生成的頭文件就完成了.手動配置也就到這裏了.

  到這裏,所有的配置方法和技巧都介紹完畢了.本來想貼些代碼上來的,但是又沒時間去搞些簡單的例子,這裏介紹各位朋友去看看http://blog.csdn.net/douyangyang/article/details/4152914 小南地帶的這篇代碼解說.希望各位朋友能迅速掌握openoffice的開發技巧,之後會陸續貼上一些例子和openoffice的一些原理講解,這個就..下回分解吧~

參考2:

其中JS腳本需要注意:

1、分64與32位版本,兩版本註冊表位置不一樣

64.js

複製代碼
  1 // OOoCpp.js
  2  //
  3  // OpenOffice.org 3.0 SDK C++ code generation
  4  //
  5  // Note: This script MUST be run from the OpenOffice.org 3.0 SDK folder: <OpenOffice.org_3.0_SDK>\sdk
  6  //
  7  // Copyright (c) Alain Rist 2008, 2009
  8  //
  9  // The use and distribution terms for this software are covered by the
 10  // Common Public License 1.0 (http://opensource.org/osi3.0/licenses/cpl1.0.php)
 11  // By using this software in any fashion, you are agreeing to be bound by
 12  // the terms of this license. You must not remove this notice, or
 13  // any other, from this software.
 14  
 15  
 16  // Elevated privilege check
 17  try 
 18  {
 19      var bElevated = false;
 20      var Args = WScript.Arguments;
 21      for (var i = 0; i < Args.length; i++)
 22          if (bElevated = (Args(i) == "/elevated"))
 23              break;
 24  
 25      var AppShell = WScript.CreateObject("Shell.Application");
 26  
 27      if (!bElevated && AppShell.IsRestricted("System", "EnableLUA"))
 28          throw (WScript.Interactive == true) ? "Restricted" : "Elevation required.";
 29  }
 30  catch (e) 
 31  {
 32      if (e == "Restricted")
 33          AppShell.ShellExecute("WScript.exe", "\"" + WScript.ScriptFullName + "\"" + " /elevated", null, "RunAs");
 34      else
 35          WScript.Echo("Error: " + e);
 36  
 37      WScript.Quit();
 38  }
 39  
 40  // OpenOffice.org 3.0 SDK C++ code generation
 41  try 
 42  {
 43      var fso = WScript.CreateObject("Scripting.FileSystemObject");
 44      var SDKBase = fso.GetParentFolderName(WScript.ScriptFullName);
 45      
 46      var Prog = SDKBase + "\\bin\\cppumaker.exe";
 47      if (!fso.FileExists(Prog))
 48          throw(Prog +" not found!\n");
 49  
 50      var Dest = SDKBase + "\\includecpp";
 51      if (!fso.FolderExists(Dest))
 52          fso.CreateFolder(Dest);
 53  
 54      var shell = WScript.CreateObject("WScript.Shell");
 55  
 56      var Key = "\\SOFTWARE\\Wow6432Node\\OpenOffice\.org\\Layers_\\OpenOffice.org\\3\\";
 57      var InstallKey = "HKCU" + Key;
 58      
 59      try 
 60      {
 61          shell.RegRead(InstallKey);
 62      }
 63      catch (e) 
 64      {
 65          InstallKey = "HKLM" + Key;
 66          shell.RegRead(InstallKey);
 67      }
 68          
 69      var Source1 = shell.RegRead(InstallKey + "UREINSTALLLOCATION") + "misc\\types.rdb";
 70      if (!fso.FileExists(Source1))
 71          throw(Source1 + " not found!\n");
 72  
 73      var Source2 = shell.RegRead(InstallKey + "BASISINSTALLLOCATION") + "Program\\offapi.rdb";
 74      if (!fso.FileExists(Source2))
 75          throw (Source2 + " not found!\n");
 76          
 77      shell.CurrentDirectory = shell.RegRead(InstallKey + "UREINSTALLLOCATION") + "bin"
 78      var Command = Prog + " -BUCR -O  \"" + Dest + "\" \"" + Source1 + "\" \"" + Source2 + "\"";
 79      var exec = shell.Exec(Command);
 80      
 81      var PropFile = SDKBase + "\\OOo.vsprops";
 82      if (fso.FileExists(PropFile)) 
 83      {
 84          var ts = fso.OpenTextFile(PropFile, 1);
 85          var Text = ts.ReadAll();
 86          ts.Close();
 87          Text = Text.replace(/Value=".+"/, "Value=\"" + SDKBase + "\"");
 88          ts = fso.OpenTextFile(PropFile, 2);
 89          ts.Write(Text);
 90          ts.Close();
 91          shell.Popup("Path updated to " + SDKBase + " in OOo.vsprops", 10, WScript.ScriptName, 64);
 92      }
 93      
 94      while (exec.Status == 0) 
 95          WScript.Sleep(100);
 96  
 97      if (exec.ExitCode)
 98          WScript.Echo(Command + "\nReturned: " + exec.ExitCode);
 99      else 
100      {
101          WScript.Echo(Command + "\nExecuted without error.");
102          shell.Run(SDKBase);
103      }
104  }
105  
106  catch (e) 
107  {
108      WScript.Echo("Error " + e);
109  }
複製代碼

32.js,去掉“Wow6432Node”即可

那個OOo.vsprops我沒用起來,直接設置的:

目錄設置

要使用$(OOoSdkDir),需要添加OOoSdkDir環境變量

C/C++

 

LIB、 DLL

還要注意:需要自己添加

#define CPPU_ENV msci

對函數 FindInstallAndSetPath也要修改:

要加入32/64位系統判斷,

註冊表位置(參考js)

 

另外,OUString::createFromAscii 相當不好

最好這樣使用:

OUString sDocUrl(sFile1); 

OUString sSaveUrl(sFile2);

因爲,sFile1 可能包含有非Ascii字符,這要出錯的!

 

 

-------------------

Reference<XStorable> rStore (xWriterComponent, UNO_QUERY);  

   如果sSaveUrl格式是OO的標準格式(odl、...)好像可以直接用下面這個
    rStore->storeAsURL( sSaveUrl, Sequence < ::com::sun::star::beans::PropertyValue >() );  

  否則要這樣:

    Sequence<PropertyValue> storeProps(1);  
    storeProps[0].Name = OUString::createFromAscii("FilterName");  
    storeProps[0].Value = Any( OUString::createFromAscii("MS Word 97") );
    rStore->storeAsURL( sSaveUrl, storeProps);

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章