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

C# 以编程方式在MS Word加载项中保存打开的文档,c#,ms-word,ms-office,office-addins,C#,Ms Word,Ms Office,Office Addins,我正在尝试为MS Word 2010在C#中创建一个外接程序,它将添加一个新功能区和一个单击事件处理程序。例如,此单击事件处理程序应将活动文件保存在c:\temp中。然后我需要将文件内容加载到一个字节数组中 可能是这样的: public void ClickEventHandler(Office.IRibbonControl control) { string fileLocation = "c:\temp\test.docx"; Word.Document document =

我正在尝试为MS Word 2010在C#中创建一个外接程序,它将添加一个新功能区和一个单击事件处理程序。例如,此单击事件处理程序应将活动文件保存在
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文件)也不错。

我在程序中使用此通用函数将任意对象序列化为字节数组:

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();
}
private byte[]MakeByteSize(U obj)
{
if(obj==null)返回null;
var bf=new System.Runtime.Serialization.Formatters.Binary.BinaryFormatter();
var ms=new System.IO.MemoryStream();
bf.序列化(ms,obj);
返回ToArray女士();
}
编辑:

在阅读了您的其他内容后,我确信序列化
Word.Document
对象不会得到您所需要的,因为程序中表示该对象的字节数组(可能是某个COM互操作的包装器)与表示文件中存储的文档信息的字节数组不同

查看您引用的文档,看起来我们真正需要的是一个
WordprocessingDoc
实例,它表示可以传递给
HtmlConverter
类的文档。因此,我认为您真正想问的问题是“如何从打开的文档创建
DocumentFormat.OpenXml.Packaging.WordprocessingDocument
,而不首先保存文件?”

不幸的是,我不确定这是不是可能的,因为我并没有发现任何能做到这一点的方法


.doc
vs
.docx
问题上,声明它与遵循“Office Open XML文件格式规范”的documentat一起工作,我相信这意味着它将只与
.docx
文件格式一起工作。您可能需要尝试不同的方法,比如导出为PDF。祝你好运

顺便问一下,你到底想完成什么?欢迎来到StackOverlow!:)好的,谢谢你。我是编程新手,我只是在测试。我尝试将docx文档转换为xhtml文件,我正在使用本文:虽然它可以工作,但我希望在word2010加载项中实现此功能。问题是,我无法转换当前在word中打开的文档。我不确定您想做的是否可行。请参阅我的最新答案。
Word.Document document = Globals.ThisAddIn.Application.ActiveDocument;     
document.SaveAs2(goldenpath + "\\" + name + "." + id + ".docx");
document.Close();