java 导出word 含表格_poi 导出word,导出表格(复杂表格合并行列)解决方法
如下图:一个table表格,需要作为表格插入到word中;
1、首先对表格做拆分处理
代码如下:private String simplifyTable(String tableContent) {
if(StringUtils.isEmpty(tableContent)) return null;
Document tableDoc = Jsoup.parse(tableContent);
Elements trElements = tableDoc.getElementsByTag("tr");
if(trElements !=null){
Iterator eleIterator = trElements.iterator();
Integer rowNum = 0;
// 针对于colspan操作
while(eleIterator.hasNext()){
rowNum ++;
Element trElement = eleIterator.next();
//去除所有样式
trElement.removeAttr("class");
Elements tdElements = trElement.getElementsByTag("td");
List tdEleList = covertElements2List(tdElements);
for(int i=0;i
Element curTdElement = tdEleList.get(i);
//去除所有样式
curTdElement.removeAttr("class");
Element ele = curTdElement.clone();
String colspanValStr = curTdElement.attr("colspan");
if(!StringUtils.isEmpty(colspanValStr)){
ele.removeAttr("colspan");
Integer colspanVal = Integer.parseInt(colspanValStr);
for(int k=0;k
curTdElement.after(ele.outerHtml());
}
}
}
}
// 针对于rowspan操作
List trEleList = covertElements2List(trElements);
Element firstTrEle = trElements.first();
Elements tdElements = firstTrEle.getElementsByTag("td");
Integer tdCount = tdElements.size();
for(int i=0;i
for(Element trElement:trEleList){
List tdElementList = covertElements2List(trElement.getElementsByTag("td"));
try{
tdElementList.get(i);
}catch(Exception e){
continue;
}
Node curTdNode = tdElementList.get(i);
Node cNode = curTdNode.clone();
String rowspanValStr = curTdNode.attr("rowspan");
if(!StringUtils.isEmpty(rowspanValStr)){
cNode.removeAttr("rowspan");
Element nextTrElement = trElement.nextElementSibling();
Integer rowspanVal = Integer.parseInt(rowspanValStr);
for(int j=0;j
Node tempNode = cNode.clone();
List nodeList = new ArrayList();
nodeList.add(tempNode);
if(j > 0)
nextTrElement = nextTrElement.nextElementSibling();
Integer indexNum = i+1;
if(i == 0) indexNum = 0;
if(indexNum == tdCount) nextTrElement.appendChild(tempNode);
else nextTrElement.insertChildren(indexNum,nodeList);
}
}
}
}
}
Element tableEle = tableDoc.getElementsByTag("table").first();
String tableHtml = tableEle.outerHtml();
return tableHtml;
}
private static List covertElements2List(Elements curElements){
List elementList = new ArrayList();
Iterator eleIterator = curElements.iterator();
while(eleIterator.hasNext()){
Element curlement = eleIterator.next();
elementList.add(curlement);
}
return elementList;
}
处理后的表格会稍有变形,如下图:
2、将处理后的表格写入wordString tableHtmlStr = ele.outerHtml();
System.out.println(tableHtmlStr);
String simpleTableHtml = simplifyTable(tableHtmlStr);
System.out.println(simpleTableHtml);
Document tableDoc = Jsoup.parse(simpleTableHtml);
Elements trList = tableDoc.getElementsByTag("tr");
Elements tdList = trList.get(0).getElementsByTag("td");
XWPFTable xwpfTable = document.createTable(trList.size(),tdList.size());
Map[][] array = new Map[trList.size()][tdList.size()];
for (int row = 0; row
Element trElement = trList.get(row);
Elements tds = trElement.getElementsByTag("td");
for(int col = 0; col
Element colElement = tds.get(col);
String colspan = colElement.attr("colspan");
String rowspan = colElement.attr("rowspan");
String style = colElement.attr("style");
StringBuilder styleSB = new StringBuilder();
if(!StringUtils.isEmpty(colspan)){
int colCount = Integer.parseInt(colspan);
for(int i=0;i
array[row][col+i+1] = new HashMap();
array[row][col+i+1].put("mergeCol", true);
}
}
if(!StringUtils.isEmpty(rowspan)){
int rowCount = Integer.parseInt(rowspan);
for(int i=0;i
array[row+i+1][col] = new HashMap();
array[row+i+1][col].put("mergeRow", true);
}
}
XWPFTableCell tableCell = xwpfTable.getRow(row).getCell(col);
if(StringUtils.isEmpty(colspan)){
if(col == 0){
if(tableCell.getCTTc().getTcPr() == null){
tableCell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
}else{
if(tableCell.getCTTc().getTcPr().getHMerge() == null){
tableCell.getCTTc().getTcPr().addNewHMerge().setVal(STMerge.RESTART);
}else{
tableCell.getCTTc().getTcPr().getHMerge().setVal(STMerge.RESTART);
}
}
}else{
if(array[row][col]!=null && array[row][col].get("mergeCol")!=null && array[row][col].get("mergeCol")){
if(tableCell.getCTTc().getTcPr() == null){
tableCell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
}else{
if(tableCell.getCTTc().getTcPr().getHMerge() == null){
tableCell.getCTTc().getTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
}else{
tableCell.getCTTc().getTcPr().getHMerge().setVal(STMerge.CONTINUE);
}
}
continue;
}else{
if(tableCell.getCTTc().getTcPr() == null){
tableCell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
}else{
if(tableCell.getCTTc().getTcPr().getHMerge() == null){
tableCell.getCTTc().getTcPr().addNewHMerge().setVal(STMerge.RESTART);
}else{
tableCell.getCTTc().getTcPr().getHMerge().setVal(STMerge.RESTART);
}
}
}
}
}else{
if(tableCell.getCTTc().getTcPr() == null){
tableCell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
}else{
if(tableCell.getCTTc().getTcPr().getHMerge() == null){
tableCell.getCTTc().getTcPr().addNewHMerge().setVal(STMerge.RESTART);
}else{
tableCell.getCTTc().getTcPr().getHMerge().setVal(STMerge.RESTART);
}
}
}
if(StringUtils.isEmpty(rowspan)){
if(array[row][col]!=null && array[row][col].get("mergeRow")!=null && array[row][col].get("mergeRow")){
if(tableCell.getCTTc().getTcPr() == null){
tableCell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
}else{
if(tableCell.getCTTc().getTcPr().getVMerge() == null){
tableCell.getCTTc().getTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
}else{
tableCell.getCTTc().getTcPr().getVMerge().setVal(STMerge.CONTINUE);
}
}
continue;
}else{
if(tableCell.getCTTc().getTcPr() == null){
tableCell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
}else{
if(tableCell.getCTTc().getTcPr().getVMerge() == null){
tableCell.getCTTc().getTcPr().addNewVMerge().setVal(STMerge.RESTART);
}else{
tableCell.getCTTc().getTcPr().getVMerge().setVal(STMerge.RESTART);
}
}
}
}else{
if(tableCell.getCTTc().getTcPr() == null){
tableCell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
}else{
if(tableCell.getCTTc().getTcPr().getVMerge() == null){
tableCell.getCTTc().getTcPr().addNewVMerge().setVal(STMerge.RESTART);
}else{
tableCell.getCTTc().getTcPr().getVMerge().setVal(STMerge.RESTART);
}
}
}
tableCell.removeParagraph(0);
XWPFParagraph paragraph = tableCell.addParagraph();
paragraph.setStyle(styleSB.toString());
if(!StringUtils.isEmpty(style) && style.contains("text-align:center")){
paragraph.setAlignment(ParagraphAlignment.CENTER);
}
XWPFRun run = paragraph.createRun();
run.setText(colElement.text());
}
}
写入word后表格如下图:
注:上述内容处理的表格为html代码的table表格
本文出自 “BrightAries” 博客,谢绝转载!
原文:http://brightaries.blog.51cto.com/13167995/1982329
java 导出word 含表格_poi 导出word,导出表格(复杂表格合并行列)解决方法相关推荐
- 为什么ArcGIS 10.3导出 Shapefile的字段名会被截断成3个汉字?解决方法如下
为什么ArcGIS 10.3导出 Shapefile的字段名会被截断成3个汉字?解决方法如下 参考文章: (1)为什么ArcGIS 10.3导出 Shapefile的字段名会被截断成3个汉字?解决方法 ...
- Idea导出jar包运行报错:找不到主清单属性解决方法
Idea导出jar包运行报错:找不到主清单属性解决方法 参考文章: (1)Idea导出jar包运行报错:找不到主清单属性解决方法 (2)https://www.cnblogs.com/stars-on ...
- ppt图片在word中不能正常显示,只显示为矩形框的解决方法
ppt图片在word中不能正常显示,只显示为矩形框的解决方法 参考文章: (1)ppt图片在word中不能正常显示,只显示为矩形框的解决方法 (2)https://www.cnblogs.com/ga ...
- 上传word文档显示服务器出错,打开office出错的几种解决方法
打开office出错的几种解决方法 互联网 发布时间:2008-10-04 19:36:44 作者:佚名 我要评论 打开Office出错,比如无法打开Office文件.无法打开有密码保护的 ...
- word没有显示endnote_Word2007或2010未显示EndNote工具条的解决方法 | 科研动力
Word 2007或2010未显示EndNote工具条的解決方法:1.修复安装:2.修改加载项:3.管理加载中心. 有时在Word 2007/ 2010可能会不显示EndNote工具条,造成这种情况最 ...
- 家庭和学生版2021插入Word的Visio图打不开显示unknown对象求解——--->解决方法visio unknown(亲测有效)
找到网上的方法都不管用,如: 改文件打开方式,我的本来就是. Word文件中嵌入的Visio文件显示为unknown对象解决方式_ataberman的博客-CSDN博客_visio无法编辑 ...
- 解决word保存后再打开,页眉多出横线的解决方法(非删除横线方法)
问题描述 对word文档进行编辑,编辑后保存.保存前并未对页眉进行编辑,页眉没有任何内容. 但是再次打开该文档后,每页都多出了一个横线页眉: 网上的方法都是治标不治本,只是教给你如何把横线去掉,但是下 ...
- java安装有错误码咋办_java编程出现的错误对应的解决方法
error: could not open D:\java\jre1.8\lib\amd64\jvm.cfg 解决方法:把java的环境变量%JAVA_HOME%/bin上移到最上面 优化 查看网页源 ...
- java 图片上写字_java 在图片上写字,两个图片合并的实现方法
实例如下: package writeimg; import javax.imageio.ImageIO; import java.awt.Color; import java.awt.Font; i ...
- java silk转mp3_微信小程序录音文件格式silk遇到的问题及解决方法
不好意思,误导大家了,这种将silk解密的方式只是在小程序测试的时候可以,上线以后这种方法是不行的,还是需要使用解密转码.参见:https://github.com/kn007/silk-v3-dec ...
最新文章
- linux主题文件,美化你的Linux!23个精美Ubuntu主题下载
- Windows下 VS2015编译boost1.62
- 同一个项目相互调接口_408计算机网络D3-第二章:网络体系结构与参考模型(上)分层结构-协议-接口-服务...
- 如何跨域来同步不同网站之间的Cookie
- OCR文本检测-RRPN
- 日志对服务器压力,服务器一大堆错误日志的解决方法
- ASA 5505 配置
- 数据库入门级学习(1)
- CPU测评程序、指标、工具
- 服务器win2003系统升级,Windows server 2003 升级 到2008 R2
- mysql查看sa密码_sqlserver怎么查看sa密码
- 在使用vue脚手架之前你必须掌握的:vue的模版以及路由用法
- sqoop 导出hive数据到MySQL数据库当中
- c中纠结不清的点(1)
- 基于 CentOS 搭建微信小程序服务
- SpringBoot调用SAP接口(搭建部署)
- 做过SEO优化的网站与普通站的区别在哪里
- rust 局域网联机_腐蚀怎么进行局域网联机方式 酷跑加速器和你畅玩游戏世界
- 计算机与化学相关论文,计算机与化学论文写作.doc
- 计算机网络电话线上网原理,电话线网桥的构造和原理