JAVA POI导出复杂表头Excel

参考文章 https://blog.csdn.net/u013585096/article/details/83503519
  1. 我的结果表格样式在这里插入图片描述

  2.      //Excel
         HSSFWorkbook hssfWorkbook = new HSSFWorkbook();
         Sheet sheet = hssfWorkbook.createSheet("sheet1");
         //表头字体
         Font headerFont = hssfWorkbook.createFont();
         
         headerFont.setFontName("微软雅黑");
         headerFont.setFontHeightInPoints((short) 18);
         headerFont.setBoldweight(Font.BOLDWEIGHT_NORMAL);
         headerFont.setColor(HSSFColor.BLACK.index);
         //正文字体
         Font contextFont = hssfWorkbook.createFont();
        contextFont.setFontName("微软雅黑");
         contextFont.setFontHeightInPoints((short) 12);
         contextFont.setBoldweight(Font.BOLDWEIGHT_NORMAL);
         contextFont.setColor(HSSFColor.BLACK.index);
    
    
         //表头样式,左右上下居中
         CellStyle headerStyle = hssfWorkbook.createCellStyle();
         headerStyle.setFont(headerFont);
         headerStyle.setAlignment(CellStyle.ALIGN_CENTER);// 左右居中
         headerStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);// 上下居中
         headerStyle.setLocked(true);
         headerStyle.setWrapText(false);// 自动换行
         headerStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
         headerStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
         headerStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
         headerStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
    
         //单元格样式,左右上下居中 边框
         CellStyle commonStyle = hssfWorkbook.createCellStyle();
         commonStyle.setFont(contextFont);
         commonStyle.setAlignment(CellStyle.ALIGN_CENTER);// 左右居中
         commonStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);// 上下居中
         commonStyle.setLocked(true);
         commonStyle.setWrapText(false);// 自动换行
         commonStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
         commonStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
         commonStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
         commonStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
         //单元格样式,左右上下居中 边框
         CellStyle commonWrapStyle = hssfWorkbook.createCellStyle();
         commonWrapStyle.setFont(contextFont);
         commonWrapStyle.setAlignment(CellStyle.ALIGN_CENTER);// 左右居中
         commonWrapStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);// 上下居中
         commonWrapStyle.setLocked(true);
         commonWrapStyle.setWrapText(true);// 自动换行
         commonWrapStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
         commonWrapStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
         commonWrapStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
         commonWrapStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
         //单元格样式,竖向 边框
         CellStyle verticalStyle = hssfWorkbook.createCellStyle();
         verticalStyle.setFont(contextFont);
         verticalStyle.setAlignment(CellStyle.ALIGN_CENTER);// 左右居中
         verticalStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);// 上下居中
         verticalStyle.setRotation((short) 255);//竖向
         verticalStyle.setLocked(true);
         verticalStyle.setWrapText(false);// 自动换行
         verticalStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
         verticalStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
         verticalStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
         verticalStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
    
         //单元格样式,左右上下居中 无边框
         CellStyle commonStyleNoBorder = hssfWorkbook.createCellStyle();
         commonStyleNoBorder.setFont(contextFont);
         commonStyleNoBorder.setAlignment(CellStyle.ALIGN_CENTER);// 左右居中
         commonStyleNoBorder.setVerticalAlignment(CellStyle.VERTICAL_CENTER);// 上下居中
         commonStyleNoBorder.setLocked(true);
         commonStyleNoBorder.setWrapText(false);// 自动换行
         //单元格样式,左对齐 边框
         CellStyle alignLeftStyle = hssfWorkbook.createCellStyle();
         alignLeftStyle.setFont(contextFont);
         alignLeftStyle.setAlignment(CellStyle.ALIGN_LEFT);// 左对齐
         alignLeftStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);// 上下居中
         alignLeftStyle.setLocked(true);
         alignLeftStyle.setWrapText(false);// 自动换行
         alignLeftStyle.setAlignment(CellStyle.ALIGN_LEFT);// 左对齐
         alignLeftStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
         alignLeftStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
         alignLeftStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
         alignLeftStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
         //单元格样式,左对齐 无边框
         CellStyle alignLeftNoBorderStyle = hssfWorkbook.createCellStyle();
         alignLeftNoBorderStyle.setFont(contextFont);
         alignLeftNoBorderStyle.setAlignment(CellStyle.ALIGN_LEFT);// 左对齐
         alignLeftNoBorderStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);// 上下居中
         alignLeftNoBorderStyle.setLocked(true);
         alignLeftNoBorderStyle.setWrapText(false);// 自动换行
         alignLeftNoBorderStyle.setAlignment(CellStyle.ALIGN_LEFT);// 左对齐
         //单元格样式,右对齐
         CellStyle alignRightStyle = hssfWorkbook.createCellStyle();
         alignRightStyle.setFont(contextFont);
         alignRightStyle.setAlignment(CellStyle.ALIGN_LEFT);// 左对齐
         alignRightStyle.setVerticalAlignment(CellStyle.VERTICAL_CENTER);// 上下居中
         alignRightStyle.setLocked(true);
         alignRightStyle.setWrapText(false);// 自动换行
         alignRightStyle.setAlignment(CellStyle.ALIGN_RIGHT);// 左对齐
    
         int rowNum = 0;
    
         //设置列宽
         for (int i = 0; i < 24; i++) {
             sheet.setColumnWidth(i, 1800);
         }
    
         //第一行
         Row r0 = sheet.createRow(rowNum++);
         r0.setHeight((short) 800);
         Cell c00 = r0.createCell(0);
         c00.setCellValue("数据");
         c00.setCellStyle(headerStyle);
         //合并单元格
         sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 23));
    
         //第二行
         Row r1 = sheet.createRow(rowNum++);
         r1.setHeight((short) 500);
         String[] row_first = {"统计项目","","","活动日期","",ac_date,"","","活动名称","",ac_name,"","","活动地点","",ac_city,"","","小计","","","","",""};
         for (int i = 0; i < row_first.length; i++) {
             Cell tempCell = r1.createCell(i);
             tempCell.setCellValue(row_first[i]);
             tempCell.setCellStyle(commonStyle);
         }
         //合并单元格
         sheet.addMergedRegion(new CellRangeAddress(1, 1, 0, 2));
         sheet.addMergedRegion(new CellRangeAddress(1, 1, 3, 4));
         sheet.addMergedRegion(new CellRangeAddress(1, 1, 5, 7));
         sheet.addMergedRegion(new CellRangeAddress(1, 1, 8, 9));
         sheet.addMergedRegion(new CellRangeAddress(1, 1, 10, 12));
         sheet.addMergedRegion(new CellRangeAddress(1, 1, 13, 14));
         sheet.addMergedRegion(new CellRangeAddress(1, 1, 15, 17));
         sheet.addMergedRegion(new CellRangeAddress(1, 1, 18, 23));
    
         //第三行
         Row r2 = sheet.createRow(rowNum++);
         r2.setHeight((short) 700);
         String[] row_second = {"断面编号","","","1","","", "2","","", "3","","", "4","","", "5","","","-","","","","",""};
         for (int i = 0; i < row_second.length; i++) {
             Cell tempCell = r2.createCell(i);
             tempCell.setCellValue(row_second[i]);
             tempCell.setCellStyle(commonStyle);
         }
         //合并单元格
         sheet.addMergedRegion(new CellRangeAddress(2,2,0,2));
         sheet.addMergedRegion(new CellRangeAddress(2,2,3,5));
         sheet.addMergedRegion(new CellRangeAddress(2,2,6,8));
         sheet.addMergedRegion(new CellRangeAddress(2,2,9,11));
         sheet.addMergedRegion(new CellRangeAddress(2,2,12,14));
         sheet.addMergedRegion(new CellRangeAddress(2,2,15,17));
         sheet.addMergedRegion(new CellRangeAddress(2,2,18,23));
    
    
         //第四行
         Row r3 = sheet.createRow(rowNum++);
        r3.setHeight((short) 700);
         String[] row_third = {"小组人数","","", group[0],"","", group[1],"","", group[2],"","", group[3],"","", group[4],"","",totalP,"","","","",""};
         for (int i = 0; i < row_third.length; i++) {
             Cell tempCell = r3.createCell(i);
             tempCell.setCellValue(row_third[i]);
             tempCell.setCellStyle(commonStyle);
         }
         //合并单元格
         sheet.addMergedRegion(new CellRangeAddress(3,3,0,2));
         sheet.addMergedRegion(new CellRangeAddress(3,3,3,5));
         sheet.addMergedRegion(new CellRangeAddress(3,3,6,8));
         sheet.addMergedRegion(new CellRangeAddress(3,3,9,11));
         sheet.addMergedRegion(new CellRangeAddress(3,3,12,14));
         sheet.addMergedRegion(new CellRangeAddress(3,3,15,17));
         sheet.addMergedRegion(new CellRangeAddress(3,3,18,23));
    
         //第五行
         Row r4 = sheet.createRow(rowNum++);
        r4.setHeight((short) 700);
         String[] row_fourth = {"清理长度","","", section[0],"","", section[1],"","", section[2],"","",section[3],"","", section[4],"","",totalL,"","","","",""};
         for (int i = 0; i < row_fourth.length; i++) {
             Cell tempCell = r4.createCell(i);
             tempCell.setCellValue(row_fourth[i]);
             tempCell.setCellStyle(commonStyle);
         }
         //合并单元格
         sheet.addMergedRegion(new CellRangeAddress(4,4,0,2));
         sheet.addMergedRegion(new CellRangeAddress(4,4,3,5));
         sheet.addMergedRegion(new CellRangeAddress(4,4,6,8));
         sheet.addMergedRegion(new CellRangeAddress(4,4,9,11));
         sheet.addMergedRegion(new CellRangeAddress(4,4,12,14));
         sheet.addMergedRegion(new CellRangeAddress(4,4,15,17));
         sheet.addMergedRegion(new CellRangeAddress(4,4,18,23));
    
    
         //第六行
         Row r5 = sheet.createRow(rowNum++);
         r5.setHeight((short) 700);
         String[] row_five = {"分类项目", "","","数量", "重量(g)", "","数量", "重量(g)", "","数量", "重量(g)","","数量", "重量(g)","","数量", "重量(g)","","数量小计","","", "重量小计(g)","",""};
         for (int i = 0; i < row_five.length; i++) {
             Cell tempCell = r5.createCell(i);
             tempCell.setCellValue(row_five[i]);
             tempCell.setCellStyle(commonStyle);
         }
         //合并单元格
         sheet.addMergedRegion(new CellRangeAddress(5,5,0,2));
         sheet.addMergedRegion(new CellRangeAddress(5,5,3,3));
         sheet.addMergedRegion(new CellRangeAddress(5,5,4,5));
         sheet.addMergedRegion(new CellRangeAddress(5,5,6,6));
         sheet.addMergedRegion(new CellRangeAddress(5,5,7,8));
         sheet.addMergedRegion(new CellRangeAddress(5,5,9,9));
         sheet.addMergedRegion(new CellRangeAddress(5,5,10,11));
         sheet.addMergedRegion(new CellRangeAddress(5,5,12,12));
         sheet.addMergedRegion(new CellRangeAddress(5,5,13,14));
         sheet.addMergedRegion(new CellRangeAddress(5,5,15,15));
         sheet.addMergedRegion(new CellRangeAddress(5,5,16,17));
         sheet.addMergedRegion(new CellRangeAddress(5,5,18,20));
         sheet.addMergedRegion(new CellRangeAddress(5,5,21,23));
    
    
         //第N行
         for (int i = 0; i < partTwoListSize; i++) {
             String m1 = partTwoList.get(i).get("m1").toString();
             String m2 = partTwoList.get(i).get("m2").toString();
             String m3 = partTwoList.get(i).get("m3").toString();
             String m4 = partTwoList.get(i).get("m4").toString();
             String m5 = partTwoList.get(i).get("m5").toString();
             String mj = partTwoList.get(i).get("mj").toString();
             String w1 = partTwoList.get(i).get("w1").toString();
             String w2 = partTwoList.get(i).get("w2").toString();
             String w3 = partTwoList.get(i).get("w3").toString();
             String w4 = partTwoList.get(i).get("w4").toString();
             String w5 = partTwoList.get(i).get("w5").toString();
             String wj = partTwoList.get(i).get("wj").toString();
    
    
             //合并单元格
             sheet.addMergedRegion(new CellRangeAddress(rowNum,rowNum,0,2));
             sheet.addMergedRegion(new CellRangeAddress(rowNum,rowNum,3,3));
             sheet.addMergedRegion(new CellRangeAddress(rowNum,rowNum,4,5));
             sheet.addMergedRegion(new CellRangeAddress(rowNum,rowNum,6,6));
             sheet.addMergedRegion(new CellRangeAddress(rowNum,rowNum,7,8));
             sheet.addMergedRegion(new CellRangeAddress(rowNum,rowNum,9,9));
             sheet.addMergedRegion(new CellRangeAddress(rowNum,rowNum,10,11));
             sheet.addMergedRegion(new CellRangeAddress(rowNum,rowNum,12,12));
             sheet.addMergedRegion(new CellRangeAddress(rowNum,rowNum,13,14));
             sheet.addMergedRegion(new CellRangeAddress(rowNum,rowNum,15,15));
             sheet.addMergedRegion(new CellRangeAddress(rowNum,rowNum,16,17));
             sheet.addMergedRegion(new CellRangeAddress(rowNum,rowNum,18,20));
             sheet.addMergedRegion(new CellRangeAddress(rowNum,rowNum,21,23));
             //数据
             Row rn = sheet.createRow(rowNum++);
            rn.setHeight((short) 700);
             String[] row_rns = {partTwoList.get(i).get("cate").toString(), "","",m1, w1, "",m2, w2, "",m3, w3,"",m4, w4,"",m5, w5,"",mj,"","", wj,"",""};
             for (int j = 0; j < row_rns.length; j++) {
                 Cell tempCell = rn.createCell(j);
                 tempCell.setCellValue(row_rns[j]);
                 tempCell.setCellStyle(commonStyle);
             }
    
         }
    
         //总计行
         String zm1 = zongJi.get("zm1").toString();
         String zm2 = zongJi.get("zm2").toString();
         String zm3 = zongJi.get("zm3").toString();
         String zm4 = zongJi.get("zm4").toString();
         String zm5 = zongJi.get("zm5").toString();
         String zmj = zongJi.get("zmj").toString();
         String zw1 = zongJi.get("zw1").toString();
         String zw2 = zongJi.get("zw2").toString();
         String zw3 = zongJi.get("zw3").toString();
         String zw4 = zongJi.get("zw4").toString();
         String zw5 = zongJi.get("zw5").toString();
         String zwj = zongJi.get("zwj").toString();
         //合并单元格
         sheet.addMergedRegion(new CellRangeAddress(rowNum,rowNum,0,2));
         sheet.addMergedRegion(new CellRangeAddress(rowNum,rowNum,3,3));
         sheet.addMergedRegion(new CellRangeAddress(rowNum,rowNum,4,5));
         sheet.addMergedRegion(new CellRangeAddress(rowNum,rowNum,6,6));
         sheet.addMergedRegion(new CellRangeAddress(rowNum,rowNum,7,8));
         sheet.addMergedRegion(new CellRangeAddress(rowNum,rowNum,9,9));
         sheet.addMergedRegion(new CellRangeAddress(rowNum,rowNum,10,11));
         sheet.addMergedRegion(new CellRangeAddress(rowNum,rowNum,12,12));
         sheet.addMergedRegion(new CellRangeAddress(rowNum,rowNum,13,14));
         sheet.addMergedRegion(new CellRangeAddress(rowNum,rowNum,15,15));
         sheet.addMergedRegion(new CellRangeAddress(rowNum,rowNum,16,17));
         sheet.addMergedRegion(new CellRangeAddress(rowNum,rowNum,18,20));
         sheet.addMergedRegion(new CellRangeAddress(rowNum,rowNum,21,23));
         //数据
         Row rzong = sheet.createRow(rowNum++);
         rzong.setHeight((short) 700);
         String[] row_zongji = {"总计", "","",zm1, zw1, "",zm2, zw2, "",zm3, zw3,"",zm4, zw4,"",zm5, zw5,"",zmj,"","", zwj,"",""};
         for (int i = 0; i < row_zongji.length; i++) {
             Cell tempCell = rzong.createCell(i);
             tempCell.setCellValue(row_zongji[i]);
             tempCell.setCellStyle(commonStyle);
         }
    
    
         //输出
         OutputStream stream = null;
         try {
             // 文件名
             String fileName = "报表名称.xls";
    
             // 处理文件名包含特殊字符出现的乱码问题
             String userAgent = request.getHeader("User-Agent");
             if (oConvertUtils.isNotEmpty(userAgent)) {
                 userAgent = userAgent.toLowerCase();
                 if (userAgent.contains("msie") || userAgent.contains("trident") || userAgent.contains("edge")) {
                     if (fileName.length() > 150) {// 解决IE 6.0问题
                         fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
                     } else {
                         fileName = URLEncoder.encode(fileName, "UTF-8");
                     }
                 } else {
                     fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
                 }
             }
    
             response.setContentType("application/vnd.ms-excel");
             response.setHeader("Content-disposition", "attachment;filename=\"" + fileName + "\"");
             stream = response.getOutputStream();
    
             if (null != hssfWorkbook && null != stream) {
                 hssfWorkbook.write(stream);
                 stream.flush();
                 stream.close();
             }
         } catch (IOException e) {
             e.printStackTrace();
         }
    
    

    渲染数据的时候,由于我得到的数据结构不是很合理,所以很多地方都是直接指明的^_^

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值