poi实现Excel文件导出【SpringBoot篇】

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



前言

在系统中,数据库的excel文件导出是一项及为基础的功能。此篇文章将通过实例利用poi实现excel文件导出。


一、POI、HFFS是什么?

POI

Jakarta POI 是apache的子项目,目标是处理ole2对象。它提供了一组操纵Windows文档的Java API 。目前比较成熟的是HSSF接口,处理MS Excel(97-2002)对象。它不象我们仅仅是用csv生成的没有格式的可以由Excel转换的东西,而是真正的Excel对象,你可以控制一些属性如sheet,cell等等。

HFFS

HSSF 是Horrible SpreadSheet Format的缩写,也即“讨厌的电子表格格式”。 也许HSSF的名字有点滑稽,就本质而言它是一个非常严肃、正规的API。通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。
HSSF 为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型”。前者很好理解,后者比较抽象,但操作效率要高得多。

参考文档

POI 主页:http://jakarta.apache.org/poi/
初学者如何快速上手使用POI HSSF:http://jakarta.apache.org/poi/hssf/quick-guide.html

二、使用步骤

1.引入poi依赖包

<!--读取excel文件的包-->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi</artifactId>
    <version>3.16</version>
</dependency>

<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-ooxml</artifactId>
    <version>3.16</version>
</dependency>

2.创建工具类ExportExcel、ClassUtils

ExportExcel.java

public class ExportExcel<T> {
    /**
     * 将列表数据导出为 Excel 表格
     * @param dataList 列表数据
     * @param out 输出源
     */
    public static boolean flag = true;

    public static void exportExcel(List dataList, ServletOutputStream out) throws IllegalAccessException, IOException {
        // 空集合直接返回
        if (dataList.isEmpty()) {
            return;
        }

        // 获取泛型 T 的所有成员变量
        // 这里的第一种是获取原属性名,第二种是获取属性对应的注解 FieldName 的值,即对应的中文名称
        List<String> fieldList = ClassUtils.getFields(dataList.get(0).getClass());
        List<String> fieldNameList = ClassUtils.getFieldNames(dataList.get(0).getClass());

        // 建立一个 Excel 文件,并在文件中创建一个表单
        HSSFWorkbook workbook = new HSSFWorkbook();
        HSSFSheet sheet = workbook.createSheet();

        // 创建行(表头)
        HSSFRow row = sheet.createRow(0);

        // 创建单元格,并设置表头居中
        HSSFCellStyle hssfCellStyle = workbook.createCellStyle();
        hssfCellStyle.setAlignment(HorizontalAlignment.CENTER);

        // 循环设置列名(这里使用注解对应的中文名)
        HSSFCell hssfCell;
        for (int i = 0; i < fieldNameList.size(); i++) {
            hssfCell = row.createCell(i);
            hssfCell.setCellValue(fieldNameList.get(i));
            hssfCell.setCellStyle(hssfCellStyle);
        }

        // 为每一行添加数据
        Map<String, Object> dataMap;
        for (int i = 0; i < dataList.size(); i++) {
            // 添加新的一行
            row = sheet.createRow(i + 1);

            // 获取泛型对象 RankResult的成员变量和值的对应关系
            dataMap = ClassUtils.getFieldOfValue(dataList.get(i));

            // 将数据写入该行
            for (int j = 0; j < fieldList.size(); j++) {
                // 先通过 list 获取成员变量名,再通过 map 获取对应的值,转化为 String 之后放入表格中
                row.createCell(j).setCellValue("" + dataMap.get(fieldList.get(j)));
            }
        }

        // 将数据输出,刷出,关闭
        workbook.write(out);
        out.flush();;
        out.close();
    }

}

ClassUtils.java

public class ClassUtils {

    /**
     * 通过类型返回对应的属性列表
     * @param target 目标类型
     * @return 属性列表
     */
    public static List<String> getFields(Class<?> target) {
        // 获取所有成员变量名称
        List<String> fieldList = new ArrayList<>();
        Field[] declaredFields = target.getDeclaredFields();

        // 放入 List 集合中
        for(Field field : declaredFields) {
            fieldList.add(field.getName());
        }

        return  fieldList;
    }

    /**
     * 通过类型返回对应的属性名称列表
     * 名称为该属性上的 FieldName(自定义注解) 的值
     * @param target 目标类型
     * @return 属性对应的中文名称列表
     */
    public static List<String> getFieldNames(Class<?> target) {
        // 获取所有成员变量名称
        List<String> fieldList = new ArrayList<>();
        Field[] declaredFields = target.getDeclaredFields();

        // 放入 List 集合中
        for(Field field : declaredFields) {
            // 获取该成员变量注解 FieldName 的值,即其对应的中文名称
            // 这里通过反射,取出了属性中的 value 值,即属性对象的中文名称
            fieldList.add(field.getAnnotation(FieldName.class).value());
        }

        return  fieldList;
    }

    /**
     * 获取泛型所有的成员及其值的映射
     * @param data 泛型对象
     * @param <T> 泛型
     * @return 成员变量名和成员变量值的映射
     */
    public static <T> Map<String, Object> getFieldOfValue(T data) throws IllegalAccessException {
        // 获取所有成员变量,并建立一个 Map(大小为成员变量的个数)来存放名字和值的对应关系
        Field[] declaredFields = data.getClass().getDeclaredFields();
        Map<String, Object> fieldMap = new HashMap<>(declaredFields.length);

        // 获取每个成员属性对应的值,并映射
        for (Field field : declaredFields) {
            // 允许访问私有变量的值
            field.setAccessible(true);

            // 获取成员变量的值,并放入 map 中
            fieldMap.put(field.getName(), field.get(data));
        }

        return fieldMap;
    }

}

3.通过例子实现文件导出

3.1 创建导出注解类FiledName与实体类 ImportTemplate

FileName

@Target(ElementType.FIELD)
@Retention(RetentionPolicy.RUNTIME)
public @interface FieldName {
	String value default "名字";
}
ImportTemplate

@Data
public class ImportTemplate {
	//注解@FieldName用来标注导出的excel的头行备注
    @FieldName("ID")
    private Integer ID;
    @FieldName("标题")
    private String task;
    @FieldName("需求")
    private String demand;
    @FieldName("迭代")
    private String iteration;
    @FieldName("处理人")
    private String member;
    @FieldName("项目名称")
    private String project;
    @FieldName("需求ID")
    private Integer demandID;
}

3.2 创建导出文件导出方法与实现

//下载导入模板文件
void downloadTemplate(ServletOutputStream out) throws IOException, IllegalAccessException;

//Impl
@Override
public void downloadTemplate(ServletOutputStream out) throws IOException, IllegalAccessException {
     //规定返回列表
     List<ImportTemplate> resultList = new ArrayList<>();
     ImportTemplate template = new ImportTemplate();
     template.setID(1013516);
     template.setTask("这里是任务名称");
     template.setDemand("这里是需求名称");
     template.setIteration("这里是迭代名");
     template.setMember("李四");
     template.setProject("这里是项目名");
     template.setDemandID(1023123);
     resultList.add(template);
     ExportExcel.exportExcel(resultList, out);
     if (ExportExcel.flag == false){
         System.out.println("数据表导入模板导出出错×");
     }
}

3.3 创建文件导出接口

//下载成员信息模板文件
@GetMapping("/downloadTemplate")
@ApiOperation(value="下载数据表导入模板", notes="详细描述")
@ResponseBody
public void downloadTemplate(HttpServletResponse response) throws IOException, IllegalAccessException {
    // 设置 ContentType 和返回头
    response.setContentType("application/binary;charset=UTF-8");
    response.setHeader("Content-Disposition", "attachment;fileName=" + URLEncoder.encode("数据表导入模板"+".xls", "UTF-8"));

    //获得输出流
    ServletOutputStream out = response.getOutputStream();

    // 输出 excel 表格数据
    rawdataService.downloadTemplate(out);
}

后话

以上只是通过一个简单的案例实现数据库数据封装信息的文件导出,poi对excel文件的处理还有很多有意思的地方,对报表业务的功能大有建树,属于比较底层的excel文件处理插件,用于此功能阿里也有一套EasyExcel poi插件,主要解决poi框架使用复杂,sax解析模式不容易操作,数据量大起来容易OOM,解决了POI并发造成的报错。文章来源地址https://www.toymoban.com/news/detail-449685.html

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

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

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

相关文章

  • 使用POI设计一个限制导出日期为三十天,且导出文件为excel

    使用POI设计一个限制导出日期为三十天,且导出文件为excel,前端使用Vue的element ui进行设计,前端可以通过选择时间来导出具体的表格数据,根据用户选择的时间进行Excel文件的数据导出。 按照需求来设计代码,根据element ui对前端代码进行设计。 后端使用 Java,依赖 Apache

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

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

    2024年02月11日
    浏览(37)
  • 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日
    浏览(39)
  • POI实现Excel多行复杂表头导出

    1. 定义表头标题 2. 编写导出/生成Excel工具类 3. 测试 测试结果

    2024年01月19日
    浏览(43)
  • hutool poi、apache poi实现导入导出以及解析excel

    一、前言 看了例子之后后续需要更加深入学习或者更多理解其他API的话,建议看官方文档。hutool项目是中国人维护的,有中文文档,阅读起来很方便。apache poi比较底层一点,可以更加自由去二次开发自己所需的功能。 hutool官方文档 hutool官方gitee apache poi官方文档 二、基于

    2024年02月09日
    浏览(41)
  • java poi实现Excel多级表头导出

    最近碰到一个导出,比较繁琐,也查询了许多博客,在其中一篇博客的基础上修改,实现了最终想要的效果。话不多说,直接上效果图 1.主代码: 2.合并单元格 3.设置表头单元格的宽度 4.填充数据(注:我这里的数据格式是ListMapString, Object类型,可以根据自己的实际情况来封

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

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

    2024年02月11日
    浏览(35)
  • POI实现导出复杂Excel(动态行,复杂单元格,水印,Excel转换为PDF)。

      一、POI 表格框架 1.POI : POI提供API给Java程序对Microsoft Office格式档案读和写的功能 2.HSSF:Horrible SpreadSheet Format,为读取操作提供了两类API:usermodel和eventusermodel,即“用户模型”和“事件-用户模型” 3.POI 文档结构类  HSSFWorkbook 文档对象,HSSFSheet  页,HSSFRow 行,HSSFCell 单

    2024年02月06日
    浏览(32)
  • Apache POI实现Excel导入读取数据和写入数据并导出

    Apache POI POI介绍 Apache POI是用Java编写的免费开源的跨平台的Java API,Apache POI提供API给Java程序对Microsoft Office格式档案读和写的功能,其中使用最多的就是使用POI操作Excel文件。 maven坐标: POI结构: 入门案例 ExcelTest .java文件 从Excel文件读取数据

    2024年02月12日
    浏览(32)
  • Springboot基于easyexcel实现一个excel文件包含多个sheet表格的数据导出

    EasyExcel 是一款基于Java的开源Excel操作工具,它提供了简单且强大的 API,使开发人员可以轻松地读写、操作和生成Excel文件。 EasyExcel 支持 Excel 文件的导入和导出,可以处理大量数据,具有高性能和低内存占用。它可以读取 Excel 文件中的数据,并将数据转换为 Java 对象,也可

    2024年02月03日
    浏览(45)

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

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

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

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

二维码1

领取红包

二维码2

领红包