一个DevExpress的Docx文件处理的Bug的解决

事情是这样的

用DevExpress的批量替换Docx文件文件中的内容。就是把 {数据项} 替换成相应的数据。用DevExpress实现这个处理,简单方便。

string pattern = @"\{.*?\}";

Regex regex = new Regex(pattern);

DocumentRange[] ranges = document.FindAll(regex, document.Range);

for (int idx = fields.Count - 1; idx >= 0; idx--)

{

if (idx >= ranges.Length)

continue;

DocumentRange range = ranges[idx];

string txt = document.GetText(range);

txt = txt.Substring(1, txt.Length - 2);

range = ranges[idx];

。。。。。。

}

DevExpress 支持使用正则表达式进行find。所以特别简单。

直到有一天,客户说替换的Docx有问题,少了2条线。就是下图的左右两边的线。

用DevExpress 处理后,这2条线就会丢失。

查找原因

这2条线是啥 ,俺也不知道。问了一下别人,说是Borders。俺以前也没有见过这种格式Docx。

对于Office的文件,俺之前发过一个博客《使用C#学习Office文件的处理(pptx docx xlsx)》

里面有讲解如何处理这类的问题。

首先运行

然后打开文件,点击Reflect Code

把Docx逆向为C#的代码

然后搜索PageBorders

找到了核心的代码

PageBorders pageBorders1 = new PageBorders();

LeftBorder leftBorder35 = new LeftBorder(){ Val = BorderValues.Single, Color = "auto", Size = (UInt32Value)4U, Space = (UInt32Value)4U };

RightBorder rightBorder35 = new RightBorder(){ Val = BorderValues.Single, Color = "auto", Size = (UInt32Value)4U, Space = (UInt32Value)4U };

pageBorders1.Append(leftBorder35);

pageBorders1.Append(rightBorder35);

如果,对Docx的行号的显示感兴趣的话,这里也有行号的处理

LineNumberType lineNumberType1 = new LineNumberType(){ CountBy = 5 };

解决问题

找出了核心代码,就好办了 。写了下面这个函数。执行这个函数就可以把那2根线加回去。

cs 复制代码
        public static void AddSectionBorders(string filePath)
        {
            using (WordprocessingDocument doc = WordprocessingDocument.Open(filePath, true))
            {
                MainDocumentPart mainPart = doc.MainDocumentPart;
                Body body = mainPart.Document.Body;

                // 获取第一个SectionProperties
                SectionProperties sectionProps = body.GetFirstChild<SectionProperties>();
                if (sectionProps == null)
                {
                    sectionProps = new SectionProperties();
                    body.AppendChild(sectionProps);
                }

                // 创建页面边框
                PageBorders pageBorders = new PageBorders()
                {
                    LeftBorder = new LeftBorder()
                    {
                        Val = BorderValues.Single,
                        Size = 4,
                        Space = 4,
                        Color = "auto"
                    },
                    RightBorder = new RightBorder()
                    {
                        Val = BorderValues.Single,
                        Size = 4,
                        Space = 4,
                        Color = "auto"
                    },
                    TopBorder = new TopBorder()
                    {
                        Val = BorderValues.Nil
                    },
                    BottomBorder = new BottomBorder()
                    {
                        Val = BorderValues.Nil
                    }
                };


                // 移除现有的页面边框和边距
                sectionProps.RemoveAllChildren<PageBorders>();

                // 添加新的边框和边距设置
                sectionProps.Append(pageBorders);

                // 保存更改
                mainPart.Document.Save();
            }
        }

总结

微软给的工具很方便,虽然是十几年前的老工具。

相关推荐
工程师0073 小时前
C# 继承、多态、虚方法表(VTable)原理
c#·多态·继承·虚方法表
月昤昽6 小时前
autocad二次开发 3.阵列与面域
c#·二次开发·autocad二次开发
熟人看不到6 小时前
解决Claude Code界面错位更新不及时-Windows
bug·vibecoding·claude code
深念Y8 小时前
踩坑实录:把 Windows 默认 PowerShell 换成 7.x 到底有多坑?一条龙解决指南
windows·乱码·bug·控制台·powershell·管道·流式
唐青枫9 小时前
别只会用 MemoryCache!C#.NET CacheManager 详解:多级缓存、Region 与 Redis 实战
c#·.net
油炸自行车10 小时前
【Qt bug排查】Qt项目debug模式下,关闭可视化界面后,后台程序不退出,依然在打印log
bug
吴可可12310 小时前
PointF坐标精度与使用注意事项
c#
鸽子一号12 小时前
c#Modbus通信
开发语言·c#
cjp56015 小时前
001.Blazor简介
c#
工程师00716 小时前
C# 程序集、IL、CLR 执行流程
c#·clr·il·程序集