2013-01-07 49 views
0

我嘗試保存Excel文件。 Excel文件是帶有makros(* .xltm)的模板。我可以打開文件並編輯內容,但如果我嘗試保存目標Excel文件已損壞。 我嘗試將文件保存爲:使用OLE,Java在Eclipse上保存Excel文件RCP應用程序

int id = _workbook.getIDsOfNames(new String[] {"Save"})[0]; 
_workbook.invoke(id); 

或/和

_xlsClientSite.save(_file, true); 

回答

1

您可以嘗試在你的將通話指定的文件格式。

如果幸運的話,您可以在Excel幫助中找到所需的文件格式代碼。如果你在那裏找不到你需要的東西,那麼你必須用OLEVIEW.EXE程序弄髒你的手。在某處可能會有一份拷貝放在您的硬盤上,但如果沒有,很容易就可以通過快速Google搜索找到一份拷貝。

要使用OLEView.exe這類

  • 運行它
  • 裂縫打開 '類型庫' 條目
  • 找到您使用的是
  • 打開該項目的Excel版本
  • 搜索顯示爲字符串'XlFileFormat'的大量文本
  • Examin E中的XLFileFormat枚舉的代碼,看來如果您正在使用的Office2007( 「Excel12」)像我,你可以嘗試這些值中的一個有前途的

  • xlOpenXMLWorkbookMacroEnabled = 52
  • xlOpenXMLTemplateMacroEnabled = 53

下面是我用它來保存Excel文件的方法使用OLE:

/** 
* Save the given workbook in the specified format. 
* 
* @param controlSiteAuto the OLE control site to use 
* @param filepath the file to save to 
* @param formatCode XlFileFormat code representing the file format to save as 
* @param replaceExistingWithoutPrompt true to replace an existing file quietly, false to ask the user first 
*/ 
public void saveWorkbook(OleAutomation controlSiteAuto, String filepath, Integer formatCode, boolean replaceExistingWithoutPrompt) { 
    Variant[] args = null; 
    Variant result = null; 
    try { 
     // suppress "replace existing?" prompt, if necessary 
     if (replaceExistingWithoutPrompt) { 
      setPropertyOnObject(controlSiteAuto, "Application", "DisplayAlerts", "False"); 
     } 

     // if the given formatCode is null, for some reason, use a reasonable default 
     if (formatCode == null) { 
      formatCode = 51; // xlWorkbookDefault=51 
     } 

     // save the workbook 
     int[] id = controlSiteAuto.getIDsOfNames(new String[] {"SaveAs", "FileName", "FileFormat"}); 
     args = new Variant[2]; 
     args[0] = new Variant(filepath); 
     args[1] = new Variant(formatCode); 
     result = controlSiteAuto.invoke(id[0], args); 

     if (result == null || !result.getBoolean()) { 
      throw new RuntimeException("Unable to save active workbook"); 
     } 

     // enable alerts again, if necessary 
     if (replaceExistingWithoutPrompt) { 
      setPropertyOnObject(controlSiteAuto, "Application", "DisplayAlerts", "True"); 
     } 
    } finally { 
     cleanup(args); 
     cleanup(result); 
    } 
} 

protected void cleanup(Variant[] variants) { 
    if (variants != null) { 
     for (int i = 0; i < variants.length; i++) { 
      if (variants[i] != null) { 
       variants[i].dispose(); 
      } 
     } 
    } 
} 
+0

我試試這個解決方案,但結果是一個空的Excel文件。 – ChHaupt

+0

沒有任何Excel工作表。我使用Excel 2010並嘗試formatCode 52和53. – ChHaupt

+0

我沒有Excel 2010,但有一點谷歌搜索導致我相信代碼沒有從Excel 2007中更改過。不可能在Excel工作簿中沒有工作表它。我看到的一件事是,通過這種OLE機制創建的工作簿有時會在Excel應用程序框架內出現奇怪的「窗口位置」(它們「不在視圖中」)。嘗試打開您生成的工作簿,然後選擇View-> Arrange All-> Cascade,並查看是否「將工作簿拉入視圖中。」 – stracka