C# Docx.dll动态word模板添加表格

先说需求,我们本地有一个doc模板,需要把模板中的表格动态改掉,列和行都要修改

先找到表格所在位置:

 //获取table
DocX m_Doc = DocX.Load(XMLurl);
Table Table = m_Doc.Tables[tableIndex];

这个tableIndex是我传进来的,本来想用书签查的,但是发现书签类里没有存table,而用document里面的tables直接就可以找到,所以我就干脆传了个索引值进来;

下一步开始处理表格,本来document有个insertTable的方法很好用,几行几列直接就create一个新的了,但是我们希望在模板里处理格式,所以在模板里插入了一个表格,我们就在这个表格的基础上修改

修改思路为:先看原来的表格里有几行几列,如果比我们需要显示的行列数大,就删掉,小的话就加新的进来;

这里是我今晚卡住的主要原因,因为加新的进来需要按照每行加,每行的cell数虽然加了,但是table整体的columnCount并没有变化
我当时是这样写的:

for (int i = colNum; i < 0; i++)
{
    var cell = TableOperation.CreateTableCell();
    row.Xml.Add(cell);
}

这个CreateTableCell()方法是我从源码里扒下来的,因为我发现对word的操作其实是对XDocument的Xml操作,所以new一个新的tr加进来,就可以加入到本row的Xml内容里,那么这个row的ColumnCount就也变化了

外面这个table的columnCount依然不变,我查了DocX的源码,原来这个table的属性是算出来的,它会遍历每一行的cell数量,把最多的数字返回来,也就是说这个table里最多的那一行有多少个cell,这个table就是几列

那么理论上来说,现在每个row的cell都是6个,我的表的列就应该也是6个,这样你如果下面要新加行的话,直接就是6个cell的行了,但是事实证明并不是这样,表格列数是模板里的列数3,虽然我debug每行的columncount都是6
于是我又去查了row的columncount属性,发现它仍然是3,虽然我debug的时候它确实是6,但是在源码里打log就会发现它还是3

后来我就想,我插入cell的这段代码,它只是操作了它的xml,那么会不会其他属性没有被更新呢?先来看一下row是怎么算它的columncount的:
在这里插入图片描述
这里那几个一看就不知道是干什么的变量都不重要,重点就是cell的数量,确实它是把cell的count返回来的,所以我们看一下对cell的操作:
在这里插入图片描述
这个写法我没见过,但是大概能猜到,翻译过来就是在整个xml里找叫tc的元素,那么这段代码最可疑的就是这个xml了(越来越接近真相了,我跑起来的时候真的紧张死了,比被人告白还紧张)
在这里插入图片描述
这个Xml,就是没有被更新!知道为什么没有被更新吗,就在最开始的那段代码里,我add进去了很多cell对不对,但是!它只有get和set属性!也就是说,我只用了Add,它根本没有被set!

(这个Add确实还是挺烦的,我之前写自定义属性的时候也是,一个list属性你只add,不重新赋值,我的工具类里就是没办法更新,所以你Add完了之后还要再赋一遍,确实也挺奇怪的)

回到这个问题,既然这样,就很好改了:

XElement rowElement = row.Xml;
for (int i = colNum; i < 0; i++)
{
    var cell = TableOperation.CreateTableCell();
    rowElement.Add(cell);
}
row.Xml = rowElement;	//这里会触发set方法

果然跑通了,hhh

下面处理表格行,还是同样的逻辑,先让行数和你数据的行数相同,接下来就可以直接往里插了

 			//修改行内容
            for (int i = 1; i <= dataTable.Rows.Count; i++)
            {
                for(int j = 0; j < dataTable.Columns.Count; j++)
                {
                    Table.Rows[i].Cells[j].Paragraphs[0].Remove(false);
                    Table.Rows[i].Cells[j].Paragraphs[0].Append(dataTable.Rows[i - 1][j].ToString());
                }
            }

有个问题,就是添加内容之前需要先清空一下,因为模板里本身的表里是有示例内容的,需要把它remove掉

注:DocX的源码我是从GitHub上下载的,所以它其实也是开源的,我就把代码贴上来了,应该没问题吧!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值