网站首页 > java教程 正文
Poi生成word
在Java-web项目开发过程中经常会遇到导出Word文档的业务场景。XWPFDocument是apache基金会提供的用户导出Word文档的工具类
一、基本的概念
XWPFDocument:代表一个docx文档
XWPFParagraph:代表文档、表格、标题等种的段落,由多个XWPFRun组成
XWPFRun:代表具有同样风格的一段文本
XWPFTable:代表一个表格
XWPFTableRow:代表表格的一行
XWPFTableCell:代表表格的一个单元格
XWPFChar:表示.docx文件中的图表
XWPFHyperlink:表示超链接
XWPFPicture:代表图片
XWPFComment :代表批注
XWPFFooter:代表页脚
XWPFHeader:代表页眉
二、实现思路:
1. 使用poi的XWPF模块读取word模板,生成一个XWPFDocument对象。
2. 遍历XWPFDocument的各个段落和表格,查找需要替换的文本,使用XWPFRun对象中的setText方法替换文本。
3. 使用OutputStream将替换后的XWPFDocument对象转化为字节数组。
4. 将字节数组通过HttpServletResponse对象的输出流写出给前端。
5. 前端通过ajax的方式接收并解析返回的文件流。
三、maven依赖,导入jar包
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>4.0.0</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.0.0</version>
</dependency>
四、word模板
在resources资源文件夹下准备好Word模板
模板文件设置如下:
合同.docx
五、实现代码
@RestController
@RequestMapping("/contract")
public class ContractController extends ApiController {
@Autowired
private ResourceLoader resourceLoader;
@RequestMapping("/createContract")
public void createContract(HttpServletResponse response) throws IOException {
Map<String,Object> paramMap = new HashMap<>();
paramMap.put("${bankName}","农业银行");
paramMap.put("${userName}","张三");
Set set = paramMap.keySet();
//1、使用poi的XWPF模块读取word模板
// InputStream is = this.getClass().getClassLoader().getResourceAsStream("合同.docx");
// InputStream is =getClass().getResourceAsStream("classpath:合同.docx");
Resource resource = resourceLoader.getResource("classpath:合同.docx");
InputStream inputStream = resource.getInputStream();
/* InputStream is = getClass()
.getClassLoader().getResourceAsStream("合同.docx");
*/ //2、生成一个XWPFDocument对象
XWPFDocument doc = new XWPFDocument(inputStream);
//3、读取文档中的段落,回车符为一个段落。
Iterator<XWPFParagraph> itPara = doc.getParagraphsIterator();
while(itPara.hasNext()){//是否有下一个段落
XWPFParagraph paragraph = itPara.next();//获取下一个段落
//获取文本
List<XWPFRun> run = paragraph.getRuns();
// 遍历段落文字对象
for (XWPFRun xwpfRun:run
) {
if(xwpfRun==null){
continue; //继续执行
}
String sectionItem = xwpfRun.getText(xwpfRun.getTextPosition()); //段落内容
// 遍历自定义表单关键字,替换Word文档中的内容
Iterator<String> iterator = set.iterator();
while (iterator.hasNext()) {
// 当前关键字
String key = iterator.next();
// 替换内容
sectionItem = sectionItem.replace(key,
String.valueOf(paramMap.get(key)));
}
//重新赋值
xwpfRun.setText(sectionItem, 0);
}
}
String fileName = "张三合同";
fileName = new String((fileName + ".docx")
.getBytes("UTF-8"), "ISO-8859-1");
response.setHeader("Content-Disposition", "attachment; filename=" + fileName);
response.setContentType("application/vnd.openxmlformats-officedocument.wordprocessingml.document;charset=utf-8");
OutputStream os = response.getOutputStream();
doc.write(os);
}
}
七、实现效果
替换成
猜你喜欢
- 2024-11-05 POI操作word模板并生成新的word(poi生成word文档)
- 2024-11-05 人工智能文档编写器:使用AI生成Javadocs等文档的插件扩展
- 2024-11-05 Java 操作 Office:POI之word图片处理
- 2024-11-05 在JSP页面中直接以WORD格式或者将页面下载成WORD格式文件
- 2024-11-05 springboot-如何集成screw生成数据库文档
- 2024-11-05 借助Spire.Doc控件,在Java中将 Word 转换为图像
- 2024-11-05 SpringBoot + Screw 一键生成数据库文档
- 2024-11-05 Spire.PDF for Java 8.7.0 增强了 PDF 到 Word 和 Excel 的转换
- 2024-11-05 如此简单!Aspose.Words助力以Java编程方式创建丰富的Word文档
- 2024-11-05 GitHub精选 | 告别手写,一键生成数据库表文档
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)