在工作当中会有很多奇奇怪怪的需求 比如把数据库数据 导出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;
}