2012-01-25 26 views
7

tôi thấy đoạn mã sau để tạo ra một tấm excel từ một mẫu hiện tại với các định dạng và thêm dữ liệu vào nó và lưu nó vào một tập tin mớiTạo bảng excel từ mẫu trong Java, phiên bản mới của 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"); ... 

và sau đó lưu nó.

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

Điều này hoàn toàn ổn. Nhưng vấn đề của tôi là tôi đang xử lý các phiên bản mới của excel ngay bây giờ. Vì vậy, tôi cần phát triển một mã tương tự để xử lý phiên bản mẫu mới. Ai đó có thể đề nghị làm thế nào tôi có thể làm điều này? Tôi đã thử thay đổi HSSWorkbook thành XSSFWorkbook. tuy nhiên XSSFWorkbook không có một hàm tạo cho phép tôi chuyển một boolean. Cũng thế. khi tôi thử nó, nó sao chép dữ liệu nhưng các hàng có dữ liệu không giữ lại định dạng của các cột mà khuôn mẫu có.

+0

phiên bản POI bạn đang sử dụng? – oers

Trả lời

8

này sẽ làm việc tốt (mặc dù nó luôn luôn tốt nhất để sử dụng phiên bản mới nhất của POI cho tất cả các bản vá lỗi):

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(); 

Nếu bạn mã chống lại các giao diện, sau đó bạn có thể chỉ cần trao đổi giữa HSSF và XSSF trong hàm tạo của bạn và mã của bạn hoạt động ở cả hai định dạng

+0

Tôi đã thử mã ở trên.Tôi nhận được lỗi sau Ngoại lệ trong chuỗi "chính" java.lang.NoClassDefFoundError: org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet tại java.lang.J9VMInternals.verifyImpl (Phương thức Gốc) tại java.lang.J9VMInternals.verify (J9VMInternals.java:68) tại java.lang.J9VMInternals.initialize (J9VMInternals.java:129) tại com.caremark.eztest.common.utilities.CSVToExcelFileConverter.convertCSVToXLSComprehensive (CSVToExcelFileConverter. java: 80) tại – cma3982

+0

Đảm bảo bạn có phiên bản POI mới nhất và bạn đã bao gồm tất cả [Chum và phụ thuộc của họ] (http://poi.apache.org/overview.html) – Gagravarr

+0

Cảm ơn @Gagravarr Tôi nhận thấy tôi đã không có jar trong môi trường thời gian chạy. Ngoại lệ đó đã biến mất nhưng getCell() trên hàng trả về null và vì vậy tôi cần phải tạo một ô mới trong hàng – cma3982

1

Tôi đã sử dụng XSSF và nó hoạt động tốt.

 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(); 

Chỉ cần thêm sự phụ thuộc này trong pom.xml của maven

<dependency> 
     <groupId>org.apache.poi</groupId> 
     <artifactId>poi-ooxml</artifactId> 
     <version>3.8-beta4</version> 
    </dependency>