2012-01-25 48 views
7

me encontré con el siguiente código para crear una hoja de Excel a partir de una plantilla existente con los formatos y añadir datos en él y guardarlo en un archivo nuevoCreación de hoja de Excel de la plantilla en Java, las nuevas versiones de 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"); ... 

y luego guárdalo.

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

Esto funciona absolutamente bien. Pero mi problema es que ahora estoy lidiando con nuevas versiones de Excel. Entonces necesito desarrollar un código similar para manejar la nueva versión de la plantilla. ¿Puede alguien sugerirme cómo puedo hacer esto? Traté de cambiar HSSWorkbook a XSSFWorkbook. Sin embargo XSSFWorkbook no tiene un constructor que me permite pasar un valor lógico. También. Cuando lo probé, copia los datos, pero las filas con datos no conservan el formato de las columnas que tiene la plantilla.

+0

la versión de POI está usando? – oers

Respuesta

8

Esto debería funcionar bien (aunque siempre es mejor utilizar la última versión de PDI para todas las correcciones de errores):

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

Si el código contra las interfaces, a continuación, puedes cambiar entre HSSF y XSSF en su constructor, y tener su código de trabajo para ambos formatos

+0

Probé el código anterior. Recibo el siguiente error Excepción en el hilo "principal" java.lang.NoClassDefFoundError: org.openxmlformats.schemas.spreadsheetml.x2006.main.CTSheet en java.lang.J9VMInternals.verifyImpl (Método nativo) en java.lang.J9VMInternals.verify (J9VMInternals.java:68) en java.lang.J9VMInternals.initialize (J9VMInternals.java:129) en com.caremark.eztest.common.utilities.CSVToExcelFileConverter.convertCSVToXLSComprehensive (CSVToExcelFileConverter. java: 80) al – cma3982

+0

Asegúrate de que tienes la última versión del PDI, y que ha incluido todas las [tarros y sus dependencias] (http://poi.apache.org/overview.html) – Gagravarr

+0

Gracias @Gagravarr noté No tenía el contenedor en el entorno de tiempo de ejecución. Esa excepción ya no está, pero getCell() en la fila devuelve nulo y entonces necesito crear una nueva celda en la fila – cma3982

1

que utilicé XSSF y está funcionando bien.

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

sólo tiene que añadir esta dependencia en pom.xml de Maven

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