java 使用POI画出复杂表格1-表头

有三处合并单元格被注释,打开后就是另一种效果请看博客2 

package tdh.platform.ofc.admin.interceptor;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.springframework.stereotype.Service;

import java.io.FileOutputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

/**
 * <pre>
 * Description:
 * Copyright:	Copyright (c)2021
 * Company:		上海天地
 * Author:		weijie.yang
 * Version:		1.0
 * Created at:	2021/6/4 16:30
 * </pre>
 */
@Service
public class VV {


    public static void main(String[] args) throws IOException {
        List<TAQIDataReport> list = new ArrayList<>();


        for (int i = 0; i < 10; i++) {
            TAQIDataReport obj = new TAQIDataReport();
            obj.setCity("city"+i);
            obj.setAdd("add"+i);
            obj.setSo2Concentration("so2Concentration"+i);
            obj.setSo2Subindex("so2Subindex"+i);
            obj.setNo2Concentration("no2Concentration"+i);
            obj.setNo2Subindex("no2Subindex"+i);
            obj.setPm10Concentration("pm10Concentration"+i);
            obj.setPm10Subindex("pm10Subindex"+i);
            obj.setCoConcentration("coConcentration"+i);
            obj.setCoSubindex("coSubindex"+i);
            obj.setO3Concentration("o3Concentration"+i);
            obj.setP3Subindex("p3Subindex"+i);
            obj.setPm25Concentration("pm25Concentration"+i);
            obj.setAdd("add"+i);
            obj.setAdd("add"+i);
            obj.setAdd("add"+i);
            obj.setAdd("add"+i);

            obj.setAdd("add"+i);
            list.add(obj);

        }

        HSSFWorkbook workbook = export(list);
        FileOutputStream output=new FileOutputStream("d:\\workbook.xls");
        workbook.write(output);
        output.flush();

    }

    public static HSSFWorkbook export(List<TAQIDataReport> list) {

        // 声明String数组,并初始化元素(表头名称)
        //第一行表头字段,合并单元格时字段跨几列就将该字段重复几次
        String[] excelHeader0 =
                {
                "线路", "出发城市", "出发区域", "到达城市", "到达区域","区——区(单边)", "规划里程",//非合并区域
                "资源配置","资源配置","资源配置",

                "签约客户本月业务","签约客户本月业务","签约客户本月业务","签约客户本月业务","签约客户本月业务"
                        ,"签约客户本月业务","签约客户本月业务","签约客户本月业务","签约客户本月业务",

                "非签约客户业务","非签约客户业务","非签约客户业务","非签约客户业务","非签约客户业务"
                        ,"非签约客户业务","非签约客户业务","非签约客户业务","非签约客户业务",
                "业务汇总","业务汇总","业务汇总","业务汇总","业务汇总","业务汇总","业务汇总",
                "经营状况","经营状况","经营状况","经营状况","经营状况","经营状况","经营状况","经营状况","经营状况",
                "计划定制要求" // 合并区域
                };
        //  “0,2,0,0”  ===>  “起始行,截止行,起始列,截止列”
        String[] headnum0 = {"0,2,0,0","0,2,1,1","0,2,2,2","0,2,3,3","0,2,4,4","0,2,5,5","0,2,6,6",
                            "0,0,7,9",
                            "0,0,10,18",
                            "0,0,19,27",
                            "0,0,28,34",
                            "0,0,35,43",
                            "0,2,44,44"

        };

        //第二行表头字段,其中的空的双引号是为了补全表格边框
        String[] excelHeader1 = {
                "","","","","","","",
                "班组数", "车头数", "挂箱数",
                "签约均价","签约均价","签约均价",
                "环比变化",
                "发车数","发车数","发车数",
                "环比变化", "签约标准产值",
                "散客均价","散客均价","散客均价",
                "环比变化",
                "发车数","发车数","发车数",
                "环比变化","非签约标准产值","汇总均价","环比变化","总发车数","环比变化","线路不均衡性",
                "标准产值","环比变化","标准业务毛利","标准业务毛利率","车头兜底","车头红利","挂厢兜底额","闲置亏损率",
                "经营性毛利","经营性毛利率","毛利额环比变化",""

        };
        // 合并单元格
        String[] headnum1 = {"1,2,7,7","1,2,8,8","1,2,9,9",//班组、车头、挂箱
                        "1,1,10,12",//签约均价
                        "1,2,13,13",//环比变化
                        "1,1,14,16",//发车数
                        "1,2,17,17",//环比变化
                        "1,2,18,18",//签约标准产值
                        "1,1,19,21",//散客均价
                        "1,2,22,22",//环比变化
                        "1,1,23,25",//发车数
                        "1,2,26,26",//环比变化
                        "1,2,27,27",//非签约标准产值
                        "1,2,28,28",//汇总均价
                        "1,2,29,29",//环比变化
                        "1,2,30,30",//总发车数
                        "1,2,31,31",//环比变化
                        "1,2,32,32",//线路不均衡性
                        "1,2,33,33",//标准产值
                        "1,2,34,34",//环比变化

                        "1,2,35,35",//标准业务毛利
                        "1,2,36,36",//标准业务毛利率
                        "1,2,37,37",//车头兜底
                        "1,2,38,38",//车头红利
                        "1,2,39,39",//挂厢兜底额
                        "1,2,40,40",//闲置亏损率
                        "1,2,41,41",//经营性毛利
                        "1,2,42,42",//经营性毛利率
                        "1,2,43,43",//毛利额环比变化
                        "1,2,44,44",//毛利额环比变化

                };

        //第三行表头字段
        String[] excelHeader2 = {
                "", "", "", "","","", "",
                "", "","",
                "城市", "区域", "集团",
                "",
                "城市", "区域", "集团",
                "","",//环比变化,签约标准产值
                "城市", "区域", "集团",
                "",
                "城市", "区域", "集团",
        "","","","","","","","","","","","","","","","","","",""
        };

        String[] headnum2 = {"3,3,10,10","3,3,11,11","3,3,12,12",

                "3,3,14,14","3,3,15,15","3,3,16,16",

                "3,3,19,19","3,3,20,20","3,3,21,21",

                "3,3,23,23","3,3,24,24","3,3,25,25"

        };

        // 声明一个工作簿
        HSSFWorkbook wb = new HSSFWorkbook();
        // 生成一个表格
        HSSFSheet sheet = wb.createSheet("TAQIDataReport");

        // 生成一种样式
        HSSFCellStyle style = wb.createCellStyle();
        // 设置样式
        style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
        style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        style.setBorderRight(HSSFCellStyle.BORDER_THIN);
        style.setBorderTop(HSSFCellStyle.BORDER_THIN);
        style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);

        // 生成一种字体
        HSSFFont font = wb.createFont();
        // 设置字体
        font.setFontName("微软雅黑");
        // 设置字体大小
        font.setFontHeightInPoints((short) 12);
        // 字体加粗
        font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        // 在样式中引用这种字体
        style.setFont(font);

        // 生成并设置另一个样式
        HSSFCellStyle style2 = wb.createCellStyle();
        style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
        style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
        style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
        style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
        style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
        style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
        style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
        style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);

        // 生成另一种字体2
        HSSFFont font2 = wb.createFont();
        // 设置字体
        font2.setFontName("微软雅黑");
        // 设置字体大小
        font2.setFontHeightInPoints((short) 12);
        // 字体加粗
        // font2.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
        // 在样式2中引用这种字体
        style2.setFont(font2);

        // 生成表格的第一行
        // 第一行表头
        HSSFRow row = sheet.createRow(0);
        for (int i = 0; i < excelHeader0.length; i++) {

            sheet.autoSizeColumn(i, true);// 根据字段长度自动调整列的宽度
            HSSFCell cell = row.createCell(i);
            cell.setCellValue(excelHeader0[i]);
            cell.setCellStyle(style);

            // System.out.println(excelHeader0[i]);

            if (i >= 0 && i <= 44) {
                for (int j = 0; j < excelHeader0.length; j++) {
                    // 从第j列开始填充
                    cell = row.createCell(j);
                    // 填充excelHeader1[j]第j个元素
                    cell.setCellValue(excelHeader0[j]);
                    cell.setCellStyle(style);
                }

            }

            // 设置列宽

            // sheet.setColumnWidth(0, 5500);
            // sheet.setColumnWidth(1, 6500);
            // sheet.setColumnWidth(2, 6500);
            // sheet.setColumnWidth(3, 6000);
            // sheet.setColumnWidth(4, 6500);
            // sheet.setColumnWidth(5, 6500);
            // sheet.setColumnWidth(6, 6500);
            // sheet.setColumnWidth(7, 6500);
            // sheet.setColumnWidth(8, 6500);
            // sheet.setColumnWidth(9, 6500);
            // sheet.setColumnWidth(10, 6500);
            // sheet.setColumnWidth(11, 6500);
            // sheet.setColumnWidth(12, 6500);
            // sheet.setColumnWidth(13, 6500);
            // sheet.setColumnWidth(14, 6500);
            // sheet.setColumnWidth(15, 6500);
            // sheet.setColumnWidth(16, 6500);
            // sheet.setColumnWidth(17, 6500);
            // sheet.setColumnWidth(18, 6500);
            // sheet.setDefaultRowHeight((short) 360);// 设置行高

        }

        // 动态合并单元格
//        for (int i = 0; i < headnum0.length; i++) {
//            sheet.autoSizeColumn(i, true);
//            String[] temp = headnum0[i].split(",");
//            Integer startrow = Integer.parseInt(temp[0]);
//            Integer overrow = Integer.parseInt(temp[1]);
//            Integer startcol = Integer.parseInt(temp[2]);
//            Integer overcol = Integer.parseInt(temp[3]);
//            sheet.addMergedRegion(new CellRangeAddress(startrow, overrow, startcol, overcol));
//        }

        // 第二行表头
        row = sheet.createRow(1);
        for (int i = 0; i < excelHeader1.length; i++) {
            sheet.autoSizeColumn(i, true);// 自动调整宽度
            HSSFCell cell = row.createCell(i);
            cell.setCellValue(excelHeader1[i]);
            cell.setCellStyle(style);

            if (i > 6 && i <= 44) {
                for (int j = 0; j < excelHeader1.length; j++) {
                    // 从第j+1列开始填充
                    cell = row.createCell(j );
                    // 填充excelHeader1[j]第j个元素
                    cell.setCellValue(excelHeader1[j]);
                    cell.setCellStyle(style);
                }
            }
        }

        // 动态合并单元格
//        for (int i = 0; i < headnum1.length; i++) {
//
//            sheet.autoSizeColumn(i, true);
//            String[] temp = headnum1[i].split(",");
//            Integer startrow = Integer.parseInt(temp[0]);
//            Integer overrow = Integer.parseInt(temp[1]);
//            Integer startcol = Integer.parseInt(temp[2]);
//            Integer overcol = Integer.parseInt(temp[3]);
//            sheet.addMergedRegion(new CellRangeAddress(startrow, overrow, startcol, overcol));
//        }


        // 第三行表头
        row = sheet.createRow(2);
        for (int i = 0; i < excelHeader2.length; i++) {

            HSSFCell cell = row.createCell(i);
            cell.setCellValue(excelHeader2[i]);
            cell.setCellStyle(style);
            // System.out.println(excelHeader2[i]);
            sheet.autoSizeColumn(i, true);// 自动调整宽度

            if (i > 9 && i <= 44) {
                for (int j = 0; j < excelHeader2.length; j++) {
                    // 从第j+2列开始填充
                    cell = row.createCell(j);
                    // 填充excelHeader1[j]第j个元素
                    cell.setCellValue(excelHeader2[j]);
                    cell.setCellStyle(style);
                }
            }
        }
        // 动态合并单元格7
//        for (int i = 0; i < headnum2.length; i++) {
//            sheet.autoSizeColumn(i, true);
//            String[] temp = headnum2[i].split(",");
//            Integer startrow = Integer.parseInt(temp[0]);
//            Integer overrow = Integer.parseInt(temp[1]);
//            Integer startcol = Integer.parseInt(temp[2]);
//            Integer overcol = Integer.parseInt(temp[3]);
//            sheet.addMergedRegion(new CellRangeAddress(startrow, overrow, startcol, overcol));
//        }

        // 第四行数据
        for (int i = 0; i < list.size(); i++) {

            row = sheet.createRow(i + 3);
            TAQIDataReport report = list.get(i);

            // 导入对应列的数据
            HSSFCell cell = row.createCell(0);
            cell.setCellValue(report.getCity());
            cell.setCellStyle(style2);
            // 导入对应列的数据
            HSSFCell cell1 = row.createCell(0);
            cell.setCellValue(report.getCity());
            cell.setCellStyle(style2);
            // 导入对应列的数据
            HSSFCell cell2 = row.createCell(0);
            cell.setCellValue(report.getCity());
            cell.setCellStyle(style2);
            // 导入对应列的数据
            HSSFCell cell3 = row.createCell(0);
            cell.setCellValue(report.getCity());
            cell.setCellStyle(style2);
            // 导入对应列的数据
            HSSFCell cell4 = row.createCell(0);
            cell.setCellValue(report.getCity());
            cell.setCellStyle(style2);
            // 导入对应列的数据
            HSSFCell cell5 = row.createCell(0);
            cell.setCellValue(report.getCity());
            cell.setCellStyle(style2);
            // 导入对应列的数据
            HSSFCell cell6 = row.createCell(0);
            cell.setCellValue(report.getCity());
            cell.setCellStyle(style2);

            HSSFCell cell7 = row.createCell(1);
            cell1.setCellValue(report.getAdd());
            cell1.setCellStyle(style2);

//            HSSFCell cell2 = row.createCell(2);
//            cell2.setCellValue(report.getSo2Concentration());
//            cell2.setCellStyle(style2);
//            HSSFCell cell3 = row.createCell(3);
//            cell3.setCellValue(report.getSo2Subindex());
//            cell3.setCellStyle(style2);
//
//            HSSFCell cell4 = row.createCell(4);
//            cell4.setCellValue(report.getNo2Concentration());
//            cell4.setCellStyle(style2);
//            HSSFCell cell5 = row.createCell(5);
//            cell5.setCellValue(report.getNo2Subindex());
//            cell5.setCellStyle(style2);
//
//            HSSFCell cell6 = row.createCell(6);
//            cell6.setCellValue(report.getPm10Concentration());
//            cell6.setCellStyle(style2);
//            HSSFCell cell7 = row.createCell(7);
//            cell7.setCellValue(report.getPm10Subindex());
//            cell7.setCellStyle(style2);
//
//            HSSFCell cell8 = row.createCell(8);
//            cell8.setCellValue(report.getCoConcentration());
//            cell8.setCellStyle(style2);
//            HSSFCell cell9 = row.createCell(9);
//            cell9.setCellValue(report.getCoSubindex());
//            cell9.setCellStyle(style2);
//
//            HSSFCell cell10 = row.createCell(10);
//            cell10.setCellValue(report.getO3Concentration());
//            cell10.setCellStyle(style2);
//            HSSFCell cell11 = row.createCell(11);
//            cell11.setCellValue(report.getO3Subindex());
//            cell11.setCellStyle(style2);
//
//            HSSFCell cell12 = row.createCell(12);
//            cell12.setCellValue(report.getPm25Concentration());
//            cell12.setCellStyle(style2);
//            HSSFCell cell13 = row.createCell(13);
//            cell13.setCellValue(report.getPm25Subindex());
//            cell13.setCellStyle(style2);
//
//            HSSFCell cell14 = row.createCell(14);
//            cell14.setCellValue(report.getAirSubindex());
//            cell14.setCellStyle(style2);
//
//            HSSFCell cell15 = row.createCell(15);
//            cell15.setCellValue(report.getKeyPollution());
//            cell15.setCellStyle(style2);
//
//            HSSFCell cell16 = row.createCell(16);
//            cell16.setCellValue(report.getLevel());
//            cell16.setCellStyle(style2);
//
//            HSSFCell cell17 = row.createCell(17);
//            cell17.setCellValue(report.getType());
//            cell17.setCellStyle(style2);
//
//            HSSFCell cell18 = row.createCell(18);
//            cell18.setCellValue(report.getColor());
//            cell18.setCellStyle(style2);
        }
        return wb;
    }
}

结果:截图可能不完整 但是运行一下 基本就可以了

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值