文章详情

短信预约-IT技能 免费直播动态提醒

请输入下面的图形验证码

提交验证

短信预约提醒成功

Java Poi导出Excel表格详解

2023-09-01 08:51

关注

一、导出下面的表格

二、流程详解

        1、导出excel需要先将数据准备好

        2、创建工作傅对象SXSSFWorkbook

        3、使用工作傅对象创建sheet对象(工作页)

        4、使用sheet对象创建行对象row(行对象)

        5、使用row对象创建cell对象(单元格对象)

        6、将数据依次插入对应的单元格

        7、创建excel文件,写入数据

三、代码

1、依赖

                      org.apache.poi            poi-ooxml            3.14        

注意:本文使用的是SXSSFSheet对象,所以使用的是上面的依赖

2、主要代码

2.1、实体类

import lombok.Data;@Datapublic class MyCell {    private int top;    private int below;    private int left;    private int right;    public MyCell(){}    public MyCell(int top,int below,int left,int right){        this.top = top;        this.below = below;        this.left = left;        this.right = right;    }}

2.2、工具类

public class ExportUtil{    public static void main(String[] args)    {        //1、准备数据        List>>> list = new ArrayList<>();//存放一个excel文件所有数据(可放多个sheet页)        HashMap>> map = new HashMap<>();//存放一个sheet页所有数据        List> titleList = new ArrayList<>();//存放一个sheet页表头数据        List> bodyList = new ArrayList<>();//存放一个sheet页表体数据        List title = new ArrayList<>();//存一行表头数据        List body = null;//存一行表体数据        int length = 8;//-------------------------每行8个数据,即8列表格        title.add("报表表体");        for (int i = 0; i < 7; i++) {            title.add("");        }        titleList.add(title);//把第一行表头数据放入titleList        title = new ArrayList<>();        title.add("代码 : 000000");        for (int i = 0; i < 3; i++){            title.add("");        }        title.add("报告期 : 2023年6月");        for (int i = 0; i < length - 5; i++){            title.add("");        }        titleList.add(title);//把第二行表头数据放入titleList        String str1 = "";        for (int i = 0; i <= 8; i++){//放8行表体数据            body = new ArrayList<>();            for (int j = 0; j < length; j++) {                body.add(i + 1 + "行" + (j + 1) + "列");            }            bodyList.add(body);//把第i行表体数据放入bodyList        }        map.put("title_key",titleList);//把一个sheet页表头数据放入map        map.put("body_key",bodyList);//把一个sheet页表体数据放入map        list.add(map);//把一个sheet页的所有数据放list        //--------------------------------------------------------------数据已准备完毕        //2、创建工作傅(即一个excel对象,可以包含多个sheet对象)        SXSSFWorkbook wb = new SXSSFWorkbook(500);//创建一个工作副本,保留500条数据在内存中        for (int i = 0;i < list.size(); i++){            HashMap>> map1 = list.get(i);//获取一个sheet页的所有数据            exportExcelFiles(wb,map1,"第一页");//将一个sheet页的所有数据插入wb对象中        }        //--------------------------------------------------------------数据已插入完毕        //3、创建excel文件,并写入数据        FileOutputStream fos = null;        File file = new File("D:\\" + "00年的大帅哥" + ".xls");        try {            fos = new FileOutputStream(file);            wb.write(fos);//写入数据        } catch (Exception e) {            e.printStackTrace();        } finally {            try {                if (fos != null) {                    fos.close();                }            } catch (IOException e) {                e.printStackTrace();            }            System.out.println("------------导出成功-------------");        }    }    //插入数据    public static void exportExcelFiles(SXSSFWorkbook wb,HashMap>> map,String name)    {        //1、准备数据        List> head = map.get("title_key");//取出表头数据        List> body = map.get("body_key");//取出表体数据        int rowEleCount = body.get(0).size();//表体一共多少列        //2、创建一个sheet对象并插入数据        SXSSFSheet sheet = wb.createSheet(name);//创建一个工作页,并设置sheet的name        //wb.setSheetName(0,name);//设置sheet名字,可以根据下标设置sheet的name        sheet.setDefaultColumnWidth(20);//设置默认列宽        mergeCell(sheet,rowEleCount);//---------------------------------------------------------先合并表头的单元格        List headStyleList = getHeadCellStyleList(wb);// 获取一个表头样式集合        List bodyStyleList = getBodyCellStyleList(wb);// 获取一个表体样式集合        setExcelHead(sheet,head,headStyleList);// 插入表头数据        setExcelBody(sheet,body,bodyStyleList);// 插入表体数据    }    // 合并表头    public static void mergeCell(SXSSFSheet sheet,int rowEleCount)    {        List listMerge = new ArrayList<>();//存储前3行合并单元格的信息        MyCell myCell1 = new MyCell(0,0,0,rowEleCount);        listMerge.add(myCell1);        MyCell myCell2 = new MyCell(1,2,0,3);        listMerge.add(myCell2);        MyCell myCell3 = new MyCell(1,2,4,rowEleCount);        listMerge.add(myCell3);        for (int i = 0; i < listMerge.size() ; i++){            sheet.addMergedRegion(new CellRangeAddress(listMerge.get(i).getTop(),//开始行                    listMerge.get(i).getBelow(),//结束行                    listMerge.get(i).getLeft(),//开始列                    listMerge.get(i).getRight()));//结束列        }    }    //插入表头数据    public static void setExcelHead(SXSSFSheet sheet, List> head,List cellStyleList)    {        int rowNum = head.size();//表头有几行        int rowElementNum = head.get(0).size();//每行有几列        SXSSFRow row = null;//声明一个行对象        SXSSFCell cell = null;//声明一个列对象(即一个单元格对象)        for (int i = 0; i < rowNum; i++){            row = sheet.createRow(i);//创建第 i + 1 行的行对象            //设置行高            if(i == 1 || i == 2){//将第二行和第三行的行高设置为400                row.setHeight((short) 400);            }            for(int j = 0; j < rowElementNum; j++) {                cell = row.createCell(j);//创建第 i + 1 行,第 j + 1 列的单元格                cell.setCellValue(head.get(i).get(j));//设置单元格内容(插入数据)                //设置表头样式                switch (i){                    case 0:                        cell.setCellStyle(cellStyleList.get(0));//将第一行设置为上下左右居中,单元格无边框,字体:等线,字号:12                        break;                    default:                        switch (j){case 0:    cell.setCellStyle(cellStyleList.get(1));//将第二行第1个单元格设置为靠左,单元格无边框,上下居中,字体:等线,字号:10    break;case 4:    cell.setCellStyle(cellStyleList.get(2));//将第二行第5个单元格设置上下左右居中,单元格无边框,字体:等线,字号:10    break;default:    cell.setCellStyle(cellStyleList.get(3));//其他单元格                        }                }            }        }    }    //插入表体数据    public static void setExcelBody(SXSSFSheet sheet, List> body,List bodyStyleList)    {        int rowNum = body.size();//表体有几行        int rowElementNum = body.get(0).size();//每行有几列        List rowList = null;//声明一个行数据集合        SXSSFRow row = null;//声明一个行对象        SXSSFCell cell = null;//声明一个单元格对象        for (int i = 3; i < rowNum + 3; i++) {//前3行是表头,从第4行开始创建行对象            row = sheet.createRow(i);//创建行对象            //将第4行行高设为600            if(i == 3){                row.setHeight((short)600);            }            rowList = body.get(i - 3);//取出表体的一行数据            for (int j = 0; j < rowList.size() ; j++){                cell = row.createCell(j);//创建第 i + 1 行,第 j + 1 列的单元格                cell.setCellValue(rowList.get(j));//设置单元格内容(插入数据)                //设置单元格数据样式                switch (i){                    case 3:                        cell.setCellStyle(bodyStyleList.get(3));//第4行设置为上下左右居中,单元格有边框,字体:等线,字号:10                        break;                    case 4:                        cell.setCellStyle(bodyStyleList.get(3));//第5行设置为上下左右居中,单元格有边框,字体:等线,字号:10                        break;                    default:                        switch (j){case 0:    cell.setCellStyle(bodyStyleList.get(0));//其他行第一列设置为靠左,上下居中,单元格有左右边框,无上下边框,字体:等线,字号:10    break;case 1:    cell.setCellStyle(bodyStyleList.get(1));//其他行第二列设置为靠左,上下居中,单元格有左右边框,无上下边框,字体:等线,字号:10    break;default:    cell.setCellStyle(bodyStyleList.get(2));//其他行其他列设置为上下左右居中,单元格有左右边框,无上下边框,字体:等线,字号:10                        }                }            }        }    }    //获取表头样式集合    private static List getHeadCellStyleList(SXSSFWorkbook wb) {        List cellStyleList = new ArrayList<>();        CellStyle bodyStyle1 = headStyle1(wb);        CellStyle bodyStyle2 = headStyle2(wb);        CellStyle bodyStyle3 = headStyle3(wb);        CellStyle bodyStyle4 = headStyle3(wb);        cellStyleList.add(bodyStyle1);        cellStyleList.add(bodyStyle2);        cellStyleList.add(bodyStyle3);        cellStyleList.add(bodyStyle4);        return cellStyleList;    }    //获取表体样式集合    private static List getBodyCellStyleList(SXSSFWorkbook wb)    {        List list = new ArrayList<>();        CellStyle cellStyle1 = bodyStyle1(wb);        CellStyle cellStyle2 = bodyStyle2(wb);        CellStyle cellStyle3 = bodyStyle3(wb);        CellStyle cellStyle4 = bodyStyle4(wb);        list.add(cellStyle1);        list.add(cellStyle2);        list.add(cellStyle3);        list.add(cellStyle4);        return list;    }    //字体    public static Font getFont(SXSSFWorkbook wb,String fontName,int height){        Font font = wb.createFont();        //font.setBoldweight((short) 10);// 设置字体的宽度        //font.setFontHeightInPoints((short) height);// 设置字体的高度        //font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);// 粗体显示        font.setFontHeightInPoints((short)height);//设置字号        font.setFontName(fontName);//设置字体(输入字体名)        return font;    }    //表头样式1    public static CellStyle headStyle1(SXSSFWorkbook wb)    {        CellStyle style1 = wb.createCellStyle();// 样式对象        // 设置单元格上、下、左、右的边框线        style1.setBorderTop(HSSFCellStyle.BORDER_NONE);//NONE为不显示边框,THIN为显示边框        style1.setBorderBottom(HSSFCellStyle.BORDER_NONE);        style1.setBorderLeft(HSSFCellStyle.BORDER_NONE);        style1.setBorderRight(HSSFCellStyle.BORDER_NONE);        Font font = getFont(wb,"等线",12);// 创建一个字体对象        style1.setFont(font);// 设置style1的字体        //style1.setWrapText(true);// 设置自动换行        style1.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 设置单元格字体显示居中(左右方向)        style1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 设置单元格字体显示居中(上下方向)        return style1;    }    //表头样式2    public static CellStyle headStyle2(SXSSFWorkbook wb)    {        CellStyle style1 = wb.createCellStyle();// 样式对象        // 设置单元格上、下、左、右的边框线        style1.setBorderBottom(HSSFCellStyle.BORDER_NONE);//NONE为不显示边框,THIN为显示边框        style1.setBorderLeft(HSSFCellStyle.BORDER_NONE);        style1.setBorderRight(HSSFCellStyle.BORDER_NONE);        style1.setBorderTop(HSSFCellStyle.BORDER_NONE);        Font font = getFont(wb,"等线",10);// 创建一个字体对象        style1.setFont(font);// 设置style1的字体        //style1.setWrapText(true);// 设置自动换行        style1.setAlignment(HSSFCellStyle.ALIGN_LEFT);// 设置单元格字体显示居中(左右方向)        style1.setVerticalAlignment(HSSFCellStyle.VERTICAL_BOTTOM);// 设置单元格字体显示居中(上下方向)        return style1;    }    //表头样式3    public static CellStyle headStyle3(SXSSFWorkbook wb)    {        CellStyle style1 = wb.createCellStyle();// 样式对象        // 设置单元格上、下、左、右的边框线        style1.setBorderBottom(HSSFCellStyle.BORDER_NONE);//NONE为不显示边框,THIN为显示边框        style1.setBorderLeft(HSSFCellStyle.BORDER_NONE);        style1.setBorderRight(HSSFCellStyle.BORDER_NONE);        style1.setBorderTop(HSSFCellStyle.BORDER_NONE);        Font font = getFont(wb,"等线",10);// 创建一个字体对象        style1.setFont(font);// 设置style1的字体        //style1.setWrapText(true);// 设置自动换行        style1.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 设置单元格字体显示居中(左右方向)        style1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 设置单元格字体显示居中(上下方向)        return style1;    }    //表体样式1    public static CellStyle bodyStyle1(SXSSFWorkbook wb)    {        // 设置style1的样式,此样式运用在第二行        CellStyle style = wb.createCellStyle();//样式对象        // 设置单元格上、下、左、右的边框线        style.setBorderTop(HSSFCellStyle.BORDER_NONE);//NONE为不显示边框,THIN为显示边框        style.setBorderBottom(HSSFCellStyle.BORDER_NONE);        style.setBorderLeft(HSSFCellStyle.BORDER_THIN);        style.setBorderRight(HSSFCellStyle.BORDER_THIN);        Font font = getFont(wb,"等线",10);// 创建一个字体对象        style.setFont(font);// 设置style1的字体        //style1.setWrapText(true);// 设置自动换行        style.setAlignment(HSSFCellStyle.ALIGN_LEFT);// 设置单元格字体显示靠左(左右方向)        style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 设置单元格字体显示居中(上下方向)        return style;    }    //表体样式2    public static CellStyle bodyStyle2(SXSSFWorkbook wb)    {        // 设置style1的样式,此样式运用在第二行        CellStyle style1 = wb.createCellStyle();// 样式对象        // 设置单元格上、下、左、右的边框线        style1.setBorderTop(HSSFCellStyle.BORDER_NONE);//NONE为不显示边框,THIN为显示边框        style1.setBorderBottom(HSSFCellStyle.BORDER_NONE);        style1.setBorderLeft(HSSFCellStyle.BORDER_THIN);        style1.setBorderRight(HSSFCellStyle.BORDER_THIN);        Font font = getFont(wb,"等线",10);// 创建一个字体对象        style1.setFont(font);// 设置style1的字体        //style1.setWrapText(true);// 设置自动换行        style1.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 设置单元格字体显示居中(左右方向)        style1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 设置单元格字体显示居中(上下方向)        return style1;    }    //表体样式3    public static CellStyle bodyStyle3(SXSSFWorkbook wb)    {        // 设置style1的样式,此样式运用在第二行        CellStyle style1 = wb.createCellStyle();//样式对象        // 设置单元格上、下、左、右的边框线        style1.setBorderTop(HSSFCellStyle.BORDER_NONE);//NONE为不显示边框,THIN为显示边框        style1.setBorderBottom(HSSFCellStyle.BORDER_NONE);        style1.setBorderLeft(HSSFCellStyle.BORDER_THIN);        style1.setBorderRight(HSSFCellStyle.BORDER_THIN);        Font font = getFont(wb,"等线",10);// 创建一个字体对象        style1.setFont(font);// 设置style1的字体        //style1.setWrapText(true);// 设置自动换行        style1.setAlignment(HSSFCellStyle.ALIGN_RIGHT);// 设置单元格字体显示靠右(左右方向)        style1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 设置单元格字体显示居中(上下方向)        return style1;    }    //表体样式4    public static CellStyle bodyStyle4(SXSSFWorkbook wb)    {        // 设置style1的样式        CellStyle style1 = wb.createCellStyle();//样式对象        // 设置单元格上、下、左、右的边框线        style1.setBorderTop(HSSFCellStyle.BORDER_THIN);//NONE为不显示边框,THIN为显示边框        style1.setBorderBottom(HSSFCellStyle.BORDER_THIN);        style1.setBorderLeft(HSSFCellStyle.BORDER_THIN);        style1.setBorderRight(HSSFCellStyle.BORDER_THIN);        Font font = getFont(wb,"等线",10);// 创建一个字体对象        style1.setFont(font);// 设置style1的字体        //style1.setWrapText(true);// 设置自动换行        style1.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 设置单元格字体显示居中(左右方向)        style1.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 设置单元格字体显示居中(上下方向)        return style1;    }}

四、

        单元格合并,单元格样式、字体样式,在代码中都有注释,上述代码,讲述了复杂excel的导出,可以导出多个sheet页,可自己准备数据测试

        希望对做报表项目的小伙伴能有所帮助,记得点赞收藏啊!

来源地址:https://blog.csdn.net/wry2000/article/details/131143544

阅读原文内容投诉

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

软考中级精品资料免费领

  • 历年真题答案解析
  • 备考技巧名师总结
  • 高频考点精准押题
  • 2024年上半年信息系统项目管理师第二批次真题及答案解析(完整版)

    难度     813人已做
    查看
  • 【考后总结】2024年5月26日信息系统项目管理师第2批次考情分析

    难度     354人已做
    查看
  • 【考后总结】2024年5月25日信息系统项目管理师第1批次考情分析

    难度     318人已做
    查看
  • 2024年上半年软考高项第一、二批次真题考点汇总(完整版)

    难度     435人已做
    查看
  • 2024年上半年系统架构设计师考试综合知识真题

    难度     224人已做
    查看

相关文章

发现更多好内容

猜你喜欢

AI推送时光机
位置:首页-资讯-后端开发
咦!没有更多了?去看看其它编程学习网 内容吧
首页课程
资料下载
问答资讯