Spire.Doc提供了Table.applyVerticalMerge()方法来垂直合并word文档里面的表格单元格,Table.applyHorizontalMerge()方法来水平合并表格单元格。默认情况下,如果要合并的单元格包含相同的值,那么合并后的单元格会有重复的值。


程序环境

本次测试时,在程序中引入Spire.Doc for Java。可通过以下方法引用Spire.Doc.jar文件:

方法1:将Spire.Doc for Java下载到本地,解压,安装。安装完成后,找到安装路径下BIN文件夹中的Spire.Doc.jar。然后在Visual Studio中打开“解决方案资源管理器”,鼠标右键点击“引用”,“添加引用”,将本地路径BIN文件夹下的jar文件添加引用至程序。

方法2:使用Maven进行安装,你可以通过在项目的pom.xml文件中添加以下代码,在你的应用程序中轻松导入该JAR文件。

 1 <repositories>
2 <repository>
3 <id>com.e-iceblue</id>
4 <url>https://repo.e-iceblue.cn/repository/maven-public/</url>
5 </repository>
6 </repositories>
7 <dependencies>
8 <dependency>
9 <groupId>e-iceblue</groupId>
10 <artifactId>spire.doc</artifactId>
11 <version>10.9.0</version>
12 </dependency>
13 </dependencies>

方法3:通过NuGet安装。可通过以下2种方法安装:

(1)可以在Visual Studio中打开“解决方案资源管理器”,鼠标右键点击“引用”,“管理NuGet包”,然后搜索“FreeSpire.Doc”,点击“安装”。等待程序安装完成。

(2)将以下内容复制到PM控制台安装。

Install-Package FreeSpire.Doc -Version 10.9.0

删除合并单元格时的重复值

  1. 创建一个Document实例,使用Document.loadFromFile()方法加载示例文档。
  2. 使用Document.getSections()方法获得节集合,然后使用SectionCollection.get()方法获得特定的节。
  3. 使用Section.getTables()方法获得表格集合,然后使用TableCollection.get()方法获得想要的表。
  4. 调用mergeCell(Table table,boolean isHorizontalMerge,int index,int start,int end)方法来垂直或水平地合并表格单元格。这个方法将确定要合并的单元格是否有相同的值,并在合并的单元格中只保留一个值。
  5. 使用Document.saveToFile()方法保存文件。

代码示例

 1 import com.spire.doc.*;
2 import com.spire.doc.interfaces.ITable;
3
4 public class MergeCells {
5 public static void main(String[] args) throws Exception {
6
7 //Create an object of Document class and load the sample document.
8 Document document = new Document();
9 document.loadFromFile("Sample.docx");
10
11 //Get the first section
12 Section section = document.getSections().get(0);
13
14 //Get the first table
15 Table table = section.getTables().get(0);
16
17 //Invoike mergeCell()method to merge cells vertically
18 mergeCell(table, false, 0, 1, 3);
19
20 //Invoike mergeCell()method to merge cell horizontally
21 mergeCell(table, true, 0, 3, 4);
22
23 //Save the document to file
24 document.saveToFile("MergeTable.docx",FileFormat.Docx_2013);
25 }
26
27 //Customize a mergeCell() method to remove the duplicate values while merging cells
28 public static void mergeCell(Table table, boolean isHorizontalMerge, int index, int start, int end) {
29
30 if (isHorizontalMerge) {
31 //Get a cell from table
32 TableCell firstCell = table.get(index, start);
33 //Invoke getCellText() method to get the cell’s text
34 String firstCellText = getCellText(firstCell);
35 for (int i = start + 1; i <= end; i++) {
36 TableCell cell1 = table.get(index, i);
37 //Check if the text is the same as the first cell
38 if (firstCellText.equals(getCellText(cell1))) {
39 //If yes, clear all the paragraphs in the cell
40 cell1.getParagraphs().clear();
41 }
42 }
43 //Merge cells horizontally
44 table.applyHorizontalMerge(index, start, end);
45
46 }
47 else {
48 TableCell firstCell = table.get(start, index);
49 String firstCellText = getCellText(firstCell);
50 for (int i = start + 1; i <= end; i++) {
51 TableCell cell1 = table.get(i, index);
52 if (firstCellText.equals(getCellText(cell1))) {
53 cell1.getParagraphs().clear();
54 }
55 }
56 //Merge cells vertically
57 table.applyVerticalMerge(index, start, end);
58 }
59 }
60 public static String getCellText(TableCell cell) {
61
62 StringBuilder text = new StringBuilder();
63 //Traverse all the paragraphs of a cell
64 for (int i = 0; i < cell.getParagraphs().getCount(); i++) {
65 //Get every paragraph’s text and append it to StringBuilder
66 text.append(cell.getParagraphs().get(i).getText().trim());
67 }
68 return text.toString();
69 }
70 }

效果图

 
注:测试代码中的文件路径为程序Debug路径,文件路径可自定义为其他路径。
 
—THE END—

Java删除word合并单元格时的重复值的更多相关文章

  1. 20190407 Word合并单元格

    很长一段时间没处理word合并单元格,又忘记了采取忽略错误的方式测试出相应单元格的行列坐标这种方式.真是浪费时间.以后再也不想为此在深夜熬命. 今晚算是和它杠上了,很想弄清楚合并单元格之后行列坐标重新 ...

  2. java使用freemarker模板导出word(带有合并单元格)文档

    来自:https://blog.csdn.net/qq_33195578/article/details/73790283 前言:最近要做一个导出word功能,其实网上有很多的例子,但是我需要的是合并 ...

  3. java导出标题多行且合并单元格的EXCEL

    场景:项目中遇到有需要导出Excel的需求,并且是多行标题且有合并单元格的,参考网上的文章,加上自己的理解,封装成了可自由扩展的导出工具 先上效果,再贴代码: 调用工具类进行导出: public st ...

  4. C# 获取Excel中的合并单元格

    C# 获取Excel中的合并单元格 我们在制作表格时,有时经常需要合并及取消合并一些单元格.在取消合并单元格时需要逐个查找及取消,比较麻烦.这里分享一个简单的方法来识别Excel中的合并单元格,识别这 ...

  5. NPOI操作EXCEL(五)——含合并单元格复杂表头的EXCEL解析

    我们在第三篇文章中谈到了那些非常反人类的excel模板,博主为了养家糊口,也玩命做出了相应的解析方法... 我们先来看看第一类复杂表头: ...... 博主称这类excel模板为略复杂表头模板(蓝色部 ...

  6. NPOI扩展--判断指定单元格是否为合并单元格和输出该单元格的行列跨度(维度)

    因工作需要用到跨合并单元格获取数据,所以写了个NPOI扩展类. 主要方法如下: 1.判断指定行/列索引(单元格)是否为合并单元格. 2.获取指定列索引的实际含有数据的单元格. 3.返回指定行/列索引的 ...

  7. poi 合并单元格、设置边框

    HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet(); //创建一个样式 HSSFCellStyle sty ...

  8. apache poi合并单元格设置边框

    HSSFWorkbook wb = new HSSFWorkbook(); HSSFSheet sheet = wb.createSheet(); //创建一个样式 HSSFCellStyle sty ...

  9. python-利用xlrd模块中读取有合并单元格的excel数据

    前言 对于excel中有合并单元格的情况,合并的单元格只能取到第一个单元格的值,合并的单元格后面的单元格内容的值为空,针对这个情况,写了下面一段代码实现, 对单元格进行判断,如果是传入的索引是合并单元 ...

随机推荐

  1. while练习题_1到100之间的偶数和

    依然是while循环四步骤 初始化变量 条件判断 条件执行体 最后就是输出答案就可以了 点击查看笔者代码 a = 1 sum = 0 while a <= 100: if (a+1)%2:#if ...

  2. go交叉编译,部署到linux上出现cannot execute binray file的解决方案

    写在前面: 了解过常见的项目部署方式后,打算先从最简单的方式开始.没想到踩了大坑.先说下整个部署的过程.    博主是在window上生成linux上的可执行文件.. 具体过程: 1.首先按照网上说的 ...

  3. CentOS 定时计划任务设置

    一.安装crontab服务并设置开机自启 yum install crontabs (centos默认就会带,一般不需要安装) systemctl enable crond (设为开机启动) syst ...

  4. typescript中的esModuleInterop选项

    当没有加esModuleInterop时 库的代码: export const a = 1; export default function b() {} 生成代码 exports.__esModul ...

  5. python不同平台进程的启动与终止

    Liunx进程的启动与终止 在使用subprocess创建进程时需要将所有进程设置为一个进程组 preexec_fn:只在 Unix 平台下有效,用于指定一个可执行对象(callable object ...

  6. Cayley 公式的另一种证明

    Cayley 公式的一些广为人知的证法: Prufer 序列 Matrix-Tree 定理 然而我都不会 233,所以下面说一个生成函数角度的证法 . 我们知道 \(n\) 个节点的有标号无根树有 \ ...

  7. 内存问题难定位,那是因为你没用ASAN

    摘要:ASAN全称:Address Sanitizer,google发明的一种内存地址错误检查器.目前已经被集成到各大编译器中. 本文分享自华为云社区<内存定位利器-ASAN使用小结>,作 ...

  8. 一颗完整意义的LPWAN SOC无线通信芯片——ASR6601

    ASR6601是完整意义的LPWAN SOC无线通信芯片,该芯片集成了LORA射频收发器.调制解调器和32位RISC MCU.MCU采用cortex M4,频率48mhz.LORA射频收发器从150 ...

  9. php里的$this的 含义

    $this 的含义是表示    实例化后的 具体对象! 我们一般是先声明一个类,然后用这个类去实例化对象! 但是,当我们在声明这个类的时候,想在类本身内部使用本类的属性或者方法.应该怎么表示呢? 例如 ...

  10. Excel 单元格的相对引用和绝对引用

    引用方式 单元格的地址由该单元格所在的行号和列标构成,一个引用代表工作表上的一个或者一组单元格,指明公式中数据所在的位置. 编号 消费记录 价格 1 乒乓球 1 2 火腿肠 2 3 乒乓球 1 4 羽 ...