2013-05-13 89 views
0

我無法更新現有的excel單元,這些單元被合併和邊界。我創建了一個樣式的Excel文件,並將其用作模板。在我的代碼 - >首先讀取該Excel文件並更新我希望的單元格。沒有合併單元格。但合併的單元格不能插入數據。如何使用Apache poi更新現有的合併Excel單元

可能會產生損壞Excel文件或空數據單元。我不想覆蓋現有單元格的合併和邊界。這裏我的代碼閱讀和更新..

HashMap<String, ByteArrayOutputStream> streams = new HashMap<String, ByteArrayOutputStream>(); 
try { 
    String appDir = System.getProperty("appDir"); 
    String resouceDir = appDir + System.getProperty("resourceDir"); 
    String templateDir = resouceDir + "/template"; 
    if (streams.keySet().size() <= 0) { 
     XSSFSheet sheet = null; 
     FileInputStream file = new FileInputStream(new File(templateDir +"/shipping_template.xlsx")); 
     XSSFWorkbook workbook = new XSSFWorkbook(file); 
     ByteArrayOutputStream baos = null; 
     sheet = workbook.getSheetAt(0); 
     XSSFRow shippingRow = sheet.getRow(4); 
     Cell cell = shippingRow.createCell((short) 36); 
     cell.setCellValue("DOOM Bringer"); 
     baos = new ByteArrayOutputStream(); 
     workbook.write(baos); 
     streams.put(param, baos); 
     baos.close(); 
     file.close(); 
    } 
} 

回答

1

不幸的是,Apache POI不再支持。他們對辦公文檔的完成方式做了一個版本的Office 2007更改,不再支持這一點。我做了同樣的事情,你可能要考慮使用docx4j。但不管你真正需要做什麼,可能會打開一個文件流一個新文檔,並將其保存到臨時位置,並對新文檔進行更改,因爲如果嘗試對其進行更改,可能會損壞原始文檔。

+0

感謝您的建議,但我不想把它保存在任何目錄作爲我的項目需求。這是創建並保存在內存中通過錨標籤下載。我意識到它不能像這樣更新。這有太多的鍋爐代碼來創建合併或跨度單元格。 – Cataclysm 2013-05-16 10:25:21

+0

其實當我說保存臨時副本時,我的意思是打開一個臨時存儲並將其保存到內存然後更新該臨時值,然後如果用戶選擇保存它。一旦關閉流,臨時副本就消失了。它與Microsoft開放的文檔一樣。當您打開Word文檔時,Office將打開一個包含臨時文檔的流,它將位於實際文檔的相同位置,並且將具有〜$作爲該名稱的第一個字符。知道我在說什麼? – yams 2013-05-17 14:04:41

+0

是的,你是對的。提前致謝。我會檢查我的代碼。 – Cataclysm 2013-05-18 07:48:35

0

這個工作對我來說

CellRangeAddress region = sheet.getMergedRegion(index); 
int rowNum = region.getFirstRow(); // or region.getLastRow() 
int colIndex = region.getFirstColumn(); // or region.getLastColumn() 
Cell dateCell = sheet.getRow(rowNum).getCell(colIndex); 
dateCell.setCellValue(today.toString("MM/dd/yyyy")); 
相關問題