【Java Easypoi & Apache poi】 Word导入与导出

引入依赖

XML 复制代码
<dependency>
    <groupId>cn.afterturn</groupId>
    <artifactId>easypoi-spring-boot-starter</artifactId>
</dependency>
<!-- 下面的版本需要对应上面依赖中的版本 否则可能会起冲突 -->
<!-- 下面的依赖主要是为了使用Apache原生的WordExtractor对doc后缀文件的解析 -->
<dependency>
    <groupId>org.apache.poi</groupId>
    <artifactId>poi-scratchpad</artifactId>
    <version>4.1.1</version>
</dependency>
<!-- 糊涂Api工具 -->
<dependency>
    <groupId>cn.hutool</groupId>
    <artifactId>hutool-core</artifactId>
    <version>5.8.10</version>
</dependency>

工具类封装

java 复制代码
public class WordDocumentUtil {

    /**
     * 解析文档文件
     *
     * @param file 文档文件
     * @return 文档内容
     */
    public static String parseWord(MultipartFile file) {
        String wordTxt = "";
        InputStream stream = null;
        try {
            if (file.getOriginalFilename().endsWith(".doc")) {
                stream = file.getInputStream();
                // Apache Poi
                WordExtractor ex = new WordExtractor(stream);
                wordTxt = ex.getText();
            } else if (file.getOriginalFilename().endsWith(".docx")) {
                stream = file.getInputStream();
                // EasyPoi
                XWPFDocument document = new XWPFDocument(stream);
                XWPFWordExtractor ex = new XWPFWordExtractor(document);
                wordTxt = ex.getText();
            }
        } catch (Exception e) {
            // 此处建议抛出异常 "文档解析有误"
            e.printStackTrace();
        } finally {
            if (stream != null) {
                try {
                    stream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
        return wordTxt;
    }

    /**
     * 判断文档类型进行不同的分割方式
     * ".doc"后缀需要以"\r\n"切割 而".docx"后缀需要以"\n"切割
     *
     * @param file 文件名:以file.getOriginalFilename()传入
     * @param wordTxt 文件内容
     * @return 内容数组
     */
    public static String[] judgeType(String file, String wordTxt) {
        boolean suffixFlag = file.endsWith(".doc");

        return suffixFlag ? Arrays.stream(wordTxt.split("\r\n")).toArray(String[]::new)
                : Arrays.stream(wordTxt.split("\n")).toArray(String[]::new);
    }

    /**
     * 导出resources下的word模板表
     *
     * @param fileName 文件名
     * @param response {@link HttpServletResponse}
     */
    public void exportTemplate(String fileName, HttpServletResponse response) {
        InputStream inputStream = null;
        try {
            String path = "/word/" + fileName;
            inputStream = this.getClass().getResourceAsStream(path);

            String newFileName = IdUtil.simpleUUID() + StrUtil.DOT + FileUtil.extName(fileName);

            byte[] bytes = new byte[1024 * 1024];
            // 输入流读取文件
            if (inputStream != null) {
                inputStream.read(bytes);
            }

            response.setCharacterEncoding("UTF-8");
            response.setContentType("application/msword");
            response.setHeader("Access-Control-Expose-Headers","Content-disposition");
            response.setHeader("Content-Disposition","attachment;filename=" + newFileName);
            response.getOutputStream().write(bytes);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (inputStream != null) {
                try {
                    inputStream.close();
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }
        }
    }
}

乱码问题

如果这里造成了读取resources下的文件返回前端乱码问题:除了HttpServletResponse响应中设置字体问题,还有可能是因为在编译期文件就已经乱码了,所以需要在pom.xml中增加以下配置。

XML 复制代码
<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-resources-plugin</artifactId>
            <version>2.6</version>
            <configuration>
                <encoding>UTF-8</encoding>
                <nonFilteredFileExtensions>
                    <nonFilteredFileExtension>doc</nonFilteredFileExtension>
                </nonFilteredFileExtensions>
            </configuration>
        </plugin>
    </plugins>
</build>
相关推荐
全栈凯哥1 小时前
16.Spring Boot 国际化完全指南
java·spring boot·后端
M1A11 小时前
Java集合框架深度解析:LinkedList vs ArrayList 的对决
java·后端
Top`1 小时前
Java 泛型 (Generics)
java·开发语言·windows
爱吃土豆的马铃薯ㅤㅤㅤㅤㅤㅤㅤㅤㅤ2 小时前
如何使用Java WebSocket API实现客户端和服务器端的通信?
java·开发语言·websocket
是小崔啊2 小时前
tomcat源码02 - 理解Tomcat架构设计
java·tomcat
没有bug.的程序员2 小时前
JAVA面试宝典 -《安全攻防:从 SQL 注入到 JWT 鉴权》
java·安全·面试
栈溢出了2 小时前
MyBatis实现分页查询-苍穹外卖笔记
java·笔记·mybatis
morningcat20182 小时前
java17 gc笔记
java·jvm·笔记
3 小时前
Unity开发中常用的洗牌算法
java·算法·unity·游戏引擎·游戏开发
Your易元3 小时前
设计模式-模板方法模式
java·设计模式·模板方法模式