poi操作拼接複雜excel

工作中會遇到需要導出一些表格,有些表格不但需要合併列,行也需要合併。像下面我遇到的這種

我採用的是根據一個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);  

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章