EasyPoi

EasyPoi

官方文档

1.基础部分

1.1 依赖

spring版
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-base</artifactId>
    <version>4.1.0</version>
</dependency>
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-web</artifactId>
    <version>4.1.0</version>
</dependency>
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-annotation</artifactId>
    <version>4.1.0</version>
</dependency>
  • easypoi-annotation 基础注解包,作用与实体对象上,拆分后方便maven多工程的依赖管理
  • easypoi-base 导入导出的工具包,可以完成Excel导出,导入,Word的导出,Excel的导出功能
  • easypoi-web 耦合了spring-mvc 基于AbstractView,极大的简化spring-mvc下的导出功能
  • sax 导入使用xercesImpl这个包(这个包可能造成奇怪的问题哈),word导出使用poi-scratchpad,都作为可选包了
boot版
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-spring-boot-starter</artifactId>
    <version>4.4.0</version>
</dependency>

1.2 注解

@Excel

作用到filed上面,是对Excel一列的一个描述
1.2.1 注解属性

image-20220505202628362

1.2.2 举例
@Data
@AllArgsConstructor
@ExcelTarget("users")
public class User {
    @Excel(name = "用户编码", width = 30)
    private Long id;
    @Excel(name = "用户名")
    private String name;
    @Excel(name = "性别")
    private String sex;
}
    public static void main(String[] args) throws IOException {
        List<User> list = new ArrayList<>();
        User user = new User(1L, "张三", "男");
        list.add(user);
        Workbook sheets = ExcelExportUtil.exportExcel(new ExportParams("计算机一班学生", "学生"),
                User.class, list);
        FileOutputStream stream = new FileOutputStream("/aa.xls");
        sheets.write(stream);
        stream.close();
        sheets.close();
    }

@ExcelCollection

表示一个集合,主要针对一对多的导出,比如一个老师对应多个科目,科目就可以用集合表示
// 默认

@ExcelEntity

 表示一个继续深入导出的实体,但他没有太多的实际意义,只是告诉系统这个对象里面同样有导出的字段

@ExcelIgnore

和名字一样表示这个字段被忽略跳过这个导导出

@ExcelTarget

这个是作用于最外层的对象,描述这个对象的id,以便支持一个对象可以针对不同导出做出不同处理

1.3 基本用法总结

    1. 单表数据导出
//涉及注解
@ExcelTarget: 用于类上
@Excel: 用于需要导出的属性上
@ExcelIgnore: 用于不需要导出的属性上 
    1. 一对一数据导出
//此处在1的基础上进行
@ExcelEntity: 用于有外键一方中逻辑外键属性。
//注意:被引用外键的一方需要同时按照1的规则添加相应的注解
  • 一对多数据导出
//此处在1的基础上进行
@ExcelCollection: 用于逻辑外检属性上。
//子类同样需要按照1的规则进行。

2. 导出部分

2.1 导出xls

    @RequestMapping("export")
    public void export(HttpServletResponse response) throws IOException {
        //模拟查询数据库
        List<User> users=null;
        Workbook result = ExcelExportUtil.exportExcel(
                new ExportParams("用户信息表", "用户信息"),
                User.class, users);
        //写出
        ServletOutputStream outputStream = response.getOutputStream();
        //设置请求头,解决文件名中文乱码问题
        response.setHeader("content-disposition","attachment;fileName="+ URLEncoder.encode("用户信息.xls","utf-8"));
        result.write(outputStream);
        outputStream.close();
        result.close();
    }

2.2 导出图片

// 重要步骤
@Excel(type='2')

image-20220505212657803

2.3 大数据导出

当数据量在几万甚至更多时使用

2.3.1 对应方法源码
  /**
     * @param entity
     *            表格标题属性
     * @param pojoClass
     *            Excel对象Class
     * @param dataSet
     *            Excel对象数据List
     */
    public static Workbook exportBigExcel(ExportParams entity, Class<?> pojoClass,
                                          Collection<?> dataSet) {
        ExcelBatchExportServer batachServer = ExcelBatchExportServer
            .getExcelBatchExportServer(entity, pojoClass);
        return batachServer.appendData(dataSet);
    }

    public static void closeExportBigExcel() {
        ExcelBatchExportServer batachServer = ExcelBatchExportServer.getExcelBatchExportServer(null,
            null);
        batachServer.closeExportBigExcel();
    }
2.3.2 举例
@Test
    public void bigDataExport() throws Exception {

        List<MsgClient> list = new ArrayList<MsgClient>();
        Workbook workbook = null;
        Date start = new Date();
        ExportParams params = new ExportParams("大数据测试", "测试");
        for (int i = 0; i < 1000000; i++) {  //一百万数据量
            MsgClient client = new MsgClient();
            client.setBirthday(new Date());
            client.setClientName("小明" + i);
            client.setClientPhone("18797" + i);
            client.setCreateBy("JueYue");
            client.setId("1" + i);
            client.setRemark("测试" + i);
            MsgClientGroup group = new MsgClientGroup();
            group.setGroupName("测试" + i);
            client.setGroup(group);
            list.add(client);
            //==================此处,分段写入导出===================
            if(list.size() == 10000){
                workbook = ExcelExportUtil.exportBigExcel(params, MsgClient.class, list);
                //===============清空集合,继续分段===========
                list.clear();
            }
        }
        //释放资源
        ExcelExportUtil.closeExportBigExcel();
        System.out.println(new Date().getTime() - start.getTime());
        File savefile = new File("D:/excel/");
        if (!savefile.exists()) {
            savefile.mkdirs();
        }
        FileOutputStream fos = new FileOutputStream("D:/excel/ExcelExportBigData.bigDataExport.xlsx");
        //写出,关流
        workbook.write(fos);
        fos.close();
    }

2.4 下拉生成

@Excel 加入 addressList 是否生成下拉的选项,默认false
目前下拉只支持replace和dict两个取值地方生成
根据对应的值生成相应的下拉,xssf下拉rowMax = 100,hssf下拉maxRow=65536,从数据第一行开始生成,使用方法也比较简单

2.5 导出样式配置

  • 源码
public interface IExcelExportStyler {
    /**
     * 列表头样式
     * @param headerColor
     * @return
     */
    public CellStyle getHeaderStyle(short headerColor);
    /**
     * 标题样式
     * @param color
     * @return
     */
    public CellStyle getTitleStyle(short color);
    /**
     * 获取样式方法
     * @param Parity
     * @param entity
     * @return
     */
    public CellStyle getStyles(boolean Parity, ExcelExportEntity entity);
}

image-20220506090954326

3. 导入部分

前提: 表单提交时,请求方式必须是post,action必须是multipart/form-data

3.1简单导入

//导入的方法有以下几个
// 入参: file(导入的文件),class(对应的pojo的class),importParams(表标题,sheet标题)
  ImportParams params = new ImportParams();
        params.getHeadRows(); //用于设置头部所占行数,默认为1
        params.setImportFields(); //用于校验xls是否符合某种格式,此处入参为一个字符串数组
        params.setSheetNum(); //上传表格需要读取的sheet 数量,默认为1
        params.setStartSheetIndex(); //开始读取的sheet位置,默认为0

image-20220506103907362

3.2 大数据读取

  • 以下方法支持大数据导入,建议 数据量在10万以上时使用。该方法不支持校验,不支持图片,不支持一对多
/**
     * Excel 通过SAX解析方法,适合大数据导入,不支持图片
     * 导入 数据源本地文件,不返回校验结果 导入 字 段类型 Integer,Long,Double,Date,String,Boolean
     * 
     * @param inputstream
     * @param pojoClass
     * @param params
     * @param handler
     */
    public static void importExcelBySax(InputStream inputstream, Class<?> pojoClass,
                                        ImportParams params, IReadHandler handler) {
        new SaxReadExcel().readExcel(inputstream, pojoClass, params, handler);
    }

学习记录

### 集成EasyPOI实现Excel导入导出 #### Maven依赖配置 为了在Spring Boot项目中集成EasyPOI,首先需要在`pom.xml`文件中加入相应的Maven依赖。这一步骤确保了开发环境能够识别并使用EasyPOI库来完成后续的操作。 ```xml <dependency> <groupId>cn.afterturn</groupId> <artifactId>easypoi-spring-boot-starter</artifactId> <version>4.3.0</version> </dependency> ``` 此段代码展示了如何向项目的构建文件添加必要的依赖项以便于利用EasyPOI的功能[^3]。 #### 实体类定义与注解应用 接着,在实体类的属性上方添加`@Excel`注解用于指定Excel表头名称以及其它元数据信息。这些设置有助于程序自动匹配Java对象字段和Excel文档中的列名,从而简化了数据读取和写入的过程。 ```java import cn.afterturn.easypoi.excel.annotation.Excel; public class User { @Excel(name="姓名", orderNum = "1") private String name; @Excel(name="年龄", orderNum = "2") private Integer age; } ``` 上述例子说明了怎样通过自定义注解的方式关联JavaBean成员变量至对应的电子表格栏目。 #### 启动类编写 创建应用程序入口点即启动类,并标注为`@SpringBootApplication`以激活Spring Boot特性支持。此类通常包含一个静态方法main()作为执行起点。 ```java @SpringBootApplication public class SpringBootEasyPoiApp { public static void main(String[] args) { SpringApplication.run(SpringBootEasyPoiApp.class, args); } } ``` 这段源码片段体现了标准的Spring Boot应用初始化逻辑[^2]。 #### Excel 导入功能实现 对于Excel导入而言,可以借助EasyPOI提供的API轻松解析上传文件并将其中的内容映射到预先设计好的业务模型之上。具体来说就是调用工具类的方法传入InputStream参数代表待处理的目标文件流,再由框架内部负责完成整个转换流程。 ```java List<User> userList = ExcelImportUtil.importExcel(file.getInputStream(), User.class, new ImportParams()); ``` 这里给出了一个简单的示例用来展示如何接收前端传递过来的二进制资料并通过EasyPOI快速将其转化为列表形式的对象集合[^1]。 #### 基础Excel导出操作 当涉及到基本级别的Excel输出需求时,则可以通过如下方式达成目的: ```java Workbook workbook = ExcelExportUtil.exportExcel(new ExportParams("SheetName"), User.class, dataList); FileOutputStream fos = null; try{ fos = new FileOutputStream(filePath); workbook.write(fos); }finally{ IOUtils.closeQuietly(fos); } ``` 该部分阐述了一个典型场景下生成工作簿实例并向磁盘保存最终成果的具体做法。 #### 大量数据高效导出策略 面对海量记录集的情况下,为了避免一次性加载过多条目造成资源占用过高甚至溢出的风险,建议采用分批读取数据库配合逐片追加模式逐步填充目标文件内容。这种方式不仅提高了性能表现同时也降低了系统崩溃的可能性。 ```java // 设置每次查询的数量大小 int batchSize = 1000; PageHelper.startPage(pageNumber, pageSize); while (true){ List<T> pageData = service.findBatchData(); if(CollectionUtils.isEmpty(pageData)){ break; } // 将每一页的数据写出到Excel中... } // 关闭workbook释放资源 if(workbook !=null){ try { workbook.close(); } catch (IOException e) { log.error(e.getMessage(), e); } } ``` 以上代码片段描述了一种适用于大规模数据集的有效解决方案,它允许开发者按照一定规则分割原始素材进而有序地实施批量传输动作[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

ArchieSean

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

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值