Java实现POI导出excel复杂表头

3 篇文章 0 订阅
  1. 主方法加数据和excel表头布局
/**
     * 导出
     * @param request
     * @param response
     * @throws IOException
     */
    @RequestMapping("/exportMultipleItemStatisticsList.do")
    public void export(HttpServletRequest request, HttpServletResponse response) throws IOException {
        String startTime = request.getParameter("startTime")==null ?"":request.getParameter("startTime").toString();//开始时间
        String endTime=request.getParameter("endTime")==null ?"":request.getParameter("endTime").toString();//结束时间
        String category = request.getParameter("category")==null ?"":request.getParameter("category").toString();//场点类型
        String reportcode=request.getParameter("reportcode")==null ?"":request.getParameter("reportcode").toString();//受检编号
        String entername=request.getParameter("entername")==null ?"":request.getParameter("entername").toString();//受检单位
        String immName = request.getParameter("immName")==null ?"":request.getParameter("immName").toString();//是否免疫
        String areaName = request.getParameter("areaName")==null ?"":request.getParameter("areaName").toString();//地市
        Map entityMap=new HashMap();
        entityMap.put("startTime",startTime);
        entityMap.put("endTime",endTime);
        entityMap.put("category",category);
        entityMap.put("reportcode",reportcode);
        entityMap.put("entername",entername);
        entityMap.put("immName",immName);
        entityMap.put("areaName",areaName);
        List<Map> list=multipleItemStatisticsService.getMultipleItemStatisticsList(entityMap);
        //1.创建一个workbook,对应一个excel文件
        HSSFWorkbook wb = new HSSFWorkbook();

        //2.在workbook中添加一个sheet,对应Excel中的sheet
        HSSFSheet sheet = wb.createSheet("多重检测项目明细");

        //设置每一列的列宽
        sheet.setColumnWidth(0,256*15);
        sheet.setColumnWidth(1,256*15);
        sheet.setColumnWidth(2,256*15);
        sheet.setColumnWidth(3,256*15);
        sheet.setColumnWidth(4,256*15);
        sheet.setColumnWidth(5,256*15);
        sheet.setColumnWidth(6,256*15);
        sheet.setColumnWidth(7,256*15);
        sheet.setColumnWidth(8,256*15);
        sheet.setColumnWidth(9,256*15);
        sheet.setColumnWidth(10,256*15);
        sheet.setColumnWidth(11,256*15);
        sheet.setColumnWidth(12,256*15);
        sheet.setColumnWidth(13,256*15);
        sheet.setColumnWidth(14,256*15);
//        sheet.setColumnWidth(15,256*15);

        //3.设置样式以及字体样式
        HSSFCellStyle titleStyle = ExcelUtils.createTitleCellStyle(wb);
        HSSFCellStyle headerStyle = ExcelUtils.createHeadCellStyle(wb);
        HSSFCellStyle contentStyle = ExcelUtils.createContentCellStyle(wb);

        //4.创建标题,合并标题单元格
        //行号
        int rowNum = 0;

        //创建第一行,索引从0开始(标题行)
        HSSFRow row0 = sheet.createRow(rowNum++);
        row0.setHeight((short) 800);// 设置行高
        String title = "多重检测项目明细表";
        HSSFCell c00 = row0.createCell(0);
        c00.setCellValue(title);
        c00.setCellStyle(titleStyle);
        // 合并单元格,参数依次为起始行,结束行,起始列,结束列 (索引0开始)
        sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 14));//标题合并单元格操作,总列数为16

        //第二行
        HSSFRow row1 = sheet.createRow(rowNum++);
        row1.setHeight((short)500);
        String[] row_first = {"受检编号","样品编号","受检单位","地市","监测动物种类","年龄阶段","监测场点类型","饲养量","样品总量",list.get(0).get("name").toString(),"","","","",""};
        for (int i = 0; i < row_first.length; i++) {
            HSSFCell tempCell = row1.createCell(i);
            tempCell.setCellValue(row_first[i]);
            tempCell.setCellStyle(headerStyle);
        }
        //合并单元格
        sheet.addMergedRegion(new CellRangeAddress(1, 3, 0, 0));//受检编号
        sheet.addMergedRegion(new CellRangeAddress(1, 3, 1, 1));//样品编号
        sheet.addMergedRegion(new CellRangeAddress(1, 3, 2, 2));//受检单位
        sheet.addMergedRegion(new CellRangeAddress(1, 3, 3, 3));//地市
        sheet.addMergedRegion(new CellRangeAddress(1, 3, 4, 4));//监测动物种类
        sheet.addMergedRegion(new CellRangeAddress(1, 3, 5, 5));//年龄阶段
        sheet.addMergedRegion(new CellRangeAddress(1, 3, 6, 6));//年龄阶段
        sheet.addMergedRegion(new CellRangeAddress(1, 3, 7, 7));//年龄阶段
        sheet.addMergedRegion(new CellRangeAddress(1, 3, 8, 8));//年龄阶段
        sheet.addMergedRegion(new CellRangeAddress(1, 1, 9, 14));//截止2019年12月27日业务明细

        //第三行
        HSSFRow row2 = sheet.createRow(rowNum++);
        row2.setHeight((short)500);
        String[] row_second = {"","","","","","","","","",list.get(0).get("standard_name0").toString(),"","",list.get(0).get("standard_name1").toString(),"",""};
        for (int i = 0; i < row_second.length; i++) {
            HSSFCell tempCell = row2.createCell(i);
            tempCell.setCellValue(row_second[i]);
            tempCell.setCellStyle(headerStyle);
        }

        //合并单元格
        sheet.addMergedRegion(new CellRangeAddress(2, 2, 9, 11));
        sheet.addMergedRegion(new CellRangeAddress(2, 2, 12, 14));

        //第四行
        HSSFRow row3 = sheet.createRow(rowNum++);
        row3.setHeight((short)500);
        String[] row_third = {"","","","","","","","","","检测样品数","阳性数","阳性率(%)","检测样品数","阳性数","阳性率(%)"};
        for (int i = 0; i < row_third.length; i++) {
            HSSFCell tempCell = row3.createCell(i);
            tempCell.setCellValue(row_third[i]);
            tempCell.setCellStyle(headerStyle);
        }

        //查询月度明细列表
//        List<BusinessDetail> list = businessService.selectMonthBusinessList(businessDetail);
        for(int i = 0;i<list.size();i++){
            HSSFRow tempRow = sheet.createRow(rowNum++);
            tempRow.setHeight((short)500);
            //循环单元格填入数据
            for(int j=0;j<15;j++){
                HSSFCell tempCell = tempRow.createCell(j);
                tempCell.setCellStyle(contentStyle);
                String cellValue = "";
                if(j ==0){
                    //受检编号
                    cellValue = list.get(i).get("reportcode").toString();
                }else if(j == 1){
                    //样品编号
                    cellValue = list.get(i).get("roundsamplecode").toString();
                }else if(j ==2){
                    //受检单位
                    if(list.get(i).get("takeinspectionunit") ==null){
                        cellValue = "";
                    }else{
                        cellValue = list.get(i).get("takeinspectionunit").toString();
                    }
                }else if(j == 3){
                    //地市
                    if(list.get(i).get("areaName") ==null){
                        cellValue = "0";
                    }else{
                        cellValue = list.get(i).get("areaName").toString();
                    }
                }else if(j ==4){
                    //监测动物种类
                    if(list.get(i).get("animal") ==null){
                        cellValue = "0";
                    }else{
                        cellValue = list.get(i).get("animal").toString();
                    }
                }else if(j == 5){
                    //年龄阶段
                    if(list.get(i).get("sampleAnimalName") ==null){
                        cellValue = "0";
                    }else{
                        cellValue = list.get(i).get("sampleAnimalName").toString();
                    }
                }else if(j == 6){
                    //监测场点类型
                    if(list.get(i).get("category") ==null){
                        cellValue = "0";
                    }else{
                        cellValue = list.get(i).get("category").toString();
                    }
                }else if(j ==7){
                    //饲养量
                    if(list.get(i).get("sampleSumNum") ==null){
                        cellValue = "0";
                    }else{
                        cellValue = list.get(i).get("sampleSumNum").toString();
                    }
                }else if(j == 8){
                    //样品总量
                    if(list.get(i).get("allNum") ==null){
                        cellValue = "0";
                    }else{
                        cellValue = list.get(i).get("allNum").toString();
                    }
                }else if(j == 9){
                    //a检测样品数
                    if(list.get(i).get("sampleNum0") ==null){
                        cellValue = "0";
                    }else{
                        cellValue = list.get(i).get("sampleNum0").toString();
                    }
                }else if(j == 10){
                    //阳性数
                    if(list.get(i).get("positiveNum0") ==null){
                        cellValue = "0";
                    }else{
                        cellValue = list.get(i).get("positiveNum0").toString();
                    }
                }else if(j == 11){
                    //阳性率(%)
                    if(list.get(i).get("sun0") ==null){
                        cellValue = "0";
                    }else{
                        cellValue = list.get(i).get("sun0").toString();
                    }
                }else if( j == 12){
                    //a检测样品数
                    if(list.get(i).get("sampleNum1") ==null){
                        cellValue = "0";
                    }else{
                        cellValue = list.get(i).get("sampleNum1").toString();
                    }
                }else if(j == 13){
                    //阳性数
                    if(list.get(i).get("positiveNum1") ==null){
                        cellValue = "0";
                    }else{
                        cellValue = list.get(i).get("positiveNum1").toString();
                    }
                }else if(j ==14){
                    //阳性率(%)
                    if(list.get(i).get("sun1") ==null){
                        cellValue = "0";
                    }else{
                        cellValue = list.get(i).get("sun1").toString();
                    }
                }
                tempCell.setCellValue(cellValue);
            }
        }

        //导出excel
//        HttpServletResponse response = this.getResponse();
        String fileName = "月度业务明细.xls";
        try {
            fileName = new String(fileName.getBytes("UTF-8"),"ISO-8859-1");
            response.setHeader("Content-disposition", "attachment;filename=\"" + fileName + "\"");
            OutputStream stream = response.getOutputStream();
            if(null != wb && null != stream){
                wb.write(stream);
                wb.close();
                stream.close();
            }
//            FileOutputStream outputStream = new FileOutputStream(new File("d:\\月度业务明细.xls"));
//            wb.write(outputStream);
//            outputStream.close();
        }catch (Exception e){
            e.printStackTrace();
        }
//        return null;
    }

2.对应样式单独加到一个工具类中

/**
 * 导出excel设置的样式
 */
public class ExcelUtils {
    /**
     * 创建标题样式
     * @param wb
     * @return
     */
    public static HSSFCellStyle createTitleCellStyle(HSSFWorkbook wb){
        HSSFCellStyle cellStyle = wb.createCellStyle();
        //水平居中
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        //垂直对齐
        cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
//        cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        //背景颜色
//        cellStyle.setFillForegroundColor(IndexedColors.GREY_40_PERCENT.getIndex());

        HSSFFont headerFont1 = (HSSFFont) wb.createFont();
        //字体加粗
        headerFont1.setBold(true);
        //字体类型
        headerFont1.setFontName("黑体");
        //字体大小
        headerFont1.setFontHeightInPoints((short)15);
        cellStyle.setFont(headerFont1);
        return cellStyle;
    }

    /**
     * 创建表头样式
     * @param wb
     * @return
     */
    public static HSSFCellStyle createHeadCellStyle(HSSFWorkbook wb){
        HSSFCellStyle cellStyle = wb.createCellStyle();
        //设置自动换行
        cellStyle.setWrapText(true);
        //设置背景颜色
//        cellStyle.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
        //水平居中
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        //垂直对齐
        cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
//        cellStyle.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
//        cellStyle.setBottomBorderColor(IndexedColors.BLACK.index);
        //下边框
        cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        //左边框
        cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        //右边框
        cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);
        //上边框
        cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);

        //创建字体样式
        HSSFFont headerFont = (HSSFFont)wb.createFont();
        //字体加粗
        headerFont.setBold(true);
        //字体类型
        headerFont.setFontName("黑体");
        //字体大小
        headerFont.setFontHeightInPoints((short)12);
        //为标题样式添加字体样式
        cellStyle.setFont(headerFont);

        return cellStyle;
    }

    /**
     *  设置表格内容样式
     * @param wb
     * @return
     */
    public static HSSFCellStyle createContentCellStyle(HSSFWorkbook wb){
        HSSFCellStyle cellStyle = wb.createCellStyle();
        //水平居中
        cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        //垂直居中
        cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
        //设置自动换行
        cellStyle.setWrapText(true);
        //上边框
        cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);
        //下边框
        cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        //左边框
        cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        //右边框
        cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);

        //设置字体
        HSSFFont font = (HSSFFont)wb.createFont();
//        font.setColor((short)8);
        font.setFontHeightInPoints((short)12);

        return cellStyle;
    }

}

3.只需要以上配置即可,保存路径在页面请求自定义路径。

window.location.href = excel_url;
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
Java 导出 Excel 时,动态表头实现方式可以有很多种。 一种常见方式是,在导出 Excel 前就确定好表头的内容,并且将表头内容存储在一个数组或者列表里。根据这个数组或列表,我们可以动态地设置 Excel表头。 另一种方式是,在导出 Excel 时根据数据动态生成表头。这通常需要对数据进行预处理或者整理,以确定 Excel 表头的内容。 无论采用哪种方式,Java 导出 Excel 的核心思路是基于 POI 库。POI 是一个开源的 Java Excel API,它允许我们在 Java 应用程序中创建、读取和修改 Excel 文件。 具体实现时,可以使用 POI 提供的 XSSFWorkbook、Sheet 和 Row 等类和方法,来创建 Excel 表头和单元格,并填充数据。同时,还可以通过设置单元格和单元格样式,来实现格式控制和美化。 在其中一个实现方式中,代码大概会长这个样子: // 创建一个新的 Excel 工作簿 XSSFWorkbook workbook = new XSSFWorkbook(); // 创建一个新的 Sheet XSSFSheet sheet = workbook.createSheet("Sheet1"); // 创建表头内容数组 String[] headers = {"序号", "姓名", "年龄", "性别"}; // 创建表头行 XSSFRow headerRow = sheet.createRow(0); for (int i = 0; i < headers.length; i++) { // 创建单元格并设置表头内容 XSSFCell cell = headerRow.createCell(i); cell.setCellValue(headers[i]); // 设置单元格样式 XSSFCellStyle style = workbook.createCellStyle(); style.setAlignment(HorizontalAlignment.CENTER); style.setVerticalAlignment(VerticalAlignment.CENTER); cell.setCellStyle(style); } // 填充数据 for (int i = 0; i < dataList.size(); i++) { // 创建数据行 XSSFRow dataRow = sheet.createRow(i + 1); // 获取数据对象 Data data = dataList.get(i); // 创建单元格并设置数据内容 XSSFCell cell0 = dataRow.createCell(0); cell0.setCellValue(data.getId()); XSSFCell cell1 = dataRow.createCell(1); cell1.setCellValue(data.getName()); XSSFCell cell2 = dataRow.createCell(2); cell2.setCellValue(data.getAge()); XSSFCell cell3 = dataRow.createCell(3); cell3.setCellValue(data.getSex()); // 设置单元格样式 XSSFCellStyle style = workbook.createCellStyle(); style.setAlignment(HorizontalAlignment.CENTER); style.setVerticalAlignment(VerticalAlignment.CENTER); cell0.setCellStyle(style); cell1.setCellStyle(style); cell2.setCellStyle(style); cell3.setCellStyle(style); } // 将工作簿写入硬盘中 FileOutputStream outputStream = new FileOutputStream("data.xlsx"); workbook.write(outputStream); outputStream.close(); 总的来说,Java 导出 Excel 动态表头实现方式多种多样,可以根据需求和场景来选择合适的方式。但无论采用哪种方式,核心思路都要基于 POI 库来进行操作。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

墙角的爬山虎

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值