将 visio 页面复制到新文档
Copy a visio page to a new document
我想完成的事情:
我想将我的 Visio 应用程序中的活动页面复制到一个新文档并保存它(并使它成为数据库的 byte[]
),我已经在这样做了,但是以稍微 "wrong" 的方式与 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 页面中进行选择,并且必须打开一个不可见的 window 来存储页面。我正在寻找一种与 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");
如果交互较少(通过 "building" 文档)无法做到这一点,请发表评论让我知道。
TL;DR;
我不想在不打开 Visio 并将 1 页(的内容)复制到其中的情况下制作新的 Visio 文档。
如果你想创建一个副本页面,那么你可能会发现页面上的 Duplicate 方法很方便,但从它的声音来看,只需保存现有文档就可以了:
void Main()
{
var vApp = MyExtensions.GetRunningVisio();
var sourcePage = vApp.ActivePage;
var sourcePageNameU = sourcePage.NameU;
var vDoc = sourcePage.Document;
vDoc.Save(); //to retain original
var origFileName = vDoc.FullName;
var newFileName = Path.Combine(vDoc.Path, $"LastStored{Path.GetExtension(origFileName)}");
vDoc.SaveAs(newFileName);
//Remove all other pages
for (short i = vDoc.Pages.Count; i > 0; i--)
{
if (vDoc.Pages[i].NameU != sourcePageNameU)
{
vDoc.Pages[i].Delete(0);
}
}
//Save single page state
vDoc.Save();
//Close copy and reopen original
vDoc.Close();
vDoc = vApp.Documents.Open(origFileName);
}
GetRunningVisio
是我使用 LinqPad 的扩展方法:
http://visualsignals.typepad.co.uk/vislog/2015/12/getting-started-with-c-in-linqpad-with-visio.html
...但是您已经获得了对您的应用的引用,因此您可以改用它。
根据评论更新:
好的,那么对您的原始代码进行此修改怎么样?请注意,我正在从页面创建一个新的 Selection 对象,但没有更改 Window 对象,因此这不会干扰用户看到的内容或根本不会更改源文档。
void Main()
{
var vApp = MyExtensions.GetRunningVisio();
var sourcePage = vApp.ActivePage;
var sourceDoc = sourcePage.Document;
var vSel = sourcePage.CreateSelection(Visio.VisSelectionTypes.visSelTypeAll);
vSel.Copy(Visio.VisCutCopyPasteCodes.visCopyPasteNoTranslate);
var copyDoc = vApp.Documents.AddEx(string.Empty,
Visio.VisMeasurementSystem.visMSDefault,
(int)Visio.VisOpenSaveArgs.visAddHidden);
copyDoc.Pages[1].Paste(Visio.VisCutCopyPasteCodes.visCopyPasteNoTranslate);
var origFileName = sourceDoc.FullName;
var newFileName = Path.Combine(sourceDoc.Path, $"LastStored{Path.GetExtension(origFileName)}");
copyDoc.SaveAs(newFileName);
copyDoc.Close();
}
请注意,这只会创建一个默认页面,因此您可能希望在粘贴之前复制页面单元格,例如 PageWidth、PageHeight、PageScale 和 DrawingScale 等。
我想完成的事情:
我想将我的 Visio 应用程序中的活动页面复制到一个新文档并保存它(并使它成为数据库的 byte[]
),我已经在这样做了,但是以稍微 "wrong" 的方式与 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 页面中进行选择,并且必须打开一个不可见的 window 来存储页面。我正在寻找一种与 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");
如果交互较少(通过 "building" 文档)无法做到这一点,请发表评论让我知道。
TL;DR;
我不想在不打开 Visio 并将 1 页(的内容)复制到其中的情况下制作新的 Visio 文档。
如果你想创建一个副本页面,那么你可能会发现页面上的 Duplicate 方法很方便,但从它的声音来看,只需保存现有文档就可以了:
void Main()
{
var vApp = MyExtensions.GetRunningVisio();
var sourcePage = vApp.ActivePage;
var sourcePageNameU = sourcePage.NameU;
var vDoc = sourcePage.Document;
vDoc.Save(); //to retain original
var origFileName = vDoc.FullName;
var newFileName = Path.Combine(vDoc.Path, $"LastStored{Path.GetExtension(origFileName)}");
vDoc.SaveAs(newFileName);
//Remove all other pages
for (short i = vDoc.Pages.Count; i > 0; i--)
{
if (vDoc.Pages[i].NameU != sourcePageNameU)
{
vDoc.Pages[i].Delete(0);
}
}
//Save single page state
vDoc.Save();
//Close copy and reopen original
vDoc.Close();
vDoc = vApp.Documents.Open(origFileName);
}
GetRunningVisio
是我使用 LinqPad 的扩展方法:
http://visualsignals.typepad.co.uk/vislog/2015/12/getting-started-with-c-in-linqpad-with-visio.html
...但是您已经获得了对您的应用的引用,因此您可以改用它。
根据评论更新:
好的,那么对您的原始代码进行此修改怎么样?请注意,我正在从页面创建一个新的 Selection 对象,但没有更改 Window 对象,因此这不会干扰用户看到的内容或根本不会更改源文档。
void Main()
{
var vApp = MyExtensions.GetRunningVisio();
var sourcePage = vApp.ActivePage;
var sourceDoc = sourcePage.Document;
var vSel = sourcePage.CreateSelection(Visio.VisSelectionTypes.visSelTypeAll);
vSel.Copy(Visio.VisCutCopyPasteCodes.visCopyPasteNoTranslate);
var copyDoc = vApp.Documents.AddEx(string.Empty,
Visio.VisMeasurementSystem.visMSDefault,
(int)Visio.VisOpenSaveArgs.visAddHidden);
copyDoc.Pages[1].Paste(Visio.VisCutCopyPasteCodes.visCopyPasteNoTranslate);
var origFileName = sourceDoc.FullName;
var newFileName = Path.Combine(sourceDoc.Path, $"LastStored{Path.GetExtension(origFileName)}");
copyDoc.SaveAs(newFileName);
copyDoc.Close();
}
请注意,这只会创建一个默认页面,因此您可能希望在粘贴之前复制页面单元格,例如 PageWidth、PageHeight、PageScale 和 DrawingScale 等。