java导出文档 XWPFDocument导出Word文档简单操作

admin 2012次浏览

摘要:在Java-web项目开发过程中经常会遇到导出Word文档的业务场景。XWPFDocument是apache基金会提供的用户导出Word文档的工具类。 1、基本的概念 XWPFDocument

在Java-web项目开发过程中经常会遇到导出Word文档的业务场景。XWPFDocument是apache基金会提供的用户导出Word文档的工具类。

1、基本的概念

XWPFDocument:代表一个docx文档

XWPFParagraph:代表文档、表格、标题等种的段落,由多个XWPFRun组成

XWPFRun:代表具有同样风格的一段文本

XWPFTable:代表一个表格

XWPFTableRow:代表表格的一行

XWPFTableCell:代表表格的一个单元格

XWPFChar:表示.docx文件中的图表

XWPFHyperlink:表示超链接

XWPFPicture:代表图片

XWPFComment :代表批注

XWPFFooter:代表页脚

XWPFHeader:代表页眉

2、jar依赖

org.apache.poi

poi

4.0.0

org.apache.poi

poi-ooxml

4.0.0

3、Word模板

在resources资源文件夹下准备好Word模板:

image.png

模板文件设置如下:

image.png

4、Word导出工具类

public class XwpfTUtil {

/**

* 替换段落里面的变量

*

* @param doc 要替换的文档

* @param params 参数

*/

public static void replaceInPara(XWPFDocument doc, Map params) {

Iterator iterator = doc.getParagraphsIterator();

XWPFParagraph para;

while (iterator.hasNext()) {

para = iterator.next();

replaceInPara(para, params);

}

}

/**

* 替换段落里面的变量

*

* @param para 要替换的段落

* @param params 参数

*/

public static void replaceInPara(XWPFParagraph para, Map params) {

List runs;

Matcher matcher;

if (matcher(para.getParagraphText()).find()) {

runs = para.getRuns();

int start = -1;

int end = -1;

String str = "";

for (int i = 0; i < runs.size(); i++) {

XWPFRun run = runs.get(i);

String runText = run.toString();

if ('$' == runText.charAt(0)&&'{' == runText.charAt(1)) {

start = i;

}

if ((start != -1)) {

str += runText;

}

if ('}' == runText.charAt(runText.length() - 1)) {

if (start != -1) {

end = i;

break;

}

}

}

for (int i = start; i <= end; i++) {

para.removeRun(i);

i--;

end--;

}

for (String key : params.keySet()) {

if (str.equals(key)) {

String param = String.valueOf(params.get(key));

if (param.indexOf("\n")>-1) {

String[] texts = param.split("\n");

for (int i = 0; i < texts.length; i++) {

para.createRun().setText(texts[i]);

para.createRun().addCarriageReturn();

}

} else {

para.createRun().setText(param);

}

}

}

}

}

/**

* 替换表格里面的变量

*

* @param doc 要替换的文档

* @param params 参数

*/

public static void replaceInTable(XWPFDocument doc, Map params) {

Iterator iterator = doc.getTablesIterator();

XWPFTable table;

List rows;

List cells;

List paras;

while (iterator.hasNext()) {

table = iterator.next();

rows = table.getRows();

for (XWPFTableRow row : rows) {

cells = row.getTableCells();

for (XWPFTableCell cell : cells) {

paras = cell.getParagraphs();

for (XWPFParagraph para : paras) {

replaceInPara(para, params);

}

}

}

}

}

/**

* 正则匹配字符串

*

* @param str

* @return

*/

private static Matcher matcher(String str) {

Pattern pattern = Pattern.compile("\\$\\{(.+?)\\}", Pattern.CASE_INSENSITIVE);

Matcher matcher = pattern.matcher(str);

return matcher;

}

/**

* 关闭输入流

*

* @param is

*/

public static void close(InputStream is) {

if (is != null) {

try {

is.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

/**

* 关闭输出流

*

* @param os

*/

public static void close(OutputStream os) {

if (os != null) {

try {

os.close();

} catch (IOException e) {

e.printStackTrace();

}

}

}

}

5、测试接口

@RestController

@RequestMapping("/export/word")

public class ExportWordController {

@RequestMapping("/test")

public void test(HttpServletResponse response) throws Exception {

Map params = new HashMap<>();

params.put("${wxnum}","202101170001");

params.put("${houseName}","XX小区XX栋XX号");

params.put("${name}","张三");

params.put("${Tel}","12345678910");

params.put("${orderTime}","2021-01-17");

params.put("${repairIntro}","保修内容……");

InputStream is = getClass().getClassLoader().getResourceAsStream("repair.docx");

XWPFDocument doc = new XWPFDocument(is);

XwpfTUtil.replaceInPara(doc, params);

XwpfTUtil.replaceInTable(doc, params);

String fileName = "test.docx";

response.setHeader("Content-Disposition", "attachment; filename=" + fileName);

response.setContentType("application/vnd.ms-excel;charset=utf-8");

OutputStream os = response.getOutputStream();

doc.write(os);

XwpfTUtil.close(os);

XwpfTUtil.close(is);

}

}

6、测试导出结果

image.png

相关文章
友情链接