EasyExcel多sheet的导入和导出

EasyExcel基础例子

EasyExcel对于导入导出的操作十分简洁,方便快捷。其中对于多单文件多sheet的操作比较不同,在此做一下记录

导入数据

// 例子一
public void importDetail(@RequestParam(value = "file") MultipartFile serviceFile) throws IOException {
    ExcelReader excelReader = null;
    InputStream in = null;
    try {
        in = serviceFile.getInputStream();
        ExcelListener excelListener = new ExcelListener();
        excelReader = EasyExcel.read(in, DetailVO.class, excelListener).build();
        //获取sheet0对象
        ReadSheet readSheet = EasyExcel.readSheet(0).build();
        //读取数据
        excelReader.read(readSheet);
        DetailVO detail = excelListener.getData();
        //清空list数据
        excelListener.getData().clear();
        //获取sheet1对象
        ReadSheet readDetailSheet = EasyExcel.readSheet(1).build();
        //读取数据
        excelReader.read(readDetailSheet);
        List<PurchaseDetailFeignParam> purchaseDetailFeignParam = ConverterUtils.convertList(excelListener.getData(), PurchaseDetailFeignParam.class);
    } catch (IOException ex) {
        logger.error("import excel to db fail", ex);
    } finally {
        in.close();
        // 这里一定别忘记关闭,读的时候会创建临时文件,到时磁盘会崩
        if (excelReader != null) {
            excelReader.finish();
        }
    }
}
// 方法二简化版
public RestResult importThSupplier(@RequestParam("file") MultipartFile excelFile) {
        List<SupplierImport> supplierImports = null;
        try {
            if (null == excelFile) {
                return RestResult.error("导入文件有误");
            } else {
                supplierImports = ExcelUtil.readExcel(excelFile.getInputStream(), SupplierVo.class);
                if (null == supplierImports || supplierImports.size() == 0) {
                    return RestResult.error("表格为空");
                }
                // 根据实际情况对数据校验或批量出入
                if (supplierImports .size() > 0) {
                    thSupplierService.insertBatch(supplierList);
                }
            }
            return RestResult.ok("导入成功");
        } catch (Exception e) {
            e.printStackTrace();
            return RestResult.error("导入失败: " + e.getMessage());
        }
    }


// ExcelUtil.java
public static <T> List<T> readExcel(InputStream multipartIs, Class<?> model) {
        ExcelListener<T> excelListener = new ExcelListener<>();
        try (InputStream inputStream = new BufferedInputStream(multipartIs)) {
            EasyExcel.read(inputStream, model, excelListener).sheet(0).headRowNumber(1).doRead();
        } catch (Exception e) {
            log.error("catch exception:", e);
        }
        return excelListener.getData();
    }
// ExcelListener.java
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;

import java.util.ArrayList;
import java.util.List;

public class ExcelListener<T> extends AnalysisEventListener {
    private List<T> data = new ArrayList<>();

    public List<T> getData() {
        return data;
    }

    public void setData(List<T> data) {
        this.data = data;
    }

    @Override
    public String toString() {
        return "ExcelListener{" +
                "data=" + data +
                '}';
    }

    @Override
    public void invoke(Object o, AnalysisContext analysisContext) {
        T t = (T) o;
        data.add(t);
    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
    }
}

导出为多sheet

public void export(HttpServletResponse response) {
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        // 这里URLEncoder.encode可以防止中文乱码
        try {
            String fileName = URLEncoder.encode("template", "UTF-8");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
            //新建ExcelWriter 
            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build();
            //获取sheet0对象
            WriteSheet mainSheet = EasyExcel.writerSheet(0, "采购单").head(PurchaseVO.class).build();
            //向sheet0写入数据 传入空list这样只导出表头
            excelWriter.write(Lists.newArrayList(),mainSheet);
            //获取sheet1对象
            WriteSheet detailSheet = EasyExcel.writerSheet(1, "采购单明细").head(PurchaseDetailVO.class).build();
            //向sheet1写入数据 传入空list这样只导出表头
            excelWriter.write(Lists.newArrayList(),detailSheet);
            //关闭流
            excelWriter.finish();
        } catch (IOException e) {
            logger.error("导出异常{}", e.getMessage());
        }
    }

多sheet多表头导出

public void export(HttpServletResponse response) {
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf-8");
        try {
            String fileName = URLEncoder.encode("XX记录表", "UTF-8");
            response.setHeader("Content-disposition", "attachment;filename=" + fileName + ".xlsx");
            //新建ExcelWriter
            ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream()).build();

            //获取sheet对象
            WriteSheet sheet = EasyExcel.writerSheet(0, "总表").head(SumExportDto.class).build();
            //向sheet中导入数据
            List<SumExportDto> data = weeklyService.Export();
			//多表头导出
			//第一个表默认是有表头的
            WriteTable table1 = EasyExcel.writerTable(0).needHead(Boolean.FALSE).build();
            excelWriter.write(data, sheet, table1);
            
            WriteTable table2 = EasyExcel.writerTable(1).needHead(Boolean.TRUE).build();
            excelWriter.write(data, sheet,table2);
			...
			...
            excelWriter.finish();
        } catch (IOException e) {
            log.error("导出异常{}", e.getMessage());
        }
    }

——仅供参考

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 13
    评论
对于使用 EasyExcel 进行分 sheet导出,你可以按照以下步骤进行操作: 1. 导入 EasyExcel 依赖: ```xml <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>2.2.11</version> </dependency> ``` 2. 创建一个 ExcelWriter 对象: ```java String fileName = "path_to_save_file.xlsx"; ExcelWriter excelWriter = EasyExcel.write(fileName).build(); ``` 3. 定义数据模型类,作为每个 sheet 的数据对象: ```java public class DataModel { // 定义需要导出的字段 private String field1; private String field2; // ... // 省略构造函数、getter 和 setter 方法 } ``` 4. 创建多个 sheet,并写入数据: ```java List<DataModel> data = getData(); // 获取数据列表 WriteSheet sheet1 = EasyExcel.writerSheet(0, "Sheet1").head(DataModel.class).build(); excelWriter.write(data, sheet1); // 创建并写入其他 sheet WriteSheet sheet2 = EasyExcel.writerSheet(1, "Sheet2").head(DataModel.class).build(); excelWriter.write(data, sheet2); // ... ``` 5. 写入完成后关闭 ExcelWriter 对象: ```java excelWriter.finish(); ``` 6. 完整的示例代码如下: ```java public class ExcelExportUtil { public static void main(String[] args) { String fileName = "path_to_save_file.xlsx"; ExcelWriter excelWriter = EasyExcel.write(fileName).build(); List<DataModel> data = getData(); WriteSheet sheet1 = EasyExcel.writerSheet(0, "Sheet1").head(DataModel.class).build(); excelWriter.write(data, sheet1); WriteSheet sheet2 = EasyExcel.writerSheet(1, "Sheet2").head(DataModel.class).build(); excelWriter.write(data, sheet2); excelWriter.finish(); } private static List<DataModel> getData() { // 获取数据的逻辑 // ... } } ``` 这样,使用 EasyExcel 就可以实现分 sheet导出了。你只需要根据你的需求,设置不同的数据对象和 sheet 名称即可。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值