hutool实现导入、导出功能

前言

推荐一个小而全的java工具类hutool,这个类库有比较完善的官方文档,其中还会有案例代码,用来讲解如何使用其中的工具类,我将官网的地址放在下面了,有兴趣的小伙伴可以去看看

hutool官方文档

也不讲太多废话了进入正题

今日内容

  1. Excel 表格导出
  2. Excel 表格导入

正文

导入pom

        <dependency>
            <groupId>cn.hutool</groupId>
            <artifactId>hutool-all</artifactId>
            <version>5.7.16</version>
        </dependency>

1.Excel 表格导出 实现

Service层

 @Override
    public ExcelWriter export(Long currentCompanyId) {
        //数据源
        List<DeviceVo> device = dao.findDevice(projId);

        //生成xlsx格式 需要使用 使用ExcelUtil.getWriter(true)创建。
        ExcelWriter writer = ExcelUtil.getWriter(true);
        //只导出有别名的列,默认是会将未命中的记录排在首位,如果不加会多导出一行
        writer.setOnlyAlias(true);
        // 左 字段名   右 Excel表头别名
        writer.addHeaderAlias("number","设备号");
        writer.addHeaderAlias("name","设备名称");
        writer.addHeaderAlias("deviceTypeName","设备类型");
        writer.addHeaderAlias("status","设备当前状态");
        writer.addHeaderAlias("note","备注");
        writer.addHeaderAlias("productionDate","生产日期");
        writer.addHeaderAlias("installationDate","安装日期");
        
        // 一次性写出内容,使用默认样式,强制输出标题
        writer.write(device,true);
        return writer;
    }

Controller层

    @GetMapping("/export")
    public void export(HttpServletResponse response) throws IOException {
        long currentCompanyId = ContextSession.getCurrentCompanyId();
        
        //得到ExcelWriter 对象
        ExcelWriter export = deviceService.export(currentCompanyId);
        response.setContentType("application/vnd.ms-excel;charset=utf-8");
        
        //设置文件名
        String fileName = URLEncoder.encode("设备列表", "UTF-8");
        
        //设置响应头 fileName.xlsx"是弹出下载对话框的文件名,不能为中文,中文请自行编码
        response.setHeader("Content-Disposition","attachment;filename="+fileName+".xlsx");
        //获取字节输出流
        ServletOutputStream outputStream= response.getOutputStream();

        //关闭流前,先清空缓冲区数据
        export.flush(outputStream,true);
        // 关闭流,释放内存
        outputStream.close();
        // 关闭writer,释放内存
        export.close();
    }

2.Excel 表格导入 实现

表格列头
在这里插入图片描述
实体类

@Data
public class WriteDevice {
    
    private String number;

    private String name;

    private String deviceTypeName;

    private String note;

    private LocalDateTime productionDate;

    private LocalDateTime installationDate;

    private String status;

    private String online;

    private String projectName;
}

Controller层

    @PostMapping(path="/import")
    public ApiResult importData(@RequestParam("file") MultipartFile file) throws IOException {
        //字节输入流
        InputStream inputStream = file.getInputStream();
        //通过输入流创建ExcelReader 对象
        ExcelReader reader = ExcelUtil.getReader(inputStream);
        //这个同上导入
        reader.addHeaderAlias("设备编号","number");
        reader.addHeaderAlias("设备名称","name");
        reader.addHeaderAlias("设备类型","deviceTypeName");
        reader.addHeaderAlias("备注","note");
        reader.addHeaderAlias("生产日期","productionDate");
        reader.addHeaderAlias("安装日期","installationDate");
        reader.addHeaderAlias("状态","status");
        reader.addHeaderAlias("是否上线","online");
        reader.addHeaderAlias("所属项目","projectName");
        
        List<WriteDevice> devices = reader.readAll(WriteDevice.class);
        
        //业务方法
        deviceService.BatchAdd(devices);
        return resultWrapOk();
    }

Service层

    @Override
    public void BatchAdd(List<WriteDevice> list) {
    //循环添加进数据库,这逻辑就根据自己字段来编写添加的数据
        list.forEach(item ->{
            Device device = new Device();
            long count = dao.getCountByMt(Mql.getWhere("number", AssertParams.notBlank(item.getNumber())));
            AssertBiz.isTrue(count == 0, "设备号已存在");
            device.setNumber(item.getNumber());
            device.setName(item.getName());
            Map map = deviceTypeDao.findByName(item.getDeviceTypeName());
            device.setDeviceTypeId(Long.parseLong(map.get("id")+""));
            device.setProtocolType(Long.parseLong(map.get("protocol_type")+""));
            device.setNote(item.getNote());
            device.setProductionDate(item.getProductionDate());
            device.setInstallationDate(item.getInstallationDate());
            //0.停用 1.启用
            if ("停用".equals(item.getStatus())){
                device.setStatus(0);
            }else if ("启用".equals(item.getStatus())){
                device.setStatus(1);
            }
            if ("在线".equals(item.getOnline())){
                device.setOnline(true);
            }else if ("离线".equals(item.getOnline())){
                device.setOnline(false);
            }
            Long byName1 = projectDao.findByName(item.getProjectName());
            device.setProjectId(byName1);
            dao.insert(device);
        });
    }

后记

希望这篇博客能帮小伙伴们吧,其实刚才看了一下hutool类库的文档内容还是挺丰富的,还是值的看一看的,好的散会

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值