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問題的解決方案,請賜教啊~