事情是这样的
用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();
}
}
总结
微软给的工具很方便,虽然是十几年前的老工具。