VSTO:如何将互操作文档(带有自定义部件和元数据)保存到内存中
VSTO: how to save an interop doc (with custom parts and metadata) to memory
为了创建一些自定义元数据并将用户在 word 文档中所做的事情备份到 server/database,我创建了一个 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
}
...但是必须有一个更优雅的解决方案来解决这个问题,不需要将文档保存到磁盘,然后将其读回内存,因为这种方法存在固有缺陷:文档保存可能会发生很多次,多次从硬盘读取是不可取的。在其他时间实现此功能而根本不将文档保存到磁盘也会很有帮助!任何想法将不胜感激。
从文档或范围中获取 WordOpenXML
属性(它包含文档的平面 OPC 格式),然后将其转换为 DocX 包,如 http://blogs.msdn.com/b/ericwhite/archive/2008/09/29/transforming-flat-opc-format-to-open-xml-documents.aspx 所示。
结果应该等同于保存为 DocX,但可以完全在内存中完成。
为了创建一些自定义元数据并将用户在 word 文档中所做的事情备份到 server/database,我创建了一个 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
}
...但是必须有一个更优雅的解决方案来解决这个问题,不需要将文档保存到磁盘,然后将其读回内存,因为这种方法存在固有缺陷:文档保存可能会发生很多次,多次从硬盘读取是不可取的。在其他时间实现此功能而根本不将文档保存到磁盘也会很有帮助!任何想法将不胜感激。
从文档或范围中获取 WordOpenXML
属性(它包含文档的平面 OPC 格式),然后将其转换为 DocX 包,如 http://blogs.msdn.com/b/ericwhite/archive/2008/09/29/transforming-flat-opc-format-to-open-xml-documents.aspx 所示。
结果应该等同于保存为 DocX,但可以完全在内存中完成。