当前位置:   article > 正文

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

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

引入依赖

  1. <dependency>
  2. <groupId>cn.afterturn</groupId>
  3. <artifactId>easypoi-spring-boot-starter</artifactId>
  4. </dependency>
  5. <!-- 下面的版本需要对应上面依赖中的版本 否则可能会起冲突 -->
  6. <!-- 下面的依赖主要是为了使用Apache原生的WordExtractor对doc后缀文件的解析 -->
  7. <dependency>
  8. <groupId>org.apache.poi</groupId>
  9. <artifactId>poi-scratchpad</artifactId>
  10. <version>4.1.1</version>
  11. </dependency>
  12. <!-- 糊涂Api工具 -->
  13. <dependency>
  14. <groupId>cn.hutool</groupId>
  15. <artifactId>hutool-core</artifactId>
  16. <version>5.8.10</version>
  17. </dependency>

工具类封装

  1. public class WordDocumentUtil {
  2. /**
  3. * 解析文档文件
  4. *
  5. * @param file 文档文件
  6. * @return 文档内容
  7. */
  8. public static String parseWord(MultipartFile file) {
  9. String wordTxt = "";
  10. InputStream stream = null;
  11. try {
  12. if (file.getOriginalFilename().endsWith(".doc")) {
  13. stream = file.getInputStream();
  14. // Apache Poi
  15. WordExtractor ex = new WordExtractor(stream);
  16. wordTxt = ex.getText();
  17. } else if (file.getOriginalFilename().endsWith(".docx")) {
  18. stream = file.getInputStream();
  19. // EasyPoi
  20. XWPFDocument document = new XWPFDocument(stream);
  21. XWPFWordExtractor ex = new XWPFWordExtractor(document);
  22. wordTxt = ex.getText();
  23. }
  24. } catch (Exception e) {
  25. // 此处建议抛出异常 "文档解析有误"
  26. e.printStackTrace();
  27. } finally {
  28. if (stream != null) {
  29. try {
  30. stream.close();
  31. } catch (IOException e) {
  32. e.printStackTrace();
  33. }
  34. }
  35. }
  36. return wordTxt;
  37. }
  38. /**
  39. * 判断文档类型进行不同的分割方式
  40. * ".doc"后缀需要以"\r\n"切割 而".docx"后缀需要以"\n"切割
  41. *
  42. * @param file 文件名:以file.getOriginalFilename()传入
  43. * @param wordTxt 文件内容
  44. * @return 内容数组
  45. */
  46. public static String[] judgeType(String file, String wordTxt) {
  47. boolean suffixFlag = file.endsWith(".doc");
  48. return suffixFlag ? Arrays.stream(wordTxt.split("\r\n")).toArray(String[]::new)
  49. : Arrays.stream(wordTxt.split("\n")).toArray(String[]::new);
  50. }
  51. /**
  52. * 导出resources下的word模板表
  53. *
  54. * @param fileName 文件名
  55. * @param response {@link HttpServletResponse}
  56. */
  57. public void exportTemplate(String fileName, HttpServletResponse response) {
  58. InputStream inputStream = null;
  59. try {
  60. String path = "/word/" + fileName;
  61. inputStream = this.getClass().getResourceAsStream(path);
  62. String newFileName = IdUtil.simpleUUID() + StrUtil.DOT + FileUtil.extName(fileName);
  63. byte[] bytes = new byte[1024 * 1024];
  64. // 输入流读取文件
  65. if (inputStream != null) {
  66. inputStream.read(bytes);
  67. }
  68. response.setCharacterEncoding("UTF-8");
  69. response.setContentType("application/msword");
  70. response.setHeader("Access-Control-Expose-Headers","Content-disposition");
  71. response.setHeader("Content-Disposition","attachment;filename=" + newFileName);
  72. response.getOutputStream().write(bytes);
  73. } catch (Exception e) {
  74. e.printStackTrace();
  75. } finally {
  76. if (inputStream != null) {
  77. try {
  78. inputStream.close();
  79. } catch (IOException e) {
  80. e.printStackTrace();
  81. }
  82. }
  83. }
  84. }
  85. }

乱码问题

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

  1. <build>
  2. <plugins>
  3. <plugin>
  4. <groupId>org.apache.maven.plugins</groupId>
  5. <artifactId>maven-resources-plugin</artifactId>
  6. <version>2.6</version>
  7. <configuration>
  8. <encoding>UTF-8</encoding>
  9. <nonFilteredFileExtensions>
  10. <nonFilteredFileExtension>doc</nonFilteredFileExtension>
  11. </nonFilteredFileExtensions>
  12. </configuration>
  13. </plugin>
  14. </plugins>
  15. </build>
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/花生_TL007/article/detail/540283
推荐阅读
相关标签
  

闽ICP备14008679号