当前位置:首页 > Java > 正文内容

如何使用FTP中的模板文件和EasyPOI来导出Excle?

flowstone4年前 (2021-07-25)Java1982

问题描述

因工作需要导出Excel文件,使用技术为EasyPOI,EasyPOI是一个非常好的导出文件工具,官网提供非常详细的使用文档,在项目中使用EasyPOI的模板导出功能,官方提供的示例代码中,模板的路径都是本地,我使用时也是把Excle模板文件放在本地,因为之前需要导出的地方,不是很多,模板文件放在本地也没有太大问题,但是由于现在需求变更,会有大量的模板需要导出,如果放在本地会造成项目容量变大。现在想把导出的模板保存在远程的FTP服务中,EasyPOI读取FTP的中模板文件生成Excle文件。

解决步骤

1、 查找解决方式
上网找了许多相关资料,官网上也没有找到解决方法,意外浏览了一篇文章,文章中提到了一句话,说EasyPOI读取模板文件,只支持读取本地模板文件,换句话来说,我只需要把FTP中的模板文件下载到本地指定路径,然后,就可以读取模板文件。

2、创建测试项目
创建一个SpringBoot项目,POM文件中引入需要的Jar包,如下

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

<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-spring-boot-starter</artifactId>
    <version>4.3.0</version>
</dependency>
<dependency>
    <groupId>commons-net</groupId>
    <artifactId>commons-net</artifactId>
    <version>3.6</version>
</dependency>


3、添加一些配置文件

ftp:
  host: 192.168.2.2  # IP
  port: 21  # 端口
  username: root # 用户名
  password: 123456 # 密码
  mode: Passive # ftp模式
  remotePath: /root/export/ # ftp模板路径
  localPath: /Users/simonxue/Developer/Temp/ # 本地模板路径
template:
  employee: employee.xlsx #模板文件


4、 创建一个FTP下载方法,方法返回地址模板全路径名,如下所示

@Value("${ftp.host}")
private String host;
@Value("${ftp.port}")
private Integer port;
@Value("${ftp.username}")
private String username;
@Value("${ftp.password}")
private String password;
@Value("${ftp.mode}")
private String mode;
@Value("${ftp.remotePath}")
private String remotePath;
@Value("${ftp.localPath}")
private String localPath;

/**
    * 拷贝FTP中的文件到本地
    * @param fileName  ftp中的文件名
    * @return
    */
@SneakyThrows
public String localPathName(String fileName) {
    Ftp ftp = new Ftp(host, port, username, password, Charset.defaultCharset());
    ftp.setMode(FtpMode.Passive.name().equals(mode)? FtpMode.Passive: FtpMode.Active);
    String localName = localPath + fileName;
    ftp.download(remotePath, fileName, FileUtil.file(localName));
    ftp.close();
    return localName;
}


5、需要根据模板导出的地方,使用上面的方法,如下

@SneakyThrows
@Override
public void templateTest(HttpServletResponse response) {
    String localPathName = ftpUtil.localPathName(employeeTemplateName);
    response.setCharacterEncoding("utf-8");
    response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");
    response.setHeader("Content-Disposition", "attachment;filename="+ IdUtil.getSnowflake(0,0).nextIdStr()+".xlsx");
    Map<String, Object> resultMap = new HashMap<>();
    List<Employee> employeeList = new ArrayList<>();
    Employee employee = new Employee();
    employee.setJobNumber("0001");
    employee.setUsername("小码农薛尧");
    employee.setPhone("1234567901");
    employee.setEmail("xueyao.me@gmail.com");
    employeeList.add(employee);
    List<Map<String, Object>> maps = employeeList.stream().map(a -> {
        Map<String, Object> map = BeanUtil.beanToMap(a);
        return map;
    }).collect(Collectors.toList());
    resultMap.put("employees", maps);
    // 此处需要指定模板路径
    TemplateExportParams params = new TemplateExportParams(localPathName, "test");
    Workbook workbook = ExcelExportUtil.exportExcel(params, resultMap);
    OutputStream outputStream = response.getOutputStream();
    workbook.write(outputStream);
    outputStream.close();
}


6、运行代码,生成的文件如下

总结

EasyPOI不提供读取远程模板文件,但是我们可以通过其它方法来实现,下次导出Excle有格式样式改变,我们可以直接调整FTP中的模板文件就可以实现,不用重新部署项目。

项目代码已存放在Github上

扫描二维码推送至手机访问。

版权声明:本文由薛尧的博客发布,如需转载请注明出处。

本文链接:https://flowstone.sourceforge.io/?id=64

分享给朋友:
返回列表

上一篇:JPA使用-实体类上常用注解

没有最新的文章了...

相关文章

import和import static说明

今天学习rest assured自动测试框架时,写了一些Demo,看到官网上快速指南上有静态导入某个包,起初没有注意以为是import的另一种叫法,在代码的部分导入了所需要的包,但是不能调用包中的方法。后来在百度上找到了解释,原来静态导入包...

IntelliJ IDEA技巧一之隐藏.idea目录

问题场景通过IntelliJ IDEA软件创建Java Web项目时,项目目录中总会生成.idea配置目录并在软件界面里显示,影响项目美感,如何在软件界面中隐藏.idea目录呢?解决方法打开IDEA软件的设置(Mac是Preferences...

Spring Cloud入门教程一之Eureka Server

项目环境MacOSJDK1.8IntelliJ IDEA 2018.2Maven 3.5.4创建项目采用Spring Initializr创建项目选择Cloud Discovery->Eureka Discovery->项目名称...

Lombok的使用

近期在众多微信公众号中,都看到了许多大牛,写了Lombok的文章,我看了一下,基本上就围绕着如何减少代码来做说明,我来总结一下。公司现在的项目没有使用Lombok,一些实体类都是我们用IDEA提供的快捷方式生成的,后来,公司新来了一个大牛,...

Java编程思想学习总结一(一切都是对象)

存储位置寄存器堆栈 存储对象引用,堆栈指针向下移动,分配新的内存,向上移动,释放内存堆 存储Java对象常量存储 存储常量值非RAM存储 存储流对象和持久化对象基本类型所占存储空间基本类型大小包装器类型默认值boolean16bitBool...

Spring自定义注解详解

下面是RequestBody注解源码@Target(ElementType.PARAMETER) @Retention(RetentionPolicy.RUNTIME) @Documented public @interfa...