Java Poi导出Excel表格详解

这篇具有很好参考价值的文章主要介绍了Java Poi导出Excel表格详解。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、导出下面的表格

javapoi导出excel,JAVA POI,java

二、流程详解

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

        2、创建工作傅对象SXSSFWorkbook

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

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

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

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

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

三、代码

3.1、依赖

  <!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.14</version>
        </dependency>

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

3.2、主要代码

3.2.1、实体类

import lombok.Data;

@Data
public 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;
    }
}

3.2.2、工具类

public class ExportUtil
{
    public static void main(String[] args)
    {
        //1、准备数据
        List<HashMap<String,List<List<String>>>> list = new ArrayList<>();//存放一个excel文件所有数据(可放多个sheet页)
        HashMap<String,List<List<String>>> map = new HashMap<>();//存放一个sheet页所有数据
        List<List<String>> titleList = new ArrayList<>();//存放一个sheet页表头数据
        List<List<String>> bodyList = new ArrayList<>();//存放一个sheet页表体数据
        List<String> title = new ArrayList<>();//存一行表头数据
        List<String> 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<String,List<List<String>>> 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<String,List<List<String>>> map,String name)
    {
        //1、准备数据
        List<List<String>> head = map.get("title_key");//取出表头数据
        List<List<String>> 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<CellStyle> headStyleList = getHeadCellStyleList(wb);// 获取一个表头样式集合
        List<CellStyle> bodyStyleList = getBodyCellStyleList(wb);// 获取一个表体样式集合
        setExcelHead(sheet,head,headStyleList);// 插入表头数据
        setExcelBody(sheet,body,bodyStyleList);// 插入表体数据
    }




    // 合并表头
    public static void mergeCell(SXSSFSheet sheet,int rowEleCount)
    {
        List<MyCell> 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<List<String>> head,List<CellStyle> 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<List<String>> body,List<CellStyle> bodyStyleList)
    {
        int rowNum = body.size();//表体有几行
        int rowElementNum = body.get(0).size();//每行有几列
        List<String> 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<CellStyle> getHeadCellStyleList(SXSSFWorkbook wb) {
        List<CellStyle> 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<CellStyle> getBodyCellStyleList(SXSSFWorkbook wb)
    {
        List<CellStyle> 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://www.toymoban.com/news/detail-688539.html

到了这里,关于Java Poi导出Excel表格详解的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java中使用POI生成Excel并导出

    注:本文章中代码均为本地Demo版本,若后续代码更新将不会更新文章 根据从数据库查询出的数据,将其写入excel表并导出 我的想法是通过在实体属性上写自定义注解的方式去完成。因为我们在代码中可以通过反射的方式去获取实体类中全部的注解及属性名称等等。我们可以

    2024年02月16日
    浏览(35)
  • Java原生POI实现的Excel导入导出(简单易懂)

    首先是Controller入口方法 这个接口在postman上传参是下面这样的: 注意里面的参数名称要和接口上的一致,不然会拿不到值 还有file那里key的类型要选file类型的,这样就可以在后面value里面选择文件 然后是Service方法 首先是Controller入口 strJson是用来接受其它参数的,一般导出的

    2024年02月11日
    浏览(35)
  • Java POI (2)—— Excel文件的上传与导出(实例演示)

             这里是一个demo的流程图,下面按照这个流程图做了一个简单的实现,有部分判断没有加上,实际操作中,可以根据自己的需求进行增加或者修改。并且此处还是在接受文件传入后将文件进行了下载,保存到本地的操作,这个要按照具体情况具体分析,看需求是否

    2024年02月11日
    浏览(35)
  • JAVA:使用POI SXSSFWorkbook方式导出Excel大数据文件

    Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java对Microsoft Office格式档案读和写的功能。POI组件可以提供Java操作Microsoft Office的API,导出格式为Office 2003时POI调用的HSSF包,导出格式为Office 2007时,调用XSSF包,而SXSSF包是POI3.8版本之上对XSSF的一个扩展,用

    2024年02月11日
    浏览(36)
  • Java根据excel模版导出Excel(easyexcel、poi)——含项目测试例子拿来即用

    一般列表导出以及个性化样式设置请看下面的文章: JAVA导出Excel通用工具类——第一篇:详细介绍POI 导出excel的多种复杂情况,包括动态设置筛选、动态合并横向(纵向)单元格等多种复杂情况. JAVA导出Excel通用工具——第二篇:使用EasyExcel导出excel的多种情况的例子介绍.

    2024年04月29日
    浏览(29)
  • Java POI导出Excel时,合并单元格没有边框的问题

    今天用POI导出Excel的时候,发现导出的单元格确少边框,最后发现有2个方案可以解决。 CellRangeAddress的4个参数分别表示:起始行号,终止行号, 起始列号,终止列号

    2024年02月14日
    浏览(31)
  • java poi导出excel单元格设置自定义背景颜色(任意颜色)

    一、思考过程(看代码的移步第二点) 现有方法 现有资料多为使用 IndexedColors 设置颜色, 但是IndexedColors能设置的颜色有限 ,而需求中所要颜色都是花里胡哨的,需要真正的自定义; 而颜色的本质是rgb ,所以只要我们能自己设置rgb的值就能获取任意想要的颜色了; 源码分

    2023年04月10日
    浏览(32)
  • Java使用poi导出excel针对不同数据列配置设置不同单元格格式(适用于通用导出excel数据)

    公司大部分业务都是查询相关的业务, 所以建了一个项目专门做数据查询, 数据中转等抽象通用的业务, 有一天给我安排了一个功能, 做excel导出, 配置好查询sql和表头字段映射后即可导出excel, 无需修改代码 后来因为导出数据要求保留几位小数或者转换成百分比等设置单元格格

    2024年02月07日
    浏览(36)
  • Java POI导出Word、Excel、Pdf文档(可在线预览PDF)

    1、导入依赖Pom.xml        dependency             groupIdorg.apache.poi/groupId             artifactIdpoi/artifactId             version3.14/version         /dependency 2、Controller   3、Service a、pdfService b、wordService c、excelService  4、Utils 5、模板截图   6、前端

    2024年02月08日
    浏览(34)
  • Java excel poi 使用HSSFWorkbook 导出的excel wps能打开office打不开问题解决 Excel无法打开xx.xlsx,因为文件格式或扩展名无效......

    1.在开发代码中涉及到报表导出 xlsx文件 office打不开问题 JavaPOI导出Excel有三种形式,他们分别是 1.HSSFWorkbook 2.XSSFWorkbook 3.SXSSFWorkbook。 pom文件如下 检查创建sheet代码如下 代码中用了 HSSFworkbook 去创建Sheet 导致office打不开原因就在这里 HSSFworkbook 解释如下: HSSFWorkbook:是操作Exc

    2024年02月16日
    浏览(28)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包