poi 导出word,导出表格(复杂表格合并行列)解决方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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<Element> eleIterator = trElements.iterator();
				Integer rowNum = 0;
				// 针对于colspan操作
				while(eleIterator.hasNext()){
					rowNum ++;
					Element trElement = eleIterator.next();
					//去除所有样式
					trElement.removeAttr("class");
					Elements tdElements = trElement.getElementsByTag("td");
					List<Element> tdEleList = covertElements2List(tdElements);
					for(int i=0;i<tdEleList.size();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<colspanVal-1;k++){
								curTdElement.after(ele.outerhtml());
							}
						}
					}
				}
				// 针对于rowspan操作
				List<Element> trEleList = covertElements2List(trElements);
				Element firstTrEle = trElements.first();
				Elements tdElements = firstTrEle.getElementsByTag("td");
				Integer tdCount = tdElements.size();
				for(int i=0;i<tdElements.size();i++){ //获取该列下所有单元格
					for(Element trElement:trEleList){
						List<Element> 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<rowspanVal-1;j++){
								Node tempNode = cNode.clone();
								List<Node> nodeList = new ArrayList<Node>();
								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<Element> covertElements2List(Elements curElements){
		List<Element> elementList = new ArrayList<Element>();
		Iterator<Element> eleIterator = curElements.iterator();
		while(eleIterator.hasNext()){
			Element curlement = eleIterator.next();
			elementList.add(curlement);
		}
		return elementList;
	}

处理后的表格会稍有变形,如下图:

技术分享

2、将处理后的表格写入word

String 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<String,Boolean>[][] array = new Map[trList.size()][tdList.size()];
for (int row = 0; row < trList.size(); row++) {
	Element trElement = trList.get(row);
	Elements tds = trElement.getElementsByTag("td");
	for(int col = 0; col < tds.size(); 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<colCount-1;i++){
				array[row][col+i+1] = new HashMap<String, Boolean>();
				array[row][col+i+1].put("mergeCol", true);
			}
		}
		if(!StringUtils.isEmpty(rowspan)){
			int rowCount = Integer.parseInt(rowspan);
			for(int i=0;i<rowCount-1;i++){
				array[row+i+1][col] = new HashMap<String, Boolean>();
				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” 博客,谢绝转载!

以上是关于poi 导出word,导出表格(复杂表格合并行列)解决方法的主要内容,如果未能解决你的问题,请参考以下文章

easypoi导出word表格怎么遍历数据

java poi xwpf操作word生成一个表格怎么合并单元格,求大神指导!

java导出复杂excel表格

java用poi导出word文档,我要导出一个表格,表格的单元格中还要有一个表格,请问怎么实现

java中如何导出word

java poi合并单元表格(求帮助啊)