1. 程式人生 > >POI 多個excel 合併到同一個sheet(2003版本)

POI 多個excel 合併到同一個sheet(2003版本)

自己以前找了蠻久,後來發現其實也不是很難。不廢話 上程式碼:

 public void download(String mongoId, HttpServletResponse res) throws IOException, InvalidFormatException {
        
        

        
        FileInputStream fis = null;
        OutputStream os = res.getOutputStream();
        res.reset();
        PolicyDisHub policyDisHub;
        String[] mongids = mongoId.split(",");


        policyDisHub = policyDisHubService.findById(mongids[0]);
        File fileExcel = new File(policyDisHub.getExcelPath()); //地址~ 當然可可以直接用絕對地址測試
        res.setHeader("Content-Disposition", "attachment; filename=" + fileExcel.getName()); 
        res.setContentType("application/octet-stream; charset=utf-8");
        fis = new FileInputStream(fileExcel);


        
        HSSFWorkbook wb = new HSSFWorkbook(fis);
        HSSFSheet sheet = wb.getSheetAt(0);
//        XSSFCellStyle style = wb.createCellStyle(); //樣式
        int startrow = sheet.getPhysicalNumberOfRows(); // 新建一行


        // 第二+N個表格


        PolicyDisHub policyDisHubNext;
        FileInputStream fisNext = null;
        File fileExcelNext;
        HSSFWorkbook wbNext;
        HSSFSheet sheetNext;
        int startrowNext;
        HSSFRow row;
        HSSFCell cell;
        HSSFCellStyle cellStyle = wb.createCellStyle(); 
        cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下邊框  
        cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左邊框  
        cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上邊框  
        cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右邊框 
        for (int mong = 1; mong < mongids.length; mong++) {
            policyDisHubNext = policyDisHubService.findById(mongids[mong]);
            fileExcelNext = new File(policyDisHubNext.getExcelPath());
            fisNext = new FileInputStream(fileExcelNext);
            wbNext = new HSSFWorkbook(fisNext);
            sheetNext = wbNext.getSheetAt(0);
            startrowNext = sheetNext.getPhysicalNumberOfRows(); // 得到行數 列數一定
                                                                //我這裡是知道每個表格的列數,當然不知道的可以獲取一下 ,有相應的方法
            for (int i = 0; i < startrowNext - 1; i++) {
                row = sheet.createRow(startrow + i);
                for (int j = 0; j < 100; j++) {
                    cell = row.createCell(j);
                    cell.setCellStyle(cellStyle);
                    
                    if (sheetNext.getRow(i + 1).getCell(j) == null) {
                        cell.setCellValue("");
                    } else {
                        cell.setCellValue(sheetNext.getRow(i + 1).getCell(j).toString());
                    }
                    
                }
            }
            startrow = startrow + startrowNext - 1;
            policyDisHubNext = null;
          
        }
        try {
            wb.write(os);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (os != null) {
                os.close();
            }
            if (fisNext != null) {
                fisNext.close();
            }
            if (fis != null) {
                fis.close();
            }
        }


        System.out.print("OK");


    }

此方法為相同格式的excel表格的合併,採用的是2003版本。其中 XSSF為2007版本,但是目前發現其new 時會有很大的延遲,同時記憶體佔用率很高。

這點不知道是不是為POI本身的問題,求解這個問題! 2003版本有行數限制,上限為6W多行吧~

希望對大家有用,另外 如果哪位有2007  XSSF 那個new問題的解決方案,請賜教啊~