C# VSTO:如何将互操作文档(带有自定义部件和元数据)保存到内存中

C# VSTO:如何将互操作文档(带有自定义部件和元数据)保存到内存中,c#,ms-word,vsto,word-2010,C#,Ms Word,Vsto,Word 2010,为了创建一些自定义元数据并将用户在word文档中的操作备份到服务器/数据库,我创建了一个VSTO应用程序级加载项,并使用DocumentBeforeSave事件劫持word的默认保存功能 我想将当前文档转换为二进制blob或完整的openXML表示,其中包含文档、自定义xml部分以及从服务器副本无缝打开同一文档所需的所有数据。因此,我不仅需要添加任何自定义XML部分,还需要有关更改跟踪和保存在文档中的其他元数据的信息。因此,我的想法是简单地抓取创建的已保存blob: private void T

为了创建一些自定义元数据并将用户在word文档中的操作备份到服务器/数据库,我创建了一个VSTO应用程序级加载项,并使用
DocumentBeforeSave
事件劫持word的默认保存功能

我想将当前文档转换为二进制blob或完整的openXML表示,其中包含文档、自定义xml部分以及从服务器副本无缝打开同一文档所需的所有数据。因此,我不仅需要添加任何自定义XML部分,还需要有关更改跟踪和保存在文档中的其他元数据的信息。因此,我的想法是简单地抓取创建的已保存blob:

private void ThisAddIn_Startup(object sender, EventArgs e)
{
    Application.DocumentBeforeSave += application_DocumentBeforeSave;
}

private void application_DocumentBeforeSave(Document doc, ref bool saveAsUI, ref bool cancel)
{
    // generate some xml
    string customPart = @"<foo>some xml here</foo>";

    Office.CustomXMLPart rangeListXmlPart = doc.CustomXMLParts.Add(customPart, missing);

    // suppress default save functionality           
    saveAsUI = false;
    cancel = true;

    // manually generate save dialog
    Dialog dlg = Application.Dialogs[WdWordDialog.wdDialogFileSaveAs]
    object oDlg = dlg;
    object[] oArgs = new object[1];
    oArgs[0] = @"C:\";
    oDlg.GetType().InvokeMember("Name", BindingFlags.SetProperty, null, dlg, oArgs);
    dlg.Show(ref missing);

    // read in file blob
    byte[] data = null;

    FileInfo fileDetails = new FileInfo(doc.FullName);
    long fileSize = fileDetails.Length;

    FileStream fStream = new FileStream(path, FileMode.Open, FileAccess.Read);

    BinaryReader bReader = new BinaryReader(fStream);
    data = bReader.ReadBytes((int) fileSize);

    // send data up to the server, along with the file type
}
private void ThisAddIn\u启动(对象发送方,事件参数e)
{
Application.DocumentBeforeSave+=应用程序\u DocumentBeforeSave;
}
私有作废应用程序\u DocumentBeforeSave(Document doc,ref bool saveAsUI,ref bool cancel)
{
//生成一些xml
字符串customPart=@“此处有一些xml”;
Office.CustomXMLPart rangeListXmlPart=doc.CustomXMLParts.Add(customPart,缺少);
//抑制默认保存功能
saveAsUI=false;
取消=真;
//手动生成保存对话框
Dialog dlg=应用程序.Dialogs[WdWordDialog.wdDialogFileSaveAs]
对象oDlg=dlg;
object[]oars=新对象[1];
桨[0]=“C:\”;
oDlg.GetType().InvokeMember(“名称”,BindingFlags.SetProperty,null,dlg,oArgs);
dlg.显示(参考缺失);
//读入文件blob
字节[]数据=null;
FileInfo fileDetails=新文件信息(doc.FullName);
long fileSize=fileDetails.Length;
FileStream fStream=newfilestream(路径,FileMode.Open,FileAccess.Read);
BinaryReader bReader=新的BinaryReader(fStream);
data=bReader.ReadBytes((int)文件大小);
//将数据连同文件类型一起发送到服务器
}

。。。但必须有一个更优雅的解决方案来解决这个问题,它不需要将文档保存到磁盘上,然后再将其读回内存,因为这种方法本身就有缺陷:文档保存可能会发生很多次,并且不希望从硬盘驱动器多次读取。如果在其他时间实现此功能而不将文档保存到磁盘,也会很有帮助!任何想法都将不胜感激。

从文档或范围中获取
WordOpenXML
属性(它包含文档的平面OPC格式),然后将其转换为DocX包,如中所示


结果应该相当于另存为DocX,但可以完全在内存中完成。

从文档或范围中获取
WordOpenXML
属性(它包含文档的平面OPC格式),然后将其转换为DocX包,如中所示


结果应该相当于另存为DocX,但可以完全在内存中完成。

从文档或范围中获取
WordOpenXML
属性(它包含文档的平面OPC格式),然后将其转换为DocX包,如中所示


结果应该相当于另存为DocX,但可以完全在内存中完成。

从文档或范围中获取
WordOpenXML
属性(它包含文档的平面OPC格式),然后将其转换为DocX包,如中所示


结果应该相当于另存为DocX,但可以完全在内存中完成。

这正是我想要的。在链接处使用代码,并将其写入MemoryStream而不是输出路径,效果非常好。谢谢这正是我想要的。在链接处使用代码,并将其写入MemoryStream而不是输出路径,效果非常好。谢谢这正是我想要的。在链接处使用代码,并将其写入MemoryStream而不是输出路径,效果非常好。谢谢这正是我想要的。在链接处使用代码,并将其写入MemoryStream而不是输出路径,效果非常好。谢谢