【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>
相关推荐
WX-bisheyuange2 小时前
基于Spring Boot的教师个人成果管理系统的设计与实现
java·spring boot·后端
xunyan62343 小时前
面向对象(上)-封装性的引入
java·开发语言
脸大是真的好~3 小时前
黑马JAVAWeb-05 JDBC入门-预编译SQL-Mybatis入门-Mybatis日志输出-数据库连接池-增删改查-XML映射配置
java
还算善良_3 小时前
XML签名
xml·java·开发语言
梅梅绵绵冰3 小时前
xml方式实现AOP
xml·java·开发语言
桦说编程4 小时前
Guava 迭代器增强类介绍
java·后端·设计模式
235165 小时前
【JVM】Java为啥能跨平台?JDK/JRE/JVM的关系?
java·开发语言·jvm·spring boot·后端·spring·职场和发展
courtfu5 小时前
Plugin ‘mysql_native_password‘ is not loaded`
java·后端
枫子有风5 小时前
Go语言流程控制
android·java·golang
小裕哥略帅6 小时前
订单管理--实时算出在途数量、收货数量、到货数量、已发货数量和未发货数量
java·开发语言