背景: 在实现应用开发中, 存在这样一种需求, 在一张图中动态显示图中图元的数据并控制图元的显示方式。比如一张电气接线图, 需要动态显示各个开关的状态及各个电气设备的参数。
问题: 如何以Web方式满足这样一个需求?
解决方案: 用Visio绘制图形, 在ASP.NET中调用Visio提供的编程接口去控制Visio图中的图元,并转换成Web上可以显示的图像格式。对于每个要动态显示数据的图形, 定义一个自定义属性标识它,比如:TagNum, 然后在程序中根据TagNum的值从数据库中读取数据来设置相应图形的数据。
需要添加对Microsoft Visio 11.0 Type Library的引用(COM组件)。代码如下:
using
Microsoft.Office.Interop.Visio;
private void Button1_Click( object sender, System.EventArgs e)
{
Document doc = null ;
Cell cell = null ;
ApplicationClass app = new ApplicationClass(); // 运行Visio应用程序
string CurrentPath = MapPath( " . " );
doc = app.Documents.OpenEx(CurrentPath + " /bin/test2.vsd " ,( short )Microsoft.Office.Interop.Visio.VisOpenSaveArgs.visOpenCopy); // 打开一个visio文件
const string CUST_PROP_PREFIX = " Prop. " ; // 自定义属性前缀
try
{
for ( int i = 1 ;i <= doc.Pages[ 1 ].Shapes.Count;i ++ )
{
doc.Pages[ 1 ].Shapes[i].Rotate90(); // 将图形旋转90度
doc.Pages[ 1 ].Shapes[i].Text = " hello " ; // 设置图形的文本
if (doc.Pages[ 1 ].Shapes[i].get_CellExists( " TagNum " ,( short )Microsoft.Office.Interop.Visio.VisExistsFlags.visExistsAnywhere) != 0 ) // 检查定制是否存在指定定制属性
{
doc.Pages[ 1 ].Shapes[i].Text = data; // 在此处显示图形数据
}
}
doc.Saved = true ; // 告诉Visio应用程序该文件已保存, 不然Visio要出现是否要保存的对话框,实际上并未保存,因为我们不想对源文件作修改,只是修改过后显示一下就行了。
doc.Pages [ 1 ].Export(CurrentPath + " /test.jpg " ); // 转换成jpg格式的文件
}
finally
{
doc.Close(); // 关闭打开的文件
app.Quit(); // 退出Visio应用程序
}
}
private void Button1_Click( object sender, System.EventArgs e)
{
Document doc = null ;
Cell cell = null ;
ApplicationClass app = new ApplicationClass(); // 运行Visio应用程序
string CurrentPath = MapPath( " . " );
doc = app.Documents.OpenEx(CurrentPath + " /bin/test2.vsd " ,( short )Microsoft.Office.Interop.Visio.VisOpenSaveArgs.visOpenCopy); // 打开一个visio文件
const string CUST_PROP_PREFIX = " Prop. " ; // 自定义属性前缀
try
{
for ( int i = 1 ;i <= doc.Pages[ 1 ].Shapes.Count;i ++ )
{
doc.Pages[ 1 ].Shapes[i].Rotate90(); // 将图形旋转90度
doc.Pages[ 1 ].Shapes[i].Text = " hello " ; // 设置图形的文本
if (doc.Pages[ 1 ].Shapes[i].get_CellExists( " TagNum " ,( short )Microsoft.Office.Interop.Visio.VisExistsFlags.visExistsAnywhere) != 0 ) // 检查定制是否存在指定定制属性
{
doc.Pages[ 1 ].Shapes[i].Text = data; // 在此处显示图形数据
}
}
doc.Saved = true ; // 告诉Visio应用程序该文件已保存, 不然Visio要出现是否要保存的对话框,实际上并未保存,因为我们不想对源文件作修改,只是修改过后显示一下就行了。
doc.Pages [ 1 ].Export(CurrentPath + " /test.jpg " ); // 转换成jpg格式的文件
}
finally
{
doc.Close(); // 关闭打开的文件
app.Quit(); // 退出Visio应用程序
}
}