【发布时间】:2017-03-10 11:06:50
【问题描述】:
我想要完成的事情:
我想将我的 Visio 应用程序中的活动页面复制到一个新文档并保存(并将其设置为数据库的 byte[]),我已经这样做了,但方式有点“错误”,因为交互太多使用 Visio 应用程序。
将页面复制到字节数组的方法:
private static byte[] VisioPageToBytes()
{
//Make a new invisible app to dump the shapes in
var app = new InvisibleApp();
Page page = MainForm.IVisioApplication.ActivePage;
app.AlertResponse = 2;
//Selact all shapes and copy, then deselect
MainForm.IVisioApplication.ActiveWindow.SelectAll();
MainForm.IVisioApplication.ActiveWindow.Selection.Copy();
MainForm.IVisioApplication.ActiveWindow.DeselectAll();
//Add empty document to invisible app and dump shapes
app.Documents.Add( string.Empty );
app.ActivePage.Paste();
//Save document and convert to byte[]
app.ActiveDocument.SaveAs( Application.UserAppDataPath + @"/LastStored.vsd" );
app.ActiveDocument.Close();
app.Quit();
app.AlertResponse = 0;
var bytes = File.ReadAllBytes( Application.UserAppDataPath + @"/LastStored.vsd" );
Clipboard.Clear();
return bytes;
}
为什么会出错:
此代码在 visio 页面中进行选择,并且必须打开一个不可见的窗口来存储页面。我正在寻找一种与 Visio 应用程序交互较少的方法(因为它不稳定)。打开第二个(不可见的)Visio 应用程序有时会使我的主 Visio 应用程序崩溃。
我想做类似的事情:
Page page = MainForm.IVisioApplication.ActivePage;
Document doc;
doc.Pages.Add( page ); //Pages.Add has no parameters so this doesn't work
doc.SaveAs(Application.UserAppDataPath + @"/LastStored.vsd");
如果以较少交互的方式(通过“构建”文档)无法做到这一点,请发表评论让我知道。
TL;DR;
我不想在不打开 Visio 的情况下制作新的 Visio 文档并将 1 页(的内容)复制到其中。
【问题讨论】:
-
您是在表单还是独立应用程序中使用 Visio 绘图控件?如果是前者,那么控件一次只允许打开一个文档。另外,您是否有理由不想只保存为然后删除其他页面?
-
不是绘图控件,是应用程序。如果你看代码你可以看到我做了一个不可见的应用程序,这不能用绘图控件来完成
-
@JohnGoldsmith 我正在处理(存储)每个页面上的数据,之后我们想在数据库中保留该页面的副本,因此我将其存储并保存到数据库中作为字节数组。如果我可以复制文档并删除页面而不在 visio 应用程序帖子中打开它们作为答案请:)
标签: c# office-interop visio