1.pom中指定资源路径和不让maven压缩docx文件
指定资源路径如下:
<include>**/*.docx</include>
不压缩docx文件如下:
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<nonFilteredFileExtensions>
<nonFilteredFileExtension>docx</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
<build>
<finalName>simple</finalName>
<resources>
<resource>
<directory>src/main/java</directory>
<includes>
<include>**/*.yml</include>
<include>**/*.properties</include>
<include>**/*.xml</include>
<!-- <include>**/*.docx</include>-->
</includes>
<filtering>false</filtering>
</resource>
<resource>
<directory>src/main/resources</directory>
<includes>
<include>**/*.yml</include>
<include>**/*.properties</include>
<include>**/*.xml</include>
<!-- 设置资源路径里资料包括.docx文件-->
<include>**/*.docx</include>
</includes>
<filtering>true</filtering>
</resource>
</resources>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
</plugin>
<!-- 不让maven压缩docx文件,但仍将其打包 -->
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-resources-plugin</artifactId>
<configuration>
<nonFilteredFileExtensions>
<nonFilteredFileExtension>docx</nonFilteredFileExtension>
</nonFilteredFileExtensions>
</configuration>
</plugin>
</plugins>
</build>
坑:
1.不设置资源路径爆出找不到文件异常:
java.io.FileNotFoundException: class path resource [*/] cannot be opened because it does not exist
2.不设置 <nonFilteredFileExtension>docx</nonFilteredFileExtension>
会将docx文件加压,报出加压异常:
java.util.zip.ZipException: Unexpected record signature: 0X9
2.pom添加poi依赖
<!-- poi-ti -->
<dependency>
<groupId>com.deepoove</groupId>
<artifactId>poi-tl</artifactId>
<version>1.12.0</version>
<exclusions>
<exclusion>
<!--移除冲突的jar包-->
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
</exclusion>
</exclusions>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.2</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.1.2</version>
</dependency>
3.service接口
public interface CherryService extends IService<Cherry> {
void export(HttpServletResponse response) throws IOException;
}
4.CherryServiceImpl
package com.cherry.manager.service.impl;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.cherry.manager.entity.Cherry;
import com.cherry.manager.dao.CherryDao;
import com.cherry.manager.service.CherryService;
import com.deepoove.poi.XWPFTemplate;
import com.deepoove.poi.util.PoitlIOUtils;
import com.google.common.collect.Maps;
import org.springframework.core.io.ClassPathResource;
import org.springframework.stereotype.Service;
import javax.servlet.http.HttpServletResponse;
import java.io.*;
import java.net.URLEncoder;
import java.util.Map;
/**
* (Cherry)表服务实现类
*
* @since 2022-09-21 11:12:53
*/
@Service
public class CherryServiceImpl extends ServiceImpl<CherryDao, Cherry> implements CherryService {
/**
* 生成word文档
* @param response
*/
@Override
public void export(HttpServletResponse response) throws IOException {
// 假设要输出的内容,实际从数据库取
Cherry cherry = new Cherry();
cherry.setId("01");
cherry.setName("车厘子");
// 文件名称
String fileName = System.currentTimeMillis()+"车厘子"+".docx";
// word文档里设置内容
Map<String, Object> dataMap = Maps.newHashMap();
dataMap.put("id",cherry.getId());
dataMap.put("name",cherry.getName());
// 获得资源路径,渲染数据
XWPFTemplate template = XWPFTemplate.compile(new ClassPathResource("doc/cherry.docx").getInputStream()).render(dataMap);
// 设置让浏览器下载文件
response.setContentType("application/force-download");
// 设置输出文件名
response.setHeader("Content-Disposition", "attachment; filename="+URLEncoder.encode(fileName,"UTF-8"));
// 输出流
OutputStream out = response.getOutputStream();
BufferedOutputStream bos = new BufferedOutputStream(out);
template.write(bos);
bos.flush();
out.flush();
// 关闭所有流
PoitlIOUtils.closeQuietlyMulti(template, bos, out);
}
}