如何在C#中阅读Visio文档内容

我的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的情况下读取此文件内容?

这是如何在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程序集,并且已在项目中包含了Microsoft.Office.Interop.Visio的裁判。

我希望这会对你有所帮助….

看看如何使用C#获取Visio上的形状数据信息 。 它包含有关您的方案的一些有用信息

这篇文章还解释了如何获得所有形状以及如何连接所有形状以收集

如果您使应用程序不可见,您将看不到Visio的新实例打开(仍然会有一个Visio实例正在运行,而不是一个可见的实例)

 Application application = new Application(); application.Visible = false; Document doc = application.Documents.Add(this.path); Console.WriteLine("Number of pages: " + doc.Pages.Count); 

正如其他答案之一所指出的那样,您可以使用Application.Visible属性来隐藏正在运行的Visio实例。

另一个选择是直接读取Visio的VDX文件格式以检索页面数,自定义属性等。这避免了必须启动Visio才能从文件中读取信息。 但是这个解决方案确实要求您成为VDX的文件XML架构。

正如其他答案之一所指出的那样,您可以使用Application.Visible属性来隐藏正在运行的Visio实例。

另一个选择是直接读取Visio的VDX文件格式以检索页面数,自定义属性等。这避免了必须启动Visio才能从文件中读取信息。 但是这个解决方案确实要求您成为VDX的文件XML架构。