我的DLL库代码现在看起来像这样:
using System;
using IVisio=Microsoft.Office.Interop.Visio;
namespace Emix
{
public class Visio
{
protected String path;
public Visio(String path)
{
this.path = path;
}
public void open()
{
try
{
IVisio.Document doc = new IVisio.Application().Documents.Add(this.path);
Console.WriteLine("Number of pages: " + doc.Pages.Count);
}
catch (Exception e)
{
Console.WriteLine(e.Message);
}
}
}
}
但是,此代码将打开Visio编辑器,然后显示文档中的页数。是否可以在不打开Visio的情况下读取此文件内容?
答案 0 :(得分:1)
这是如何在visio中读取形状属性的程序....
namespace VisioEventsExample
{
using System;
using Microsoft.Office.Interop.Visio;
class Program
{
public static void Main(string[] args)
{
// Open up one of Visio's sample drawings.
Application app = new Application();
Document doc = app.Documents.Open(
@"C:\Program Files\Microsoft Office\Office14\visio content\1033\ASTMGT_U.VST");
// Get the first page in the sample drawing.
Page page = doc.Pages[1];
// Start with the collection of shapes on the page and
// print the properties we find,
printProperties(page.Shapes);
}
/* This function will travel recursively through a collection of
* shapes and print the custom properties in each shape.
*
* The reason I don't simply look at the shapes in Page.Shapes is
* that when you use the Group command the shapes you group become
* child shapes of the group shape and are no longer one of the
* items in Page.Shapes.
*
* This function will not recursive into shapes which have a Master.
* This means that shapes which were created by dropping from stencils
* will have their properties printed but properties of child shapes
* inside them will be ignored. I do this because such properties are
* not typically shown to the user and are often used to implement
* features of the shapes such as data graphics.
*
* An alternative halting condition for the recursion which may be
* sensible sense for many drawing types would be to stop when you
* find a shape with custom properties.
*/
public static void printProperties(Shapes shapes)
{
// Look at each shape in the collection.
foreach (Shape shape in shapes)
{
// Use this index to look at each row in the properties
// section.
short iRow = (short) VisRowIndices.visRowFirst;
// While there are stil rows to look at.
while (shape.get_CellsSRCExists(
(short) VisSectionIndices.visSectionProp,
iRow,
(short) VisCellIndices.visCustPropsValue,
(short) 0) != 0)
{
// Get the label and value of the current property.
string label = shape.get_CellsSRC(
(short) VisSectionIndices.visSectionProp,
iRow,
(short) VisCellIndices.visCustPropsLabel
).get_ResultStr(VisUnitCodes.visNoCast);
string value = shape.get_CellsSRC(
(short) VisSectionIndices.visSectionProp,
iRow,
(short) VisCellIndices.visCustPropsValue
).get_ResultStr(VisUnitCodes.visNoCast);
// Print the results.
Console.WriteLine(string.Format(
"Shape={0} Label={1} Value={2}",
shape.Name, label, value));
// Move to the next row in the properties section.
iRow++;
}
// Now look at child shapes in the collection.
if (shape.Master == null && shape.Shapes.Count > 0)
printProperties(shape.Shapes);
}
}
}
}
上面的示例假设您在PC上安装了Visio Primary Interop Assembly,并且您已将裁判包含在项目中的Microsoft.Office.Interop.Visio中。
我希望这会对你有帮助....
答案 1 :(得分:0)
看看How to get shape data information on Visio with C#。它包含一些有关您的方案的有用信息
This帖子还解释了如何获取所有形状以及如何连接所有形状以收集
答案 2 :(得分:0)
如果您使应用程序不可见,您将看不到Visio的新实例打开(仍然会有一个Visio实例正在运行,而不是一个可见的实例)
Application application = new Application();
application.Visible = false;
Document doc = application.Documents.Add(this.path);
Console.WriteLine("Number of pages: " + doc.Pages.Count);
答案 3 :(得分:0)
正如其他答案之一所指出的那样,您可以使用Application.Visible属性来隐藏正在运行的Visio实例。
另一个选项是直接读取Visio的VDX文件格式以检索页面数,自定义属性等。这避免了必须启动Visio才能从文件中读取信息。但是这个解决方案确实要求你成为VDX的文件XML模式。
答案 4 :(得分:0)
正如其他答案之一所指出的那样,您可以使用Application.Visible属性来隐藏正在运行的Visio实例。
另一个选项是直接读取Visio的VDX文件格式以检索页面数,自定义属性等。这避免了必须启动Visio才能从文件中读取信息。但是这个解决方案确实要求你成为VDX的文件XML模式。