java-导入 导出 下载模板 等功能

一:先写 导入

1:java是基于包:poi 组件实现的,pom组件如下:

<!-- Excel导入功能实现 -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.17</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>3.17</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.17</version>
        </dependency>

2:但是如果完全基于poi去做,需要封装很多代码,比较复杂一下,使用阿里的组件   easyexcel

该组件是基于  上面的poi 再封装一次完成。所以如果使用 easyexcel还是必须引用poi的包

 pom里面的文件如下:但是这里需要注意   easyexcel 跟 poi的版本一定要对应起来,如果不对应就会报错,错误信息是:提示某一个类不存在 


java.lang.NoClassDefFoundError: org/apache/poi/poifs/filesystem/FileMagic
   <!-- alibaba的Excel导入功能实现 -->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>easyexcel</artifactId>
            <version>2.2.8</version>
        </dependency>

3:控制器 Controller 里面的API代码:

需要注意:

EasyExcel 就是阿里组件里面的类;

HealthTargetImport 是自定义的模板样式;如下,也贴出来

MultipartFile  是 springframework里面的封装类

count = this.service.importExcel(healthTargetImports)  这句话就是 自己写的批量添加方法,

因为上面已经拿到了excel的数据。存放在healthTargetImports 中,所以后面怎么玩都行,

 @PostMapping("/importExcel")
    @ApiOperation(value = "导入功能", notes = "导入功能")
    public ApiResponse<Integer>  importExcel(@RequestParam("file")  MultipartFile file) throws IOException {
        InputStream inputStream = file.getInputStream();
        List<HealthTargetImport> healthTargetImports = EasyExcel.read(inputStream)
                .head(HealthTargetImport.class)
                // 设置sheet,默认读取第一个
                .sheet()
                // 设置标题所在行数
                .headRowNumber(1)
                .doReadSync();

        // 获取excel的数据后添加到数据库
        int count = 0;
        if (healthTargetImports.size() > 0) {
            count = this.service.importExcel(healthTargetImports);
        }
        return ApiResponse.success(count);
    }
package com.health.util.data.excel;

import com.alibaba.excel.annotation.ExcelProperty;
import lombok.Data;

/**
 *  对接单位检项 细项 指标导入模板
 */
@Data
public class HealthTargetImport {

    /**
     * 单位编码
     */
    @ExcelProperty(value = "单位编码",index = 0)
    private String healthCode;

    /**
     * 项目编码
     */
    @ExcelProperty(value ="项目编码",index = 1)
    private String healthProjectCode;

    /**
     * 项目名称
     */
    @ExcelProperty(value = "项目名称",index = 2)
    private String healthProjectName;

    /**
     * 指标编码
     */
    @ExcelProperty(value = "指标编码",index = 3)
    private String healthTargetCode;

    /**
     * 指标名称
     */
    @ExcelProperty(value = "指标名称",index = 4)
    private String healthTargetName;

    /**
     * 数据类型
     */
    @ExcelProperty(value = "数据类型",index = 5)
    private String dataType;


    /**
     * 备注
     */
    @ExcelProperty(value = "备注",index = 6)
    private String remarks;


    /**
     * 对接单位项目内容
     */
    @ExcelProperty(value = "对接单位项目内容",index = 7)
    private String healthProjectContent;

    /**
     * 对接单位项目说明
     */
    @ExcelProperty(value = "对接单位项目说明",index = 8)
    private String healthProjectExplain;

}

4:导入已完成。当然这里还可以去做对excel的每行 每列 做一些数据约束校验。这个 可以去对阿里的一个类去重写方法。

5:测试环节:

通常用swagger测试,很简单。

因为api的参数是MultipartFile类型,所以入参直接是现在文件,如图:选择模板一致的excel直接上传文件即可。

 也可以用postman上传文件:

详细操作地址如下:

(2条消息) Postman Post请求上传文件_xulong5000的专栏-CSDN博客

二:下载模板

1:默认上面的导入功能已完成,所以 pom文件不再描述,

2:先写一个工具类ExcelUtil

public class ExcelUtil {
    /**
     * 导出
     * @param response
     * @param data
     * @param fileName
     * @param sheetName
     * @param clazz
     * @throws Exception
     */
    public static void writeExcel(HttpServletResponse response, List<? extends Object> data, String fileName, String sheetName, Class clazz) throws Exception {
        //表头样式
        WriteCellStyle headWriteCellStyle = new WriteCellStyle();
        //设置表头居中对齐
        headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
        //内容样式
        WriteCellStyle contentWriteCellStyle = new WriteCellStyle();
        //设置内容靠左对齐
        contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.LEFT);
        HorizontalCellStyleStrategy horizontalCellStyleStrategy = new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);
        EasyExcel.write(getOutputStream(fileName, response), clazz).excelType(ExcelTypeEnum.XLSX).sheet(sheetName).registerWriteHandler(horizontalCellStyleStrategy).doWrite(data);
    }

    private static OutputStream getOutputStream(String fileName, HttpServletResponse response) throws Exception {
        fileName = URLEncoder.encode(fileName, "UTF-8");
        response.setContentType("application/vnd.ms-excel");
        response.setCharacterEncoding("utf8");
        response.setHeader("Content-Disposition", "attachment;filename=" + fileName + ".xlsx");
        response.addHeader("Access-Control-Expose-Headers", "Content-disposition");

        return response.getOutputStream();
    }

3:在控制器中添加一个下载模板方法:

  /*下载模板*/
    @GetMapping("/downloadTemplate")
    @ApiOperation(value = "下载模板", notes = "下载模板", produces = "application/octet-stream")
    public void downloadTemplate(HttpServletResponse response){
        String fileName = "对接单位细项导入模板";
        String sheetName="对接单位细项导入模板";
        List<HealthTargetImport> teacherExcelList = new ArrayList<>();
        HealthTargetImport teacherExcel = new HealthTargetImport();
        teacherExcel.setHealthCode("healthCode");
//        teacherExcel.setIntro("清华毕业,高材生");
//        teacherExcel.setCareer("资深讲师");
//        teacherExcel.setSort(1);
//        teacherExcel.setLevel(1);
        teacherExcelList.add(teacherExcel);
        try {
            //TeacherExcel.class对应你的模板类
            //teacherExcelList模板的例子
            //也可以使用这种方式导出你查询出数据excel文件
            ExcelUtil.writeExcel(response,teacherExcelList,fileName,sheetName,HealthTargetImport.class);
        } catch (Exception e) {
            System.out.println(e.getCause());

        }
    }

4:这里如果用postmat去测试 或者用swagger测试都会返回乱码,需要注意:

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值