poi操作拼接复杂excel

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u013332981/article/details/84326992

工作中会遇到需要导出一些表格,有些表格不但需要合并列,行也需要合并。像下面我遇到的这种

我采用的是根据一个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);  

猜你喜欢

转载自blog.csdn.net/u013332981/article/details/84326992