中海艾普油气测试(天津)有限公司,天津,300457
【摘要】目前许多行业对Word文档的格式要求尤为严格,这些要求实际就是用固定模板对文档进行格式化。但使用Microsoft Office Word工具按要求对文档进行格式化时,操作往往复杂繁琐,要求编辑者有较高的Word工具操作能力。Word初学者要想在短时间内完成这项任务是不可能的。那么有没有一个软件可以实现文档格式化的傻瓜式操作,让Word小白都能一键得到格式化好的文档呢?本文探讨的就是如何在WPF框架上实现这样的软件。
【关键词】Word文档;格式化;WPF;富文本
一 软件概述
在应用软件的开发上,WPF做到了界面设计和处理逻辑分离,这不仅降低了代码的耦合度还使UI设计变得简单灵活,故选择基于WPF框架开发软件。软件需要用户输入文档内容或复制内容到输入框,输入内容可以包括文字、表格和图片等,输入框需用富文本控件,软件选用DevExpress的RichEditControl控件。Word文档的架构和格式要求需要用xml文件进行配置。软件流程如下图所示:
图 1 软件流程图
二 程序编写
程序需要引用DevExpress控件库,Microsoft.Office.Interop.Word.dll动态库以及XDesigner.RTF.dll动态库。
1 加载Word文档框架
软件会自动读入文档配置,文档可配置到三级结构,文档需要按照xml格式编写,图2所示界面的文档配置实例如下:
封面" Style="Cover"> // Cover表示封面页配置
标题" />
单位" />
日期" />
一、正文" Style="OverView"> // 一级标题,OverView表示正文页配置
段落1标题" /> // 二级标题
段落2标题" >
子段落1标题" /> // 三级标题
子段落2标题" />
图2 Word文档框架界面
软件生成文档框架后即可在右方RichEditControl控件中粘贴或直接输入对应段落的内容。
2 获取富文本(RTF格式)内容
RichEditControl控件可获取富文本内容,代码如下:
var ctrl = sender as RichEditControl;
string strRtf = ctrl.Document.RtfText;[1]
3 处理富文本(RTF格式)内容
RTF是微软公司为进行文本和图像信息格式的交换而制定的一种文件格式它适用于不同的设备、操作环境和操作系统[2]。RTF文件数据格式由未格式文本、控制字、控制符和组构成[3]。RTF格式是一种比较复杂的格式,在此不深入讨论该格式的具体细节,笔者调用XDesigner.RTF.dll开源库对RTF格式的内容进行解析,对象初始化代码如下:
XDesigner.RTF.RTFDomDocument rtfDoc= new XDesigner.RTF.RTFDomDocument();
rtfDoc解析富文本内容采用LoadRTFText函数,代码如下:
rtfDoc.LoadRTFText(strRtf); // strRtf为对应章节控件中的富文本内容
解析后,rtfDoc.Elements对象存储解析元素信息,rtfDoc.Elements为列表结构,软件通过遍历该列表获取各个解析元素。其中软件关注的元素包括RTFDomParagraph(段落元素)、RTFDomText(文本元素)、RTFDomImage(图像元素)、RTFDomTable(表格元素)、RTFDomTableRow(表格中的行元素)和RTFDomTableCell(表格中的单元格元素)。软件针对不同元素采用不同处理逻辑进行处理,即格式化元素。下节将介绍以RTFDomText为例的代码。
4 格式化元素
在格式化元素之前,软件需要读取格式要求设置文档,格式要求设置文档需要按照xml格式编写,实例如下:
//字体格式列表
宋体" FontBold="0"/>
宋体" FontBold="0"/>
3" FontSize="16" FontName="黑体" FontBold="0"/>
4" FontSize="14" FontName="黑体" FontBold="0"/>
5" FontSize="12" FontName="宋体" FontBold="0"/>
6" FontSize="10.5" FontName="黑体" FontBold="0"/>
//段落格式列表
// 页面布局列表
其中index均为索引,字体格式中FontSize为字体大小(以磅为单位),FontName为字体类型,FontBold为是否加粗。段落格式中Alignment表示段落对齐方式,LineSpacingRule表示段落行距,SpaceBefor表示段落的段前间距(以磅为单位),SpaceAfter表示段落的段后间距 (以磅为单位),OutlineLevel表示段落大纲级别,CharacterUnitFirstLineIndent表示段落首行或悬挂缩进的值 (以字符为单位),属性的具体数字含义参见微软帮助文档Microsoft.Office.Interop.Word篇[4]。
软件代码通过索引将内容和格式一一对应起来,格式化内容前需要先获取Word文档段落,代码如下:
Microsoft.Office.Interop.Word.Application WordApp = new Application();//新建Word应用程序
object oMissing = System.Reflection.Missing.Value;//初始化默认属性
Microsoft.Office.Interop.Word.Document document = WordApp.Documents.Add(ref oMissing, ref oMissing, ref oMissing, ref isVisible);//添加空白文档
var p = document.Paragraphs.Add(ref oMissing);//获取文档新增段落
接着对富文本内容进行格式化,即需要对p.Range进行处理,以RTFDomText为例的代码如下:
if (element is RTFDomText) //判断元素是不是文本元素
{
if (ScanTableCell(element)) //如果是表格中的文字
{
FormatCharactorStyle(p.Range, 11);//将文字设置为索引为8的字体格式
FormatParagraphStyle(p.Range, 5); //将段落设置为索引为5的段落格式
}
else //其他文字
{
FormatCharactorStyle(p.Range, 9); //将文字设置为索引为9的字体格式
FormatParagraphStyle(p.Range, 2); //将段落设置为索引为2的段落格式
}
p.Range.InsertAfter(element.InnerText);//在段落末尾插入文字
}
5 生成目录
在文档其他部分格式化后,需要根据章节信息生成目录,代码如下:
Object oMissing = System.Reflection.Missing.Value;//初始化默认值
Object oUpperHeadingLevel = "1";
Object oLowerHeadingLevel = "3";
Object oTOCTableID = "TableOfContents";
p.Range.Document.TablesOfContents.Add(range, true, "1","3",oMissing, "TableOfContents", true,true, oMissing, true, true, true); //添加目录
p.Range.InsertBefore("目 录\r");
其中p.Range为代码中记录的目录所在段落。
6 输出Word文档
Word文档的整合包括对封面标题和内容的格式化,对各级标题和内容的格式化,自动生成目录,对图片和表格的大小进行调整(使宽度与文档宽度相同),规范数字、字母和字符字体(均规范为Times New Roman字体)。最后保存Word文档并关闭Word应用,代码如下:
document.SaveAs2(file);//以file为文件名报错文件
document.Close();//关闭文档对象
三 结束语
本文介绍了Word文档格式化软件的编程思路,该软件可以一键生成格式化好的文档,目前软件已完成,在测试阶段。后续还会继续研究增加软件功能,使软件更智能,比如增加图片和表格格式参数设置,增加纠错功能以及定制特殊部分的格式等。
参考文献:
[1]DevExpress Demo Center 16.2.https://www.devexpress.com/support/demos/#wpf
[2]Microsoft Corporation. Rich Text Format (RTF) Specification[EB/OL].[2014-10-08].http://msdn.microsoft.com/en-us/library/aa140277 (office.10).aspx.
[3]乐德广,章亮,郑力新,等.面向RTF文件的Word漏洞分析[J].华侨大学学报(自然科学版),2015,36(1):17
[4]Microsoft.Office.Interop.Word帮助文档[EB/OL].https://docs.microsoft.com/zh-cn/dotnet/api/microsoft.office.interop.w
ord.
作者简介:李瑞玲;出生年月:1988年12月;性别:女;民族:汉;籍贯:河北沧州;学历:硕士研究生;职称:中级工程师;研究方向:计算机软件编程