`
53873039oycg
  • 浏览: 837084 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论

[简单]docx4j合并单元格

 
阅读更多

      见代码:

      

import java.math.BigInteger;
import java.util.ArrayList;
import java.util.List;
import javax.xml.bind.JAXBElement;
import org.docx4j.wml.ContentAccessor;
import org.docx4j.wml.Tbl;
import org.docx4j.wml.Tc;
import org.docx4j.wml.TcPr;
import org.docx4j.wml.TcPrInner.GridSpan;
import org.docx4j.wml.TcPrInner.HMerge;
import org.docx4j.wml.TcPrInner.VMerge;
import org.docx4j.wml.Tr;

public class Docx4j_合并单元格_S4_Test {
	public void mergeCellsHorizontalByGridSpan(Tbl tbl, int row, int fromCell,
			int toCell) {
		if (row < 0 || fromCell < 0 || toCell < 0) {
			return;
		}
		List<Tr> trList = getTblAllTr(tbl);
		if (row > trList.size()) {
			return;
		}
		Tr tr = trList.get(row);
		List<Tc> tcList = getTrAllCell(tr);
		for (int cellIndex = Math.min(tcList.size() - 1, toCell); cellIndex >= fromCell; cellIndex--) {
			Tc tc = tcList.get(cellIndex);
			TcPr tcPr = getTcPr(tc);
			if (cellIndex == fromCell) {
				GridSpan gridSpan = tcPr.getGridSpan();
				if (gridSpan == null) {
					gridSpan = new GridSpan();
					tcPr.setGridSpan(gridSpan);
				}
				gridSpan.setVal(BigInteger.valueOf(Math.min(tcList.size() - 1,
						toCell) - fromCell + 1));
			} else {
				tr.getContent().remove(cellIndex);
			}
		}
	}

	/**
	 * @Description: 跨列合并
	 */
	public void mergeCellsHorizontal(Tbl tbl, int row, int fromCell, int toCell) {
		if (row < 0 || fromCell < 0 || toCell < 0) {
			return;
		}
		List<Tr> trList = getTblAllTr(tbl);
		if (row > trList.size()) {
			return;
		}
		Tr tr = trList.get(row);
		List<Tc> tcList = getTrAllCell(tr);
		for (int cellIndex = fromCell, len = Math
				.min(tcList.size() - 1, toCell); cellIndex <= len; cellIndex++) {
			Tc tc = tcList.get(cellIndex);
			TcPr tcPr = getTcPr(tc);
			HMerge hMerge = tcPr.getHMerge();
			if (hMerge == null) {
				hMerge = new HMerge();
				tcPr.setHMerge(hMerge);
			}
			if (cellIndex == fromCell) {
				hMerge.setVal("restart");
			} else {
				hMerge.setVal("continue");
			}
		}
	}

	/**
	 * @Description: 跨行合并
	 */
	public void mergeCellsVertically(Tbl tbl, int col, int fromRow, int toRow) {
		if (col < 0 || fromRow < 0 || toRow < 0) {
			return;
		}
		for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++) {
			Tc tc = getTc(tbl, rowIndex, col);
			if (tc == null) {
				break;
			}
			TcPr tcPr = getTcPr(tc);
			VMerge vMerge = tcPr.getVMerge();
			if (vMerge == null) {
				vMerge = new VMerge();
				tcPr.setVMerge(vMerge);
			}
			if (rowIndex == fromRow) {
				vMerge.setVal("restart");
			} else {
				vMerge.setVal("continue");
			}
		}
	}

	/**
	 * @Description:得到指定位置的表格
	 */
	public Tc getTc(Tbl tbl, int row, int cell) {
		if (row < 0 || cell < 0) {
			return null;
		}
		List<Tr> trList = getTblAllTr(tbl);
		if (row >= trList.size()) {
			return null;
		}
		List<Tc> tcList = getTrAllCell(trList.get(row));
		if (cell >= tcList.size()) {
			return null;
		}
		return tcList.get(cell);
	}

	/**
	 * @Description: 获取所有的单元格
	 */
	public List<Tc> getTrAllCell(Tr tr) {
		List<Object> objList = getAllElementFromObject(tr, Tc.class);
		List<Tc> tcList = new ArrayList<Tc>();
		if (objList == null) {
			return tcList;
		}
		for (Object tcObj : objList) {
			if (tcObj instanceof Tc) {
				Tc objTc = (Tc) tcObj;
				tcList.add(objTc);
			}
		}
		return tcList;
	}

	public TcPr getTcPr(Tc tc) {
		TcPr tcPr = tc.getTcPr();
		if (tcPr == null) {
			tcPr = new TcPr();
			tc.setTcPr(tcPr);
		}
		return tcPr;
	}

	/**
	 * @Description: 得到表格所有的行
	 */
	public List<Tr> getTblAllTr(Tbl tbl) {
		List<Object> objList = getAllElementFromObject(tbl, Tr.class);
		List<Tr> trList = new ArrayList<Tr>();
		if (objList == null) {
			return trList;
		}
		for (Object obj : objList) {
			if (obj instanceof Tr) {
				Tr tr = (Tr) obj;
				trList.add(tr);
			}
		}
		return trList;
	}

	/**
	 * @Description:得到指定类型的元素
	 */
	public static List<Object> getAllElementFromObject(Object obj,
			Class<?> toSearch) {
		List<Object> result = new ArrayList<Object>();
		if (obj instanceof JAXBElement)
			obj = ((JAXBElement<?>) obj).getValue();
		if (obj.getClass().equals(toSearch))
			result.add(obj);
		else if (obj instanceof ContentAccessor) {
			List<?> children = ((ContentAccessor) obj).getContent();
			for (Object child : children) {
				result.addAll(getAllElementFromObject(child, toSearch));
			}
		}
		return result;
	}
}

    本文系原创,转载请注明出处,本文原始链接:http://53873039oycg.iteye.com/blog/2194577  ,谢谢。

    全文完。

  

分享到:
评论
1 楼 chen_xueqian 2015-05-03  
超全超赞的帖子,必须力挺!!

相关推荐

    NPOI读取模板导出Excel(合并单元格)

    ### NPOI读取模板导出Excel(合并单元格) #### 概述 在实际工作中,经常需要将数据导出到Excel文件中,并且在某些情况下还需要对单元格进行合并处理,以达到美观或者特定需求的目的。NPOI是.NET平台上一个强大的...

    docx4j-community-8.1.5.zip

    在实际应用中,docx4j广泛应用于自动化报告生成、数据导出、邮件合并等领域。例如,你可以利用docx4j读取数据库中的数据,自动生成定制化的销售报告;或者在Web应用中,接收用户上传的docx模板,替换其中的占位符,...

    docx4j操作word2007

    **docx4j操作word2007** 在IT领域,docx4j是一个非常实用的Java库,专为处理Microsoft Office Open XML (OOXML) 文件格式,如.docx、.xlsx和.pptx而设计...无论是简单的文本替换还是复杂的模板生成,docx4j都能胜任。

    excel批量合并单元格内容.docx

    ### Excel VBA 批量合并单元格内容 在日常工作中,我们经常需要处理大量的Excel数据。其中,合并单元格是一项常见的需求,特别是在整理表格、汇总数据时。本文将详细介绍如何利用VBA(Visual Basic for ...

    自动办公-python 在Word表格中将上下行相同内容的单元格自动合并

    以下是一个简单的示例代码,演示了如何检查并合并上下行相同的单元格内容: ```python from docx import Document def merge_duplicate_rows(word_file): doc = Document(word_file) for table in doc.tables: ...

    python实现在Word表格中将上下行相同内容的单元格自动合并

    5. **合并单元格**:在`python-docx`中,没有直接的合并单元格方法。但我们可以删除重复的行,然后调整剩下的行的`height`属性来模拟合并效果。注意,删除行之前应保存原始高度以便恢复。 ```python current_row_...

    相同条件单元格数据的合并.docx

    在Excel中,有时我们需要根据特定条件合并同一列中相同数据项的单元格。这个案例是关于如何合并相同档案号的考生在不同模块中的合格情况。通过定义名称和使用数组公式,我们可以高效地完成这项任务。以下是详细步骤...

    VC对word操作,主要包含生成表格,并导入数据,合并单元格,编辑眉页等等

    6. **合并单元格**: - `Merge`方法用于合并两个或更多相邻的单元格: ```cpp table-&gt;Cell(1, 1)-&gt;Merge(table-&gt;Cell(1, 2)); ``` 7. **编辑眉页**: - 编辑眉页涉及到`HeaderFooter`对象,可以设置眉页的文本...

    java操作word

    创建表格是 docx4j 中的一个常见操作,以下是一个简单的示例: ```java import org.docx4j.openpackaging.packages.WordprocessingMLPackage; import org.docx4j.wml.*; public class WordTableExample { public ...

    java实现docx文档在线编辑(docx转html,html转word,样式精准)

    java实现docx转html,自定义标签属性,然后根据自定义的标签属性,将html转为word,可支持普通段落,图片、表格、单元格合并、文本字体、字体大小、段落对齐方式、删除线、下划线、粗体、斜体、背景颜色等

    Python源码自动办公-06 在Word表格中将上下行相同内容的单元格自动合并.rar

    4. **检查并合并单元格**:在遍历每个表格时,我们需要检查每行的每个单元格与下一行相应单元格的内容。如果内容相同,我们可以合并这两个单元格。`python-docx`没有直接提供合并单元格的函数,但我们可以删除下一行...

    python 自动办公- 在Word表格中将上下行相同内容的单元格自动合并.zip

    在Word中,合并单元格通常是通过调整表格布局来实现的,这在`python-docx`中并不直接支持。但我们可以删除下一行的相应单元格,从而达到合并的效果: ```python if cell1_text == cell2_text: # 删除下一行的对应...

    Excel表格中vba宏按条件拆分两个单元格中的数字.docx

    在 Excel 表格中,我们经常需要处理数字的拆分和合并问题,本文将介绍如何使用 VBA 宏在表格中拆分两个单元格中的数字。 首先,让我们了解问题的需求:在 A1 和 B1 两个单元格中,有两个数字,这两个数字有一部分...

    python 自动办公 在Word表格中将上下行相同内容的单元格自动合并 码实例有详细注解,适合新手一看就懂.rar

    在`python-docx`中,没有直接的函数用于合并单元格,但我们可以删除下一行的相应单元格,从而达到合并的效果: ```python next_row.cells.pop(j) ``` 然后,我们还需要更新下一行的单元格宽度,以保持表格的结构:...

    新建 DOCX 文档,新建docx文档怎么制表源码.zip

    最常见的选择包括Python(使用`python-docx`库)、C#(使用`OpenXML SDK`)和Java(使用`docx4j`库)。下面将分别介绍这些语言如何创建表格。 1. **Python with `python-docx`**: `python-docx`是一个用于操作Word...

    JAVA利用poi完成word转pdf,内容包括两个现成工具类和使用到的所有jar包

    2. **Docx4j**: Docx4j是一个强大的库,专注于处理OpenXML格式,包括Word的.docx文件。它包含了一个模块,可以将Word文档转换为PDF。使用Docx4j,你可以将Word的内容直接转化为PDF的结构。 3. **iText或PDFBox**: ...

    POI-excel导出样式设计.docx

    本文总结了 POI-excel 的一些常用方法和样式设计,包括读取 Excel 文件、获取单元格内容、设置单元格内容、读取单元格内容、设置列宽和行高、添加区域和合并单元格、常用方法和常用单元格边框格式等。

    jupyterNotebook快捷键.docx

    - **Shift-M**:合并选中单元格下方的单元格 - **Ctrl-S**:保存文件 - **L/O**:显示/隐藏行号 - **H**:显示快捷键帮助 - **I,I/R,R**:中断/重启内核 2. **编辑模式(Edit Mode)**:在编辑模式下,你可以...

    excel怎么把多列内容合并到一列.docx

    通过这篇教程,读者可以学习如何使用 Excel 将多列内容合并到一列,并且输出结果到一个单元格中。 标签解读 由于没有提供标签,因此我们可以根据教程的内容自动生成标签,例如"Excel"、"多列合并"、"数据处理"等。 ...

    NPOI导出excel方法合并、插入图片实例演示.docx

    以上就是使用NPOI库进行Excel导出,包括合并单元格和插入图片的基本步骤。这个过程不仅适用于Web应用程序,也适用于桌面应用和其他需要生成Excel报告的场景。熟练掌握这些操作能够大大提高开发效率,为用户提供更...

Global site tag (gtag.js) - Google Analytics