前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【easypoi导出实例】

【easypoi导出实例】

作者头像
用户5640963
发布2020-02-25 17:04:07
1.6K0
发布2020-02-25 17:04:07
举报
文章被收录于专栏:卯金刀GG卯金刀GG

疫情严重,隔离在家,不出门既是爱国,抽出一个项目中使用的easypoi导出代码,请大家指教。

测试项目:使用easypoi导出excel文件

1、创建springboot项目,使用如下POM

代码语言:javascript
复制
<properties>
        <java.version>1.8</java.version>
        <mapper.starter.version>2.1.5</mapper.starter.version>
    </properties>

    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-jdbc</artifactId>
            <scope>runtime</scope>
        </dependency>
        <dependency>
            <groupId>mysql</groupId>
            <artifactId>mysql-connector-java</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>test</scope>
            <exclusions>
                <exclusion>
                    <groupId>org.junit.vintage</groupId>
                    <artifactId>junit-vintage-engine</artifactId>
                </exclusion>
            </exclusions>
        </dependency>
        <dependency>
			<groupId>cn.afterturn</groupId>
			<artifactId>easypoi-spring-boot-starter</artifactId>
			<version>3.3.0</version>
		</dependency>
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring-boot-starter</artifactId>
            <version>${mapper.starter.version}</version>
        </dependency>
        <dependency>
            <groupId>tk.mybatis</groupId>
            <artifactId>mapper-spring</artifactId>
            <version>1.1.5</version>
        </dependency>
    </dependencies>

2、application.properties配置

代码语言:javascript
复制
server.port=8080

spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/hake?useUnicode=true&characterEncoding=utf8&serverTimezone=CTT&allowMultiQueries=true&autoReconnect=true&rewriteBatchedStatements=true
spring.datasource.username=root
spring.datasource.password=longfor

mybatis.mapper-locations=classpath*:mapper/*.xml
mybatis.type-aliases-package=com.liu.exportdemo.model

3、HkUserDosimetersMapper.xml配置

代码语言:javascript
复制
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.liu.exportdemo.mapper.HkUserDosimetersMapper">

    <resultMap id="BaseResultMap" type="com.liu.exportdemo.model.HkUserDosimeters">
        <id column="ID" jdbcType="INTEGER" property="id"/>
        <result column="UUID" jdbcType="VARCHAR"
                property="uuid"/>
        <result column="DOSEYEAR" jdbcType="VARCHAR"
                property="doseyear"/>
        <result column="DOSESEASON" jdbcType="INTEGER"
                property="doseseason"/>
        <result column="USERNO" jdbcType="VARCHAR"
                property="userno"/>
        <result column="USERRADIATIONNO" jdbcType="VARCHAR"
                property="userradiationno"/>
        <result column="USERNAME" jdbcType="VARCHAR"
                property="username"/>
        <result column="USERSEX" jdbcType="INTEGER"
                property="usersex"/>
        <result column="HOSPITALCODE" jdbcType="VARCHAR"
                property="hospitalcode"/>
        <result column="HOSPITALNAME" jdbcType="VARCHAR"
                property="hospitalname"/>
        <result column="DEPARTMENTCODE" jdbcType="VARCHAR"
                property="departmentcode"/>
        <result column="DEPARTMENTNAME" jdbcType="VARCHAR"
                property="departmentname"/>
        <result column="DOSIMETERNO" jdbcType="VARCHAR"
                property="dosimeterno"/>
        <result column="NEWDOSIMETERNO" jdbcType="VARCHAR"
                property="newdosimeterno"/>
        <result column="CHANGFLAG" jdbcType="INTEGER"
                property="changflag"/>
        <result column="CHANGTIME" jdbcType="TIMESTAMP"
                property="changtime"/>
        <result column="FLAG" jdbcType="INTEGER"
                property="flag"/>
        <result column="DELMARK" jdbcType="INTEGER"
                property="delmark"/>
        <result column="REMARKS" jdbcType="VARCHAR"
                property="remarks"/>
        <result column="CREATETIME" jdbcType="TIMESTAMP"
                property="createtime"/>
        <result column="CREATEUSER" jdbcType="VARCHAR"
                property="createuser"/>
        <result column="MODIFYTIME" jdbcType="TIMESTAMP"
                property="modifytime"/>
        <result column="MODIFYUSER" jdbcType="VARCHAR"
                property="modifyuser"/>
    </resultMap>

    <select id="selectListExport" resultMap="BaseResultMap" parameterType="com.liu.exportdemo.model.HkUserDosimeters">
        set @n = 0;
        select
        `id`,
        (@n := @n + 1) orderid,
        `UUID`,`doseyear`,`doseseason`,`userno`,`userRadiationNo`,`userName`,`userSex`,`hospitalCode`,`hospitalName`,
        `departmentCode`,`departmentName`,`dosimeterNo`,`newdosimeterNo`,`changflag`,
        `changtime`,`flag`,`delMark`,`remarks`,
        IF(`userSex`=1,'男','女') sexStr,
        IF(changflag =0,'未换领','已领取') changflagStr,
        IF(
        changtime IS NOT NULL,
        DATE_FORMAT(changtime, '%Y-%m-%d %H:%i:%s'),
        ''
        ) changtimeStr
        from hk_user_dosimeters
        order by id asc
    </select>
</mapper>

4、HkUserDosimetersMapper.java文件

代码语言:javascript
复制
public interface HkUserDosimetersMapper {
    List<HkUserDosimeters> selectListExport(HkUserDosimeters hkUserDosimeters);
}

5、service层

代码语言:javascript
复制
public interface IHkUserDosimetersService {
    List<HkUserDosimeters> selectListExport(HkUserDosimeters hkUserDosimeters);

}

/**
 *
 */
@Slf4j
@Service
public class HkUserDosimetersServiceImpl implements IHkUserDosimetersService {
    @Resource
    private HkUserDosimetersMapper hkUserDosimetersMapper;

    @Override
    public List<HkUserDosimeters> selectListExport(HkUserDosimeters hkUserDosimeters) {
        return hkUserDosimetersMapper.selectListExport(hkUserDosimeters);
    }

}

6、controller层

代码语言:javascript
复制
@Slf4j
@RestController
@RequestMapping("/hkUserDosimeters")
public class HkUserDosimetersController {

    @Resource
    private IHkUserDosimetersService ihkUserDosimetersService;

    /**
     * 导出
     * @param hkUserDosimeters
     * @return
     */
    @PostMapping("/export")
    public void export(@RequestBody HkUserDosimeters hkUserDosimeters,HttpServletResponse response) {
        try {
            List<HkUserDosimeters> hkUserDosimeterses =
                    ihkUserDosimetersService.selectListExport(hkUserDosimeters);
            ExportWordUtils.exportExcel(hkUserDosimeterses,"计量笔统计","计量笔统计",
                    HkUserDosimeters.class,"计量笔统计",response);
        } catch (Exception e) {
            log.error("HkUserDosimeters导出异常——》", e);
        }
    }
}

7、启动类

代码语言:javascript
复制
@SpringBootApplication
@MapperScan("com.liu.exportdemo.mapper")
public class ExportdemoApplication {

    public static void main(String[] args) {
        SpringApplication.run(ExportdemoApplication.class, args);
    }

}

8、导出公共类方法

代码语言:javascript
复制
/**
 * @Author: Liu Yue
 * @Descripition: 导出excel和word的通用方法
 * @Date; Create in 2019/12/17 10:00
 **/
public class ExportWordUtils {
    /**
     * 模板路径
     */
    private static final String TEMPLATE_PATH = "word/";

    /**
     * 导出word
     * <p>第一步生成替换后的word文件,只支持docx</p>
     * <p>第二步下载生成的文件</p>
     * <p>第三步删除生成的临时文件</p>
     * 模版变量中变量格式:{{foo}}
     *
     * @param templatePath word模板地址
     * @param temDir       生成临时文件存放地址
     * @param fileName     文件名
     * @param params       替换的参数
     * @param request      HttpServletRequest
     * @param response     HttpServletResponse
     */
    public static void exportWord(String templatePath, String temDir, String fileName,
                                  Map<String, Object> params, HttpServletRequest request, HttpServletResponse response) {
        Assert.notNull(templatePath, "模板路径不能为空");
        Assert.notNull(temDir, "临时文件路径不能为空");
        Assert.notNull(fileName, "导出文件名不能为空");
        Assert.isTrue(fileName.endsWith(".docx"), "word导出请使用docx格式");
        if (!temDir.endsWith("/")) {
            temDir = temDir + File.separator;
        }
        File dir = new File(temDir);
        if (!dir.exists()) {
            dir.mkdirs();
        }
        try {
            String userAgent = request.getHeader("user-agent").toLowerCase();
            if (userAgent.contains("msie") || userAgent.contains("like gecko")) {
                fileName = URLEncoder.encode(fileName, "UTF-8");
            } else {
                fileName = new String(fileName.getBytes("utf-8"), "ISO-8859-1");
            }
            XWPFDocument doc = WordExportUtil.exportWord07(templatePath, params);
            String tmpPath = temDir + fileName;
            FileOutputStream fos = new FileOutputStream(tmpPath);
            doc.write(fos);
            // 设置强制下载不打开
            response.setContentType("application/force-download");
            // 设置文件名
            response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);
            OutputStream out = response.getOutputStream();
            doc.write(out);
            out.close();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            //delFileWord(temDir,fileName);//这一步看具体需求,要不要删
        }
    }

    /**
     * 生成excel对象
     *
     * @param params       模板导出参数设置
     * @param data         模板导出数据
     * @param templateName 模板名称
     * @return workBook对象
     * @throws Exception 异常抛出
     */
    public static Workbook getWorkbook(TemplateExportParams params, Map<String, Object> data, String templateName) throws Exception {
        String templatePath = TEMPLATE_PATH + templateName;
        File file = getTemplateFile(templatePath);
        params.setTemplateUrl(file.getAbsolutePath());
        Workbook book = ExcelExportUtil.exportExcel(params, data);
        if (file.exists()) {
            file.delete();
        }
        return book;
    }

    /**
     * 导出excel对象
     *
     * @param response httpResponse对象
     * @param workbook workBook对象
     * @param fileName 导出文件名
     * @throws Exception 异常抛出
     */
    public static void export(HttpServletResponse response, Workbook workbook, String fileName) throws Exception {
        response.setContentType("application/x-msdownload");
        fileName = fileName + new SimpleDateFormat("yyyyMMddHHmmss").format(new Date());
        response.setHeader("Content-disposition", "attachment; filename=" + new String(fileName.getBytes("gb2312"), "ISO-8859-1") + ".xls");
        ServletOutputStream outStream = null;
        //OutputStream outStream = null;
        try {
            outStream = response.getOutputStream();
            workbook.write(outStream);
        } finally {
            outStream.close();
        }
    }

    /**
     * 获取模板文件--获取到的文件为临时文件,用完后需要手动删除
     * <p>由于springboot打包成jar之后,不能以绝对路径的形式读取模板文件,故此处将模板文件以临时文件的形式写到磁盘中,用完请手动删除</p>
     *
     * @param templatePath 模板路径
     * @return 模板文件
     * @throws Exception 异常抛出
     */
    public static File getTemplateFile(String templatePath) throws Exception {
        File file = File.createTempFile("temp", null);
        ResourcePatternResolver resolver = new PathMatchingResourcePatternResolver();
        Resource[] resources = resolver.getResources(templatePath);
        if (resources.length == 1) {
            InputStream inputStream = resources[0].getInputStream();
            inputStreamToFile(inputStream, file);
        } else {
            System.out.println("请检查模板文件是否存在");
        }
        return file;
    }

    /**
     * InputStream 转file
     *
     * @param ins  输入流
     * @param file 目标文件
     */
    public static void inputStreamToFile(InputStream ins, File file) {
        try {
            OutputStream os = new FileOutputStream(file);
            int bytesRead = 0;
            byte[] buffer = new byte[8192];
            while ((bytesRead = ins.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
            os.close();
            ins.close();
        } catch (Exception e) {
            e.printStackTrace();
        }
    }
    //以下是excel的通用方法类

    /**
     * excel 导出
     *
     * @param list           数据
     * @param title          标题
     * @param sheetName      sheet名称
     * @param pojoClass      pojo类型
     * @param fileName       文件名称
     * @param isCreateHeader 是否创建表头
     * @param response
     */
    public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, boolean isCreateHeader, HttpServletResponse response) throws IOException {
        ExportParams exportParams = new ExportParams(title, sheetName, ExcelType.XSSF);
        exportParams.setCreateHeadRows(isCreateHeader);
        defaultExport(list, pojoClass, fileName, response, exportParams);
    }

    /**
     * excel 导出
     *
     * @param list      数据
     * @param title     标题
     * @param sheetName sheet名称
     * @param pojoClass pojo类型
     * @param fileName  文件名称
     * @param response
     */
    public static void exportExcel(List<?> list, String title, String sheetName, Class<?> pojoClass, String fileName, HttpServletResponse response) throws IOException {
        defaultExport(list, pojoClass, fileName, response, new ExportParams(title, sheetName, ExcelType.XSSF));
    }

    /**
     * excel 导出
     *
     * @param list         数据
     * @param pojoClass    pojo类型
     * @param fileName     文件名称
     * @param response
     * @param exportParams 导出参数
     */
    public static void exportExcel(List<?> list, Class<?> pojoClass, String fileName, ExportParams exportParams, HttpServletResponse response) throws IOException {
        defaultExport(list, pojoClass, fileName, response, exportParams);
    }

    /**
     * excel 导出
     *
     * @param list     数据
     * @param fileName 文件名称
     * @param response
     */
    public static void exportExcel(List<Map<String, Object>> list, String fileName, HttpServletResponse response) throws IOException {
        defaultExport(list, fileName, response);
    }

    /**
     * 默认的 excel 导出
     *
     * @param list         数据
     * @param pojoClass    pojo类型
     * @param fileName     文件名称
     * @param response
     * @param exportParams 导出参数
     */
    private static void defaultExport(List<?> list, Class<?> pojoClass, String fileName, HttpServletResponse response, ExportParams exportParams) throws IOException {
        Workbook workbook = ExcelExportUtil.exportExcel(exportParams, pojoClass, list);
        downLoadExcel(fileName, response, workbook);
    }

    /**
     * 默认的 excel 导出
     *
     * @param list     数据
     * @param fileName 文件名称
     * @param response
     */
    private static void defaultExport(List<Map<String, Object>> list, String fileName, HttpServletResponse response) throws IOException {
        Workbook workbook = ExcelExportUtil.exportExcel(list, ExcelType.HSSF);
        downLoadExcel(fileName, response, workbook);
    }

    /**
     * 下载
     *
     * @param fileName 文件名称
     * @param response
     * @param workbook excel数据
     */
    private static void downLoadExcel(String fileName, HttpServletResponse response, Workbook workbook) throws IOException {
        try {
            response.setCharacterEncoding("UTF-8");
            response.setHeader("content-Type", "application/vnd.ms-excel");
            response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode(fileName + "." + ExcelTypeEnum.XLSX.getValue(), "UTF-8"));
            workbook.write(response.getOutputStream());
        } catch (Exception e) {
            throw new IOException(e.getMessage());
        }
    }

    /**
     * excel 导入
     *
     * @param filePath   excel文件路径
     * @param titleRows  标题行
     * @param headerRows 表头行
     * @param pojoClass  pojo类型
     * @param <T>
     * @return
     */
    public static <T> List<T> importExcel(String filePath, Integer titleRows, Integer headerRows, Class<T> pojoClass) throws IOException {
        if (StringUtils.isBlank(filePath)) {
            return null;
        }
        ImportParams params = new ImportParams();
        params.setTitleRows(titleRows);
        params.setHeadRows(headerRows);
        params.setNeedSave(true);
        params.setSaveUrl("/excel/");
        try {
            return ExcelImportUtil.importExcel(new File(filePath), pojoClass, params);
        } catch (NoSuchElementException e) {
            throw new IOException("模板不能为空");
        } catch (Exception e) {
            throw new IOException(e.getMessage());
        }
    }

    /**
     * excel 导入
     *
     * @param file      excel文件
     * @param pojoClass pojo类型
     * @param <T>
     * @return
     */
    public static <T> List<T> importExcel(MultipartFile file, Class<T> pojoClass) throws IOException {
        return importExcel(file, 1, 1, pojoClass);
    }

    /**
     * excel 导入
     *
     * @param file       excel文件
     * @param titleRows  标题行
     * @param headerRows 表头行
     * @param pojoClass  pojo类型
     * @param <T>
     * @return
     */
    public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, Class<T> pojoClass) throws IOException {
        return importExcel(file, titleRows, headerRows, false, pojoClass);
    }

    /**
     * excel 导入
     *
     * @param file       上传的文件
     * @param titleRows  标题行
     * @param headerRows 表头行
     * @param needVerfiy 是否检验excel内容
     * @param pojoClass  pojo类型
     * @param <T>
     * @return
     */
    public static <T> List<T> importExcel(MultipartFile file, Integer titleRows, Integer headerRows, boolean needVerfiy, Class<T> pojoClass) throws IOException {
        if (file == null) {
            return null;
        }
        try {
            return importExcel(file.getInputStream(), titleRows, headerRows, needVerfiy, pojoClass);
        } catch (Exception e) {
            throw new IOException(e.getMessage());
        }
    }

    /**
     * excel 导入
     *
     * @param inputStream 文件输入流
     * @param titleRows   标题行
     * @param headerRows  表头行
     * @param needVerfiy  是否检验excel内容
     * @param pojoClass   pojo类型
     * @param <T>
     * @return
     */
    public static <T> List<T> importExcel(InputStream inputStream, Integer titleRows, Integer headerRows, boolean needVerfiy, Class<T> pojoClass) throws IOException {
        if (inputStream == null) {
            return null;
        }
        ImportParams params = new ImportParams();
        params.setTitleRows(titleRows);
        params.setHeadRows(headerRows);
        params.setSaveUrl("/excel/");
        params.setNeedSave(true);
        params.setNeedVerfiy(needVerfiy);
        try {
            return ExcelImportUtil.importExcel(inputStream, pojoClass, params);
        } catch (NoSuchElementException e) {
            throw new IOException("excel文件不能为空");
        } catch (Exception e) {
            throw new IOException(e.getMessage());
        }
    }

    /**
     * Excel 类型枚举
     */
    enum ExcelTypeEnum {
        XLS("xls"), XLSX("xlsx");
        private String value;

        ExcelTypeEnum(String value) {
            this.value = value;
        }

        public String getValue() {
            return value;
        }

        public void setValue(String value) {
            this.value = value;
        }
    }
}

代码地址: https://gitee.com/maojindaogg/easypoidemo

补充DDL语句:

代码语言:javascript
复制
/*DDL 信息*/------------

CREATE TABLE `hk_user_dosimeters` (
  `id` int(21) NOT NULL AUTO_INCREMENT COMMENT '主键',
  `UUID` varchar(64) DEFAULT NULL COMMENT 'uuid',
  `doseyear` varchar(10) DEFAULT NULL COMMENT '监测年份',
  `doseseason` int(1) DEFAULT NULL COMMENT '监测季节',
  `userno` varchar(100) NOT NULL COMMENT '用户工号',
  `userRadiationNo` varchar(100) DEFAULT NULL COMMENT '放射人员编号',
  `userName` varchar(100) DEFAULT NULL COMMENT '人员姓名',
  `userSex` int(1) DEFAULT NULL COMMENT '性别:1 男,2 女',
  `hospitalCode` varchar(64) DEFAULT NULL COMMENT '医院uuid',
  `hospitalName` varchar(100) DEFAULT NULL COMMENT '医院名称',
  `departmentCode` varchar(64) DEFAULT NULL COMMENT '科室uuid',
  `departmentName` varchar(100) DEFAULT NULL COMMENT '科室名称',
  `dosimeterNo` varchar(100) DEFAULT NULL COMMENT '原来计量笔编号',
  `newdosimeterNo` varchar(100) DEFAULT NULL COMMENT '新计量笔编号',
  `changflag` int(1) NOT NULL DEFAULT '0' COMMENT '换领标识0是未换领,1已经领取',
  `changtime` datetime DEFAULT NULL COMMENT '换领时间',
  `flag` int(1) NOT NULL DEFAULT '1' COMMENT '有效标记1:有效;0无效',
  `delMark` int(1) DEFAULT '1' COMMENT '删除标记1:没删除;0删除',
  `remarks` varchar(100) DEFAULT NULL COMMENT '描述、备注',
  `createTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `createUser` varchar(100) DEFAULT NULL COMMENT '创建人',
  `modifyTime` datetime NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '更新时间',
  `modifyUser` varchar(100) DEFAULT NULL COMMENT '更新人',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=3081 DEFAULT CHARSET=utf8
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档