2016-01-22 20 views
0

這是我需要做的。使用POITransformer可以在像POI這樣的單元格中寫入嗎?

1) Accept an xlsx/xls file from client. 
2) Backend will receive it in the form of multipart file 
3) The file will be processed and if the format of the data is invalid, that same file will be updated and the error message will be written in the side of the input of the client. 
4) this modified file will be sent back to the user. 

但經過多次嘗試,我無法讓我的代碼工作。

def generateErrorReport(ServletResponse response, Map messageCollections, MultipartFile file, String ext){ 

    FileInputStream fileIn = file.getInputStream() 
    Workbook workbook = (ext.equalsIgnoreCase("xls")) ? new HSSFWorkbook(fileIn) : new XSSFWorkbook(fileIn) 

    workbook = this.getWorkbook((MultipartFile) file, ext.equalsIgnoreCase("xls")); 
    try { 
     Sheet sheet = workbook.getSheetAt(0) 
     Long lastCellNum = sheet.getRow(0).getLastCellNum(); 

     for(int i=1; i<sheet.getLastRowNum(); i++){ 
      if(messageCollections[i]!=null && messageCollections[i]!=[]) { 
       Cell cell = sheet.getRow(i).getCell(lastCellNum + 1) 
       cell.setCellValue(messageCollections[i]); 
      } 
     } 

     fileIn.close() 

     FileOutputStream fileOut = new FileOutputStream((File) file) 
     workbook.write(fileOut); 

     response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") 
     response.setHeader("Content-Disposition", "Attachment;Filename=error.xlsx") 
     response.outputStream << fileOut 
     response.outputStream.flush() 

     fileOut.close() 
    }catch(Exception ex){ 
     println ex 
    } 
} 

現在,我想一個找到的方法來做到這一點,即使用POITransformer。問題是當你有一個模板時使用它。我的想法是使用客戶端發送的文件作爲模板,然後只需在客戶端輸入旁邊寫入錯誤消息。但是我找不到一種方法來編寫它,因爲我找不到setCellData或任何相同的方法。

問題是,是否可以使用POITransformer寫入所需的單元格數據?如果是的話,我會怎麼做?

到目前爲止,這是我所做的。但它仍然沒有寫作。你能告訴我什麼是錯的嗎?

private void bla(ServletResponse response, Map messageCollections, MultipartFile file, String ext){ 
     InputStream is = file.getInputStream(); 
     OutputStream os = response.outputStream; 

     String fileName = "error"; 
     response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); 
     response.setHeader("Content-Disposition", "Attachment;Filename=${fileName}"); 
     try { 

      PoiTransformer transformer = PoiTransformer.createTransformer(is, os); 
      org.apache.poi.ss.usermodel.Workbook workbook = transformer.getWorkbook() 
      Sheet sheet = workbook.getSheetAt(workbook.getActiveSheetIndex()) 
      int lastColNum = sheet.getRow(0).getLastCellNum() 

      Cell cellData; 
      (0..sheet.getLastRowNum()) { 
       if (messageCollections[it]!=null && messageCollections[it]!=[]) { 
        cellData = sheet.getRow(it).getCell(lastColNum+1); 
        cellData.setCellValue(messageCollections[it].toString()) 
       } 
      } 

      transformer.write(); 
     } catch (IOException ex) { 
      println ex 
//   Logger.getLogger(ExcelFileHandler.class.getName()).log(Level.SEVERE, null, ex); 
     } finally { 
      closeStream(is); 
      closeStream(os); 
     } 

    } 

回答

0

希望這個答案對別人有幫助。

InputStream is = file.getInputStream(); 
    OutputStream os = response.outputStream; 

    String fileName = "desiredFilename." + ext 

    response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); 
    response.setHeader("Content-Disposition", "Attachment;Filename=${fileName}"); 
    try { 

     PoiTransformer transformer = PoiTransformer.createTransformer(is, os); 
     org.apache.poi.ss.usermodel.Workbook workbook = transformer.getWorkbook() 
     Sheet sheet = workbook.getSheetAt(workbook.getActiveSheetIndex()) 
     int lastColNum = sheet.getRow(0).getLastCellNum() 

     Cell cell; 

     cell = sheet.getRow(0).getCell(lastColNum); 
     if(cell==null){ 
      cell = sheet.getRow(0).createCell(lastColNum); 
     } 
     cell.setCellType(1) 
     cell.setCellValue("Message") 
     cell.setCellStyle(getStyle(workbook, 2)) 

     for(int it=1; it<sheet.getLastRowNum(); it++) { 
      if (message.get(new Long(it))!=null && message.get(new Long(it))!=[]) { 
       cell = sheet.getRow(it).getCell(lastColNum); 
       if(cell==null){ 
        cell = sheet.getRow(it).createCell(lastColNum); 
       } 
       cell.setCellType(1) 
       cell.setCellValue(message.get(new Long(it)).join(', ')) 
       cell.setCellStyle(getStyle(workbook, 1)) 
      } 
     } 

     sheet.autoSizeColumn(lastColNum); 
     transformer.write(); 
相關問題