使用Open XML SDK 可以轻松实现Word套打,以往我们要实现Word套打有几种途径:
1. 使用VBA编程
2. 使用VSTO开发
3. 使用第三方Com组件
无论哪种方式都有很多前提条件比如需要安装Office,需要安装第三方的软件或者控件。
如今, Open xml sdk允许在不安装Office的情况对Office相关文档进行操作, 为我们轻松实现套打打开了方便之门。
实现方案:
新建一个Word文档模版
编程通过Open XML把数据写入模版 表格中
使用Word打印
就是这么简单。
以下为实现案例:
1. 新建一个Word 文档模版,在里面插入表格,保存。
2. 编程写入数据到表格
public void InsertData()
{
string destFileName = Application.StartupPath + _number + "_SGD.docx";
if (System.IO.File.Exists(destFileName))
System.IO.File.Delete(destFileName);
System.IO.File.Copy(this._templateFile, destFileName);
using (WordprocessingDocument doc = WordprocessingDocument.Open(destFileName, true))
{
var table = doc.MainDocumentPart.Document.Body.Descendants<OpenXMLWord.Table>().ToArray()[0];
var rows = table.Descendants<OpenXMLWord.TableRow>().ToArray();
var cells = rows[0].Elements<OpenXMLWord.TableCell>().ToArray();
var content = new OpenXMLWord.Paragraph(new OpenXMLWord.Run(new OpenXMLWord.Text("测试")));
cells[0].Append(content);
doc.MainDocumentPart.Document.Save();
}
}
结果如下:
就是这么轻松,但是过程中有个小插曲,写完代码, 每次调用doc.MainDocumentPart.Document.Body.Descendants<Table>()都返回0条对象。一度怀疑Open XML SDK 有问题, 最后发现原因竟然是Open XML里有两个命名空间都有同名类(DocumentFormat.OpenXml.Drawing和DocumentFormat.OpenXml.Wordprocessing),而Open XML的Descendants泛型方法又都能接受这两个同名类型。 结果我用到了Drawing下的类,导致读取不到表格。