工作中会遇到需要导出一些表格,有些表格不但需要合并列,行也需要合并。像下面我遇到的这种
我采用的是根据一个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);