2015-06-18 67 views
1

我試圖在java中將兩個.xlsx文件合併到彼此中。但I M莫名其妙地得到一個NullPointerException異常上線在java中合併xlsx文件

 if (cell.getSheet().getWorkbook() == mcell.getSheet() 
         .getWorkbook()) { 
} 

任何的IDE什麼可能導致這個錯誤?當我在合併其他兩個文件之前嘗試,我的代碼工作完美,但現在我改變了文件,現在得到NullPointerException。我嘗試合併的新文件有2張。我只需要合併他們的第一頁。

這裏是我的代碼:

public static void main(String[] args) { 

     try { 

      FileInputStream excellFile1 = new FileInputStream(new File(
        "/Users/TLQ/Desktop/a.xlsx")); 
      FileInputStream excellFile2 = new FileInputStream(new File(
        "/Users/TLQ/Desktop/b.xlsx")); 

      // Create Workbook instance holding reference to .xlsx file 
      XSSFWorkbook workbook1 = new XSSFWorkbook(excellFile1); 
      XSSFWorkbook workbook2 = new XSSFWorkbook(excellFile2); 

      // Get first/desired sheet from the workbook 
      XSSFSheet sheet1 = workbook1.getSheetAt(0); 
      XSSFSheet sheet2 = workbook2.getSheetAt(0); 

      // add sheet2 to sheet1 
      addSheet(sheet1, sheet2); 
      excellFile1.close(); 

      // save merged file 
      File mergedFile = new File(
        "/Users/TLQ/Desktop/Albert.xlsx"); 
      if (!mergedFile.exists()) { 
       mergedFile.createNewFile(); 
      } 
      FileOutputStream out = new FileOutputStream(mergedFile); 
      workbook1.write(out); 
      out.close(); 
      // mergeThemAll(mergedFile); 

     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

    } 

    public static void addSheet(XSSFSheet mergedSheet, XSSFSheet sheet) { 
     // map for cell styles 
     Map<Integer, XSSFCellStyle> styleMap = new HashMap<Integer, XSSFCellStyle>(); 

     // This parameter is for appending sheet rows to mergedSheet in the end 
     int len = mergedSheet.getLastRowNum(); 
     for (int j = sheet.getFirstRowNum(); j <= sheet.getLastRowNum(); j++) { 

      XSSFRow row = sheet.getRow(j); 
      XSSFRow mrow = mergedSheet.createRow(len + j + 1); 

      for (int k = row.getFirstCellNum(); k < row.getLastCellNum(); k++) { 
       XSSFCell cell = row.getCell(k); 
       XSSFCell mcell = mrow.createCell(k); 

       if (cell.getSheet().getWorkbook() == mcell.getSheet() 
         .getWorkbook()) { 
        mcell.setCellStyle(cell.getCellStyle()); 
       } else { 
        int stHashCode = cell.getCellStyle().hashCode(); 
        XSSFCellStyle newCellStyle = styleMap.get(stHashCode); 
        if (newCellStyle == null) { 
         newCellStyle = mcell.getSheet().getWorkbook() 
           .createCellStyle(); 
         newCellStyle.cloneStyleFrom(cell.getCellStyle()); 
         styleMap.put(stHashCode, newCellStyle); 
        } 
        mcell.setCellStyle(newCellStyle); 
       } 

       switch (cell.getCellType()) { 
       case HSSFCell.CELL_TYPE_FORMULA: 
        mcell.setCellFormula(cell.getCellFormula()); 
        break; 
       case HSSFCell.CELL_TYPE_NUMERIC: 
        mcell.setCellValue(cell.getNumericCellValue()); 
        break; 
       case HSSFCell.CELL_TYPE_STRING: 
        mcell.setCellValue(cell.getStringCellValue()); 
        break; 
       case HSSFCell.CELL_TYPE_BLANK: 
        mcell.setCellType(HSSFCell.CELL_TYPE_BLANK); 
        break; 
       case HSSFCell.CELL_TYPE_BOOLEAN: 
        mcell.setCellValue(cell.getBooleanCellValue()); 
        break; 
       case HSSFCell.CELL_TYPE_ERROR: 
        mcell.setCellErrorValue(cell.getErrorCellValue()); 
        break; 
       default: 
        mcell.setCellValue(cell.getStringCellValue()); 
        break; 
       } 
      } 
     } 
    } 

回答

2

row.getCell(k)可以返回null如果沒有Cell在該位置。解決此問題的方法有幾種(例如,讓工作簿在運行中創建單元格),但對於這種情況,檢查null Cell是最簡單和最不耗費資源的選項。

+0

感謝您的回覆。我不知道如果我理解正確,但我在我的代碼中添加了一個try catch塊。但現在我在這裏得到一個NullpointerException; for(int k = row.getFirstCellNum(); k tolquito

+0

我該如何解決這個問題? – tolquito