【easypoi(二)使用模板导出爬坑经历】

编程

1、开发环境,idea开发工具,windows10系统,JDK8.0;系统部署环境,CentorOS7;

2、在开发的过程中,使用模板下载文档,因为模板是固定的,只需要填写需要的信息即可;

发现问题:

模板文档放置在项目的sources/word自定义的文件夹下面,在开发的过程中,能够顺利导出word文档,但是到服务器上就导出空文档;

排查过程:

1、猜想是不是保存的临时文件错误,于是通过打印输出的文件查看,文件夹存在,但是,没有生成预想的临时文件;方法如下

StringBuilder sbd = new StringBuilder();

boolean directory = dir.isDirectory();

if (directory) {

File[] files = dir.listFiles();

for (int i = 0; i < files.length; i++) {

sbd.append(files[i].getName()+":"+files[i].getPath());

sbd.append("&&&&");

}

}

2、继续猜想,是不是resources/word的文档找不到呢;通过方法,可以获取到文档;当时直接通过file是不能获取到文件的,会报错;

     File sourceFile = ResourceUtils.getFile("classpath:word/test.docx"); //这种方法在linux下无法工作

     可以通过

    ClassPathResource resource = new ClassPathResource("word/test.docx");

     也可以通过

     @Resource private ResourceLoader resourceLoader;

     org.springframework.core.io.Resource resource = resourceLoader.getResource("classpath:word/test.docx");

     可以断定,是easypoi中在引用临时文件的时候,找不到路径报错,那么我想是不是可以使用文件复制,把test文件copy到一个临时文件,再使用这个copy的文件呢,还真有这种方法;遂解决方法一实现,copy临时文件。以下贴出简单的方法;此处借用别人的方法;

/**

*

* @param path

* @return

*/

public static String convertTemplatePath(String path) {

Resource resource = new ClassPathResource(path);

FileOutputStream fileOutputStream = null;

// 将模版文件写入到 tomcat临时目录

String folder = System.getProperty("catalina.home");

File tempFile = new File(folder + File.separator + path);

// System.out.println("文件路径:" + tempFile.getPath());

// 文件存在时 不再写入

if (tempFile.exists()) {

return tempFile.getPath();

}

File parentFile = tempFile.getParentFile();

// 判断父文件夹是否存在

if (!parentFile.exists()) {

parentFile.mkdirs();

}

try {

BufferedInputStream bufferedInputStream = new BufferedInputStream(resource.getInputStream());

fileOutputStream = new FileOutputStream(tempFile);

byte[] buffer = new byte[10240];

int len = 0;

while ((len = bufferedInputStream.read(buffer)) != -1) {

fileOutputStream.write(buffer, 0, len);

}

} catch (IOException e) {

e.printStackTrace();

} finally {

if (fileOutputStream != null) {

try {

fileOutputStream.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

return tempFile.getPath();

}

     问题解决;

3、以上的方法是解决的实际问题,但是多了copy的步骤,是不是应该还有更简便的方法;于是想到现在用的是springboot2,那么easypoi应该也有与之相关的版本,然后查看本项目引用的版本,如下;

<dependency>

<groupId>cn.afterturn</groupId>

<artifactId>easypoi-base</artifactId>

<version>3.0.1</version>

</dependency>

<dependency>

<groupId>cn.afterturn</groupId>

<artifactId>easypoi-web</artifactId>

<version>3.0.1</version>

</dependency>

<dependency>

<groupId>cn.afterturn</groupId>

<artifactId>easypoi-annotation</artifactId>

<version>3.0.1</version>

</dependency>

并不是最新版本,于是升级下版本

<dependency>

<groupId>cn.afterturn</groupId>

<artifactId>easypoi-base</artifactId>

<version>3.0.3</version>

</dependency>

<dependency>

<groupId>cn.afterturn</groupId>

<artifactId>easypoi-web</artifactId>

<version>3.0.3</version>

</dependency>

<dependency>

<groupId>cn.afterturn</groupId>

<artifactId>easypoi-annotation</artifactId>

<version>3.0.3</version>

</dependency>

或者直接引用easypoi-spring-boot-starter

<dependency>

<groupId>cn.afterturn</groupId>

<artifactId>easypoi-spring-boot-starter</artifactId>

<version>3.3.0</version>

</dependency>

然后再测试,遂完美解决。

以上是 【easypoi(二)使用模板导出爬坑经历】 的全部内容, 来源链接: utcz.com/z/513692.html

回到顶部