工作中會遇到需要導出一些表格,有些表格不但需要合併列,行也需要合併。像下面我遇到的這種
我採用的是根據一個excel模板在其基礎上,再次拼接,(橫向表頭充當模板,左側的合併行是後期我拼接的)
FileInputStream fis = new FileInputStream("d:/table4.xlsx");//模板文件
XSSFWorkbook workBook=new XSSFWorkbook(fis);
XSSFCellStyle style = CellStyle.getStyle(workBook);
XSSFSheet sheet=workBook.cloneSheet(0); //進行模板的克隆
workBook.setSheetName(1, "領導人員、配偶、子女及其他親屬經商辦企業處理情況統計彙總表 "); //給sheet命名
拼接方式(開始行,結束行,開始列,結束列)。這裏只舉例一行
XSSFRow row=sheet.createRow(4);
//第一行 -------------------------------------start------------------------------
XSSFCell cell1=row.createCell(0);
sheet.addMergedRegion(new CellRangeAddress(4,4, 0,2)); //合併單元格
XSSFCell cell2=row.createCell(3);
XSSFCell cell3=row.createCell(4);
XSSFCell cell4=row.createCell(5);
XSSFCell cell5=row.createCell(6);
XSSFCell cell6=row.createCell(7);
XSSFCell cell7=row.createCell(8);
XSSFCell cell8=row.createCell(9);
XSSFCell cell9=row.createCell(10);
XSSFCell cell10=row.createCell(11);
XSSFCell cell11=row.createCell(12);
XSSFCell cell12=row.createCell(13);
XSSFCell cell13=row.createCell(14);
XSSFCell cell14=row.createCell(15);
XSSFCell cell15=row.createCell(16);
XSSFCell cell16=row.createCell(17);
cell1.setCellValue("一、本人及親屬經商辦企業領導人員人數(人)");
cell2.setCellValue(Integer.parseInt(vo.getBm_zjl()));
cell3.setCellValue(Integer.parseInt(vo.getBm_fzjl()));
cell4.setCellValue(Integer.parseInt(vo.getBm_ksjl()));
cell5.setCellValue(Integer.parseInt(vo.getBm_ld_jl()));
cell6.setCellValue(Integer.parseInt(vo.getBm_ks_jl()));
cell7.setCellValue(Integer.parseInt(vo.getBm_tx()));
cell8.setCellValue(Integer.parseInt(vo.getBm_sum()));
cell9.setCellValue(Integer.parseInt(vo.getGs_zjl()));
cell10.setCellValue(Integer.parseInt(vo.getGs_fzjl()));
cell11.setCellValue(Integer.parseInt(vo.getGs_bmjl()));
cell12.setCellValue(Integer.parseInt(vo.getGs_ld_jl()));
cell13.setCellValue(Integer.parseInt(vo.getGs__bm_jl()));
cell14.setCellValue(Integer.parseInt(vo.getGs_tx()));
cell15.setCellValue(Integer.parseInt(vo.getGs_sum()));
cell16.setCellValue(Integer.parseInt(vo.getSum()));
拼接完成之後,就可以輸出了
//cell2.setCellStyle(style); //給單元格添加樣式
workBook. removeSheetAt(0); //移除workbook中的模板sheet
workBook.write(out);
fis.close();
out.flush();
out.close();
如果只寫到這裏,也可以直接導出,只不過需要給出一個默認的導出目錄,我給的例子裏有。另外一般是,點擊導出的時候提示下載,自己選擇目錄,這個比較常見,如下:
public ResponseEntity<byte[]> reportF4FeedBack(HttpServletRequest request,String workUnit,String workType) throws Exception{
ByteArrayOutputStream out = new ByteArrayOutputStream();
// 中間是查詢封裝list
//拼接excel
//判斷是否是IE11
Boolean flag= request.getHeader("User-Agent").indexOf("like Gecko")>0;
String fileName = "領導人員、配偶、子女及其他親屬經商辦企業處理情況統計彙總表_"+DateUtil.getCurDateStrDef()+".xlsx";
try {
if (request.getHeader("User-Agent").toLowerCase().indexOf("msie") >0||flag){
fileName = URLEncoder.encode(fileName, "UTF-8");//IE瀏覽器
}else {
//先去掉文件名稱中的空格,然後轉換編碼格式爲utf-8,保證不出現亂碼,
//這個文件名稱用於瀏覽器的下載框中自動顯示的文件名
fileName = new String(fileName.replaceAll(" ", "").getBytes("UTF-8"), "ISO8859-1");
//firefox瀏覽器
//firefox瀏覽器User-Agent字符串:
//Mozilla/5.0 (Windows NT 6.1; WOW64; rv:36.0) Gecko/20100101 Firefox/36.0
}
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
HttpHeaders headers = new HttpHeaders();
headers.setContentDispositionFormData("attachment", fileName);
headers.setContentType(MediaType.APPLICATION_OCTET_STREAM);
return new ResponseEntity<byte[]>(out.toByteArray(),headers, HttpStatus.OK);