在工作当中会有很多奇奇怪怪的需求 比如把数据库数据 导出word文档,在此之前发表过一篇 导出ecxle表格的文章,经过查询资料 发现还是很容易实现的 。
我们一共可以分为两个部分
一、把数据库的数据组装成word文档 生成文档流 在这里可以用到XWPFDocument
XWPFDocument是apache基金会提供的用户导出Word文档的工具类。
二、把生成的文档流转变成io流运用HttpServletResponse 发送给浏览器

引入maven依赖

    <!-- excel工具 -->
            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>4.1.2</version>
            </dependency>

1、XWPFDocument基本概念
1、基本的概念
XWPFDocument:代表一个docx文档
XWPFParagraph:代表文档、表格、标题等种的段落,由多个XWPFRun组成
XWPFRun:代表具有同样风格的一段文本
XWPFTable:代表一个表格
XWPFTableRow:代表表格的一行
XWPFTableCell:代表表格的一个单元格
XWPFChar:表示.docx文件中的图表
XWPFHyperlink:表示超链接
XWPFPicture:代表图片
XWPFComment :代表批注
XWPFFooter:代表页脚
XWPFHeader:代表页眉

    @Override
    public XWPFDocument getWord() {
    //创建XWPFDocument 对象
        XWPFDocument document = new XWPFDocument();
        //创建XWPFParagraph 段落对象
            XWPFParagraph title = document.createParagraph();
            //左对齐
            title.setAlignment(ParagraphAlignment.LEFT);
            XWPFRun titleRun = title.createRun();
            titleRun.setText("标题");
            //加粗
            titleRun.setBold(true);
            titleRun.setFontSize(15);
            titleRun.addBreak()
            //内容段落
            XWPFParagraph desc = document.createParagraph();
            desc.setAlignment(ParagraphAlignment.LEFT);
            XWPFRun descRun = desc.createRun();
            descRun.setText("内容一段");
            descRun.setBold(true);
            descRun.setFontSize(13);
            descRun.addBreak();
            XWPFRun articleContent = desc.createRun();
            articleContent.setText("内容第二段");
            articleContent.setBold(false);
            articleContent.setFontSize(8);
            articleContent.addBreak();
  return document;
  }

二、调用getWord方法 获得文档流 转换io流输出

  @GetMapping("/getWord")
    public AjaxResult getWordHttp(HttpServletResponse response) {
        
      XWPFDocument document = this.getWode();
        OutputStream out = null;
        try {
            response.setStatus(200);
            //配置导出的word名称&后缀
            response.setHeader("Content-Disposition", "attachment; filename=" + java.net.URLEncoder.encode("文档名称"+".docx", "UTF-8"));
            out = response.getOutputStream();
            document.write(out);
        } catch (Exception e) {
            log.error(e);
            return AjaxResult.error("下载失败");
        } finally {
            try {
            if (document != null) {
                    document.close();
            }
            if (out != null) {
                    out.close();
                }
            }
            catch (IOException e) {
                e.printStackTrace();
            }
        }
        return AjaxResult.error("下载成功");
    }

二、读取word文档 纯文本 如果需要 读取复杂布局图片 建议转成富文本 在读取

    /**
     * 获取正文文件内容,docx方法
     *
     * @param file
     * @return
     */
    private Map<String, String> getContentDocx(String path) {
        Map<String, String> map = new HashMap();
        StringBuffer content = new StringBuffer("");
        // 0表示获取正常,1表示获取异常
        String result = "0";
        InputStream is = null;
        Logger logger = null;
        try {
            //根据需求入参也可以改为文件路径,对应的输入流部分改为new File(路径)即可
            is = new FileInputStream(new File(path));
            // 2007版本的word
            // 2007版本,仅支持docx文件处理
            XWPFDocument xwpf = new XWPFDocument(is);
            List<XWPFParagraph> paragraphs = xwpf.getParagraphs();
            if (paragraphs != null && paragraphs.size() > 0) {
                for (XWPFParagraph paragraph : paragraphs) {
                    content.append(paragraph.getParagraphText());
                }
            }
        } catch (Exception e) {
            log.error("docx解析正文异常:" + e);
            // 出现异常
            result = "1";
        } finally {
            if (is != null) {
                try {
                    is.close();
                } catch (IOException e) {
                    log.error("" + e);
                }
            }
            map.put("result", result);
            map.put("content", String.valueOf(content));
        }
        return map;
    }
Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐