关于Unity使用Aspose.Words创建表格单元格垂直合并不生效情况说明

news2024/11/24 18:28:37

文章目录

      • 👉一、前言
      • 👉二、问题重现
        • 1、首先看一下我用下面两段代码创建的表格:
        • 2、被这个问题折磨的心路历程
      • 👉三、分析原因
      • 👉四、解决方法

👉一、前言

最近在使用Aspose.Words.dll实现创建表格功能时,遇到了一个让我费解了好几天的问题——单元格垂直合并失效。我都快要怀疑人生了都,关键是它水平合并没问题,而且创建别的表格垂直合并也没问题;况且经过我反复测试,代码逻辑也是没有问题的,你说这气不气人,都快被我整出玄学来了。功夫不负有心人,终于在一个周末让我找到了问题的关键所在,最终解决了这个Aspose.Words创建表格单元格垂直合并失效的问题。仅以此博客记录,供新同学学习,避免踩坑!

👉二、问题重现

1、首先看一下我用下面两段代码创建的表格:

绘制表格前需要引用的命名空间:

using Aspose.Words;
using Aspose.Words.Tables;

测试表格1:

            string docPath = "xxxx";//doc模板文件的路径
            Document doc = new Document(docPath);
            DocumentBuilder builder = new DocumentBuilder(doc);//绘制文档内容的一支笔
            Table testTable = builder.StartTable();//开始绘制表格
            for (int i = 0; i < 4; i++)
            {
                builder.InsertCell();//绘制一个单元格
                if (i == 0)
                {
                    //水平合并第一个单元标记为First
                    builder.CellFormat.HorizontalMerge = CellMerge.First;
                    builder.Write("测试表头水平合并单元格");
                }
                else
                {
                    //将后面需要水平合并的单元格标记为Previous
                    builder.CellFormat.HorizontalMerge = CellMerge.Previous;
                }
            }
            builder.EndRow();//结束一行
            builder.CellFormat.HorizontalMerge = CellMerge.None;
            for (int i = 0; i < 8; i++)
            {
                builder.InsertCell();
                builder.CellFormat.VerticalMerge = CellMerge.None;

                int cellIdx = (i > 3) ? (i - 4) : i;//用来计算单元格在一行中的下标位置
                if (cellIdx == 0 || cellIdx == 1)//下标为0或1的需要垂直合并
                {
                    if (i < 4)
                    {
                        builder.CellFormat.VerticalMerge = CellMerge.First;
                    }
                    else
                    {
                        builder.CellFormat.VerticalMerge = CellMerge.Previous; 
                    }
                }
                builder.Write("测试单元格合并" + i);
                if (cellIdx == 3)
                {
                    builder.EndRow();
                }
            }
            builder.EndTable();//结束一个表格
            testTable.AllowAutoFit = false;//不允许自适应内容重调尺寸

在这里插入图片描述
测试表格2:

            Table testTable2 = builder.StartTable();

            builder.InsertCell();
            builder.CellFormat.VerticalMerge = CellMerge.First;
            builder.Write("第一行第一列垂直合并");

            builder.InsertCell();
            builder.CellFormat.VerticalMerge = CellMerge.First;
            builder.Write("第一行第二列垂直合并");

            builder.InsertCell();
            builder.CellFormat.VerticalMerge = CellMerge.None;
            builder.Write("第一行第三列不合并");

            builder.InsertCell();
            builder.CellFormat.VerticalMerge = CellMerge.None;
            builder.Write("第一行第四列不合并");

            builder.EndRow();

            builder.InsertCell();
            builder.CellFormat.VerticalMerge = CellMerge.Previous;

            builder.InsertCell();
            builder.CellFormat.VerticalMerge = CellMerge.Previous;

            builder.InsertCell();
            builder.CellFormat.VerticalMerge = CellMerge.None;
            builder.Write("第二行第三列不合并");

            hbuilder.InsertCell();
            builder.CellFormat.VerticalMerge = CellMerge.None;
            builder.Write("第二行第四列不合并");

            builder.EndTable();

在这里插入图片描述

2、被这个问题折磨的心路历程

1.两个绘制表格的代码都是放在一起的,绘制完上一个,就绘制一个了,怎么会出现这种情况呢?郁了个大闷。最开始我还以为是我绘制表格的逻辑写错了,但经过我反复测试代码逻辑肯定是没错的。

2.后面我就怀疑是不是这个Aspose.Words.dll版本的问题,于是我又找了这个版本前后的好几个版本导进来测试也是会出现这个问题,所以也排除了这个原因。

3.由于我用的Unity版本有点低,我在想会不会是Unity版本低的原因这个Api它不支持所以失效呢,后面也排除了。
反反复复换了一些方法,也调试代码测试,堵了好些时间都没解决。

可能心细的朋友看我上面那两段代码早就发现了问题所在:第一段画表格代码比第二段多了一句不一样的代码:testTable.AllowAutoFit = false;(这个属性默认为true)
我也是被折磨了好久才发现这里的,于是我把这句话注释掉,第一个表格的垂直合并就正常了!所以说导致垂直合并失效的原因是这句代码。这个属性是用来设置表格是否可以自适应内容重调表格单元格的尺寸的。如果去掉这句,保存的表格后,如果往单元格里输入内容,单元格的宽度就会横向自适应,弄的表格不好看。所以我的需求里就必须加上这句代码(虽然打开保存后的word文件,也可以设置这个表格属性,但是为了减少用户操作)。如果我继续留这个代码那就无法绘制垂直合并的单元格,所以只能另寻他法,于是我也是一通好找,才找到了一个跟表格布局相关的Api:doc.UpdateTableLayout();,我刚开始是将这句代码放在保存文档之前,发现还是有问题,我又郁闷了,实在是没方法了,后来我想到把这句话放在绘制完表格之后试试,没想到问题解决了!最终我想清楚了这里面的原因,以及得出了解决方法。

👉三、分析原因

我猜想是因为代码里将表格设置为不允许自适应内容后,表格的一些格式设置(如单元格垂直合并)会失效;所以应该在设置AllowAutoFit这个属性前调用UpdateTableLayout()方法更新一下表格的布局,让表格其他属性先生效,再设置AllowAutoFit为false。经过反复测试也证实了,如果设置AllowAutoFit为false后,再调用UpdateTableLayout()方法也是会出现单元格垂直合并失效这个问题。以此得出下文解决方法。

👉四、解决方法

1.注释掉AllowAutoFit=false;这句代码(前提是你没有这个需求),因为它默认就是true允许自适应,只是这样会导致输入内容时列宽自动扩充,不好看而已。没有这个需求的话也不会出现单元格垂直合并失效的问题。

2.如果不允许表格自适应,也就是设置了AllowAutoFit=false的之前,先调用UpdateTableLayout()方法刷新表格布局。

doc.UpdateTableLayout();
table.AllowAutoFit = false;

这样表格就正常了。
在这里插入图片描述
3.不过我看Aspose.Words的官方文档说:通常不需要调用此方法,因为单元格和表的宽度是自动维护的。可能需要在导出到PDF之前调用此方法,只有在PDF输出中出现表格布局错误的极少数情况下才需要调用此方法。目前我没有发现用这个Api会出现文档里的其他内容格式错乱的情况,所以具体就看各自的需求了。
请添加图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/100186.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Google Earth Engine APP(GEE)——用一个选择器选择不同城市的应用

我们很多时候在进行应用制作的时候,都会用到选择器用于添加不同的城市,从而进一步选择不同的区域进行分析,本文就将准备一个包含有城市的矢量数据,按照名字进行筛选,最终展示不同城市的所在范围,从而实现简单的select选择器的调用。本文最主要的就是这个回调函数。 具体…

C语言基础—指针(地址引用、指针数组、二次指针)

本章主要讲解指针的基本定义和指针的传递、偏移。后面继续讲解指针数组和多维指针、二级指针等 知识点&#xff1a; 指针的定义和指针分类各类指针的字节长度取决于系统位数指针的传递&#xff08;值传递和引用(地址传递)&#xff09;指针的偏移&#xff08;自增自减号&#x…

动态优化解决方案空间中的最小支持(Matlab代码实现)

目录 &#x1f4a5;1 概述 &#x1f4da;2 运行结果 &#x1f389;3 参考文献 &#x1f468;‍&#x1f4bb;4 Matlab代码 &#x1f4a5;1 概述 相对于求解函数极值这类静态问题&#xff0c;许多存在于真实世界的优化问题都是在动态变化的&#xff0c;这一类问题被称为动态…

201732-35-6,H2N-AFP-pNA

AFP-pNA&#xff0c;来自牙周病原体牙龈卟啉单胞菌和黑普氏菌的脯氨酸三肽基氨基肽酶的底物。 编号: 189876中文名称: 三肽Xaa-Xaa-Pro tripeptidylpeptidase substrateCAS号: 201732-35-6单字母: H2N-AFP-pNA三字母: H2N-Ala-Phe-Pro-pNA氨基酸个数: 3分子式: C23H27N5O5平均分…

React 入门:脚手架代理配置

文章目录React AjaxAxios在 React 中使用 Axios脚手架代理配置React Ajax 理解 React 本身只关注于界面&#xff0c;并不包含发送 ajax 请求的代码。前端应用需要通过 ajax 请求与后台进行交互&#xff08;json 数据&#xff09;。React 应用中需要继承第三方 ajax 库&#xff…

C++ · 入门 | 准备知识

啊我摔倒了..有没有人扶我起来学习.... &#x1f471;个人主页&#xff1a;《CGod的个人主页》\color{Darkorange}{《CGod的个人主页》}《CGod的个人主页》交个朋友叭~ &#x1f492;个人社区&#xff1a;《编程成神技术交流社区》\color{Darkorange}{《编程成神技术交流社区》…

uniapp实现楼层导航 ,滚动定位,锚点导航

uniapp实现楼层导航的核心技术要点&#xff1a; 1、scroll-view作为视图容器&#xff0c; 2、用其属性scroll-into-view,用于完成点击联动 3、uni.createSelectorQuery().selectAll();获取右侧所有元素信息&#xff0c;获取top值存入数组&#xff0c;用于计算滑动时需要的联动…

Vue-cli工程中每个文件夹和文件的用处

dist 文件夹&#xff1a;默认 npm run build 命令打包生成的静态资源文件&#xff0c;用于生产部署 node_modules&#xff1a;存放npm命令下载的开发环境和生产环境的依赖包 public&#xff1a;有的叫assets&#xff1a;存放项目中需要用到的资源文件&#xff0c;css、js、im…

【Linux】软件包管理器yum

​&#x1f320; 作者&#xff1a;阿亮joy. &#x1f386;专栏&#xff1a;《学会Linux》 &#x1f387; 座右铭&#xff1a;每个优秀的人都有一段沉默的时光&#xff0c;那段时光是付出了很多努力却得不到结果的日子&#xff0c;我们把它叫做扎根 目录&#x1f449;Linux软件…

未来已来,光伏产业将走向何方?十大趋势待揭晓!

碳中和大背景下&#xff0c;光伏已经成为发展最迅猛的热门产业之一。在能源产业变革中&#xff0c;光伏将成为未来最大的绿电来源。 据预测&#xff0c;到2030年&#xff0c;全球可再生能源的占比将超过50%。届时&#xff0c;光伏发电和风电将成为全球可再生能源的主力军。根据…

Android入门第50天-读写本地文件

简介 为了这个系列&#xff0c;我的代码已经准备到了第150天了。接下来的内容会越来越精彩&#xff0c;我们也越来越开始进入Android的一些高级功能上的编程了。今天我们就要讲Android中对本地文件进行读写的全过程。 课程目标 输入文件名、输入文件内容后按【保存到SD卡】&a…

毕业设计 - 基于SSH的任务调度系统的设计与实现 【源码+论文】

文章目录前言一、项目设计1. 模块设计2. 实现效果二、部分源码项目源码前言 今天学长向大家分享一个 Java web 毕业设计项目: 基于SSH的任务调度系统的设计与实现 一、项目设计 1. 模块设计 根据需求调研结果确定本任务调度系统的功能结构&#xff0c;最终系统实现的系统将…

Django

文章目录基础知识创建项目启动项目创建超级用户创建项目构建个人博客网站简单构建开启本地虚拟环境初步创建blog应用常用的模板标签和过滤器注&#xff1a;常用的模板标签注&#xff1a;常用的过滤器模板嵌套全局模板文件夹模板文件设置建议使用css美化页面导航栏页面美化css框…

捋一捋什么是MySQL插入意向锁?

Insert Intention Lock&#xff0c;中文我们也称之为插入意向锁。 这个可以算是对我们之前所讲的 Gap Lock 的一个补充&#xff0c;关于 Gap Lock&#xff0c;如果还有小伙伴不懂&#xff0c;可以参考&#xff1a;聊一聊MySQL的记录锁、间隙锁与 Next-Key Lock。 1. 为什么需…

Java基础之《netty(14)—异步模型》

一、基本介绍 1、异步的概念和同步相对。当一个异步过程调用发出后&#xff0c;调用者不能立刻得到结果。实际处理这个调用的组件在完成后&#xff0c;通过状态、通知和回调来通知调用者。 2、netty中的I/O操作是异步的&#xff0c;包括Bind、Write、Connect等操作会简单的返…

【云原生 | 47】etcdctl客户端的使用方法详解

&#x1f341;博主简介&#xff1a; &#x1f3c5;云计算领域优质创作者 &#x1f3c5;2022年CSDN新星计划python赛道第一名 &#x1f3c5;2022年CSDN原力计划优质作者 &#x1f3c5;阿里云ACE认证高级工程师 &#x1f3c5;阿里云开发者社区专…

后台基础权限框架搭建实现[木字楠博客]

文章目录1、项目整合SpringSecurity1.1、引入SpringSecurity依赖1.2、启动测试1.3、自定义实体类继承UserDetails1.4、自定义配制文件1.5、重写loadUserByUsername方法1.6、自定义匿名访问注解1.8、编写SpringSecurity配制类后台权限框架搭建&#xff1a;本项目权限主要依赖Spr…

Polynomial Round 2022 (Div. 1 + Div. 2, Rated, Prizes!) A-C

比赛链接 目录 A. Add Plus Minus Sign 题意&#xff1a; 思路&#xff1a; 代码&#xff1a; B. Coloring 题意&#xff1a; 思路&#xff1a; 代码&#xff1a; C. Ice and Fire 题意&#xff1a; 思路&#xff1a; 代码&#xff1a; A. Add Plus Minus Sign 题意…

半导体芯片制造过程可以用哪种测量仪器

近年来&#xff0c;面对持续高涨的芯片需求&#xff0c;半导体行业生产迎来了高难度挑战——对芯片工艺要求更精细&#xff0c;从5nm到3nm&#xff0c;甚至是2nm。“先进封装”的提出&#xff0c;是对技术的新要求&#xff0c;也是对封装工艺中材料和设备的全新考验。 芯片身上…

节点电力市场生产商的战略竞标:凸松弛方法(Matlab实现)

目录 1 电力市场 1.1 什么是电力市场 1.2 电力市场发展历程 1.3 对传统电力系统理论的挑战 2 节点电力市场生产商的战略竞标&#xff1a;凸松弛方法 2.1 简介 2 Matlab代码 1 电力市场 1.1 什么是电力市场 市场&#xff1a;商品交换(交换商品的过程称交易)关系的总和 …