2012-01-25 96 views
7

新版本,我發現下面的代碼來創建與格式現有模板一個Excel工作表,並添加數據並將其保存到一個新的文件創建從Java的模板Excel工作表,Excel的

POIFSFileSystem fs = new POIFSFileSystem(
      new FileInputStream("template.xls")); 
HSSFWorkbook wb = new HSSFWorkbook(fs, true); 
Will load an xls, preserving its structure (macros included). You can then modify it, 

HSSFSheet sheet1 = wb.getSheet("Data"); ... 

然後保存它。

FileOutputStream fileOut = new FileOutputStream("new.xls"); 
wb.write(fileOut); 
fileOut.close(); 

這工作絕對好。但我的問題是,我正在處理新版本的Excel。所以我需要開發一個類似的代碼來處理新版本的模板。有人可以建議我該怎麼做?我嘗試將HSSWorkbook更改爲XSSFWorkbook。但是XSSFWorkbook沒有讓我傳遞布爾值的構造函數。也。當我嘗試它時,它複製數據,但數據行不保留模板所具有的列的格式。

+0

的pom.xml的這種依賴? – oers

回答

8

這應該工作正常(雖然它總是最好使用最新版本的POI的所有bug修復):

Workbook wb = new XSSFWorkbook(OPCPackage.open("template.xlsx")); 
Sheet sheet = wb.getSheetAt(0); 

// Make changes to the sheet 
sheet.getRow(2).getCell(0).setCellValue("Changed value"); // For example 

// All done 
FileOutputStream fileOut = new FileOutputStream("new.xls"); 
wb.write(fileOut); 
fileOut.close(); 

如果對接口的代碼,那麼你可以HSSF和XSSF之間切換在你的構造函數中,並讓你的代碼適用於這兩種格式

+0

我嘗試了上面的代碼。我在java.lang.J9VMInternals.verifyImpl(Native Method)中獲得了以下線程「main」java.lang.NoClassDefFoundError異常:org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet 。 在java.lang.J9VMInternals.verify(J9VMInternals.java:68) 在java.lang.J9VMInternals.initialize(J9VMInternals.java:129) 在com.caremark.eztest.common.utilities.CSVToExcelFileConverter.convertCSVToXLSComprehensive(CSVToExcelFileConverter。 java:80)at – cma3982

+0

確保你有最新版本的POI,並且你已經包含了所有的[Jars and their dependencies](http://poi.apache.org/overview.html) – Gagravarr

+0

Thanks @Gagravarr我注意到了我沒有在運行時環境中的jar。該異常現在消失了,但行上的getCell()返回null,所以我需要在行中創建一個新的單元格 – cma3982

1

我用XSSF,它工作正常。

 XSSFWorkbook wb = new XSSFWorkbook(new FileInputStream("template.xlsx"));   
     FileOutputStream fileOut = new FileOutputStream("new.xlsx"); 
     //Sheet mySheet = wb.getSheetAt(0); 
     XSSFSheet sheet1 = wb.getSheet("Summary"); 
     XSSFRow row = sheet1.getRow(15); 
     XSSFCell cell = row.getCell(3); 
     cell.setCellValue("Bharthan"); 

     wb.write(fileOut); 
     log.info("Written xls file"); 
     fileOut.close(); 

只需要添加在行家

<dependency> 
     <groupId>org.apache.poi</groupId> 
     <artifactId>poi-ooxml</artifactId> 
     <version>3.8-beta4</version> 
    </dependency> 
您使用的這些POI的版本