问题
My DLL library code is as follows:
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);
}
}
}
}
However, this code opens the Visio editor and then displays the number of pages in the document.
Is it possible to read this file content without opening the Visio?
回答1:
If you make the application invisible, you will not see the new instance of Visio opening (there will still be a instance of Visio running, just not a visible one)
Application application = new Application();
application.Visible = false;
Document doc = application.Documents.Add(this.path);
Console.WriteLine("Number of pages: " + doc.Pages.Count);
回答2:
This is the program for how to read shape properties in 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);
}
}
}
}
The above example assumes that you have the Visio Primary Interop Assembly installed on you PC and that you have included a referee to Microsoft.Office.Interop.Visio in your project.
I hope this will helps you ....
回答3:
Take a look at How to get shape data information on Visio with C#. It contains some useful information regarding your scenario
This post also explains how to get all shapes and additionally how to connect all shapes togather
回答4:
As one of the other answers points out you can use the Application.Visible property to hide the running instance of Visio.
Another option for you is to read the Visio's VDX file format directly to retrieve the number of pages, custom properties, etc. This avoids have to start Visio to read information from the file. But this solution does require you to become the VDX's files XML schema.
回答5:
As one of the other answers points out you can use the Application.Visible property to hide the running instance of Visio.
Another option for you is to read the Visio's VDX file format directly to retrieve the number of pages, custom properties, etc. This avoids have to start Visio to read information from the file. But this solution does require you to become the VDX's files XML schema.
来源:https://stackoverflow.com/questions/7780002/how-to-read-visio-document-content-in-c-sharp