以编程方式在MS Word加载项中保存打开的文档

时间:2013-12-19 17:46:10

标签: c# ms-word ms-office openxml-sdk office-addins

我正在尝试在C#中为MS Word 2010创建一个加载项,它将添加一个新的功能区和一个单击事件处理程序。例如,此单击事件处理程序应将活动文件保存在c:\temp中。然后我需要将文件内容加载到字节数组中。

可能是这样的:

public void ClickEventHandler(Office.IRibbonControl control)
{
    string fileLocation = "c:\temp\test.docx";
    Word.Document document = this.Document;
    document.SaveAs(fileLocation);
    byte[] byteArray = File.ReadAllBytes(fileLocation);
}

关键是,这是伪代码,我不知道如何将活动文档加载到字节数组中。如果有一种方法没有保存文档,那就更好了。

如果活动文件是docx(而不是doc文件),那么查询也会很好。

2 个答案:

答案 0 :(得分:2)

Word.Document document = Globals.ThisAddIn.Application.ActiveDocument;     
document.SaveAs2(goldenpath + "\\" + name + "." + id + ".docx");
document.Close();

答案 1 :(得分:0)

我在程序中使用这个泛型函数将任意对象序列化为字节数组:

private byte[] MakeByteSize<U>(U obj)
{
  if (obj == null) return null;

  var bf = new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
  var ms = new System.IO.MemoryStream();
  bf.Serialize(ms, obj);

  return ms.ToArray();
}

修改

在阅读了您的其他内容之后,我确信序列化Word.Document对象无法满足您的需求,因为在程序中表示该对象的字节数组(可能是某些COM的包装) interop)与表示文件中存储的有关文档的信息的字节数组不同。

查看您引用的MSDN article,看起来我们真正需要的是一个WordprocessingDoc实例,表示我们可以传递给HtmlConverter类的文档。所以我认为你真正想问的问题是“如何在不保存文件的情况下从打开的文档中创建DocumentFormat.OpenXml.Packaging.WordprocessingDocument?”

不幸的是,我不确定这是可能的,因为我并没有真正发现methodsclass的任何Open XML SDK for Microsoft Office

.doc vs .docx问题上,{{3}}表示它适用于符合“Office Open XML文件格式规范”的documentat,我相信这意味着它只会起作用使用.docx文件格式。您可能必须尝试不同的路线,例如可能导出为PDF。祝你好运!