SVG格式可以直接顯示在網頁上面,用來實現諸如統計Chart圖表、流程圖、組織結構圖的功能。為了使圖像可以下載下來以便於修改,可以將SVG轉為Visio的vsd格式。方法很簡單,主要是使用Visio組件自帶的方法,先打開svg文件,然後另存為vsd文件。調用方法如下:
/// <summary>
/// svg轉vsd
/// </summary>
/// <param name="svgFn">svn文件名</param>
/// <param name="desVsdFn">保存的vsd文件名</param>
private static void Svg2Vsd(string svgFn, string desVsdFn)
{
var app = ComObj.Create("Visio.Application");
app["Visible"] = new ComObj(false);
var docs = app["Documents"];
short visOpenHidden = 64, visOpenRO = 2;
var doc = docs.Call("OpenEx", svgFn, visOpenHidden + visOpenRO);
doc.Call("SaveAs", desVsdFn);
doc.Call("Close");
var win = app["Window"];
app.Call("Quit");
}
這裡用到了一個我自己寫的ComObj類,其作用是為了便於通過反射來調用諸如Office之類的Com組件,並且使調用時的代碼簡潔明了!
為什麼要用反射的方式來動態調用,而不采用直接引用Com組件的方式呢?主要是為了減少程序代碼對Com組件的依賴耦合,從而方便代碼的編譯和發布部署。動態調用的方式,可以不添加組件的引用,就能編譯、運行。如果服務器未安裝這個Com組件,也可以進行直觀的提示,而不是程序出錯。
這個類的代碼如下:
using System;
using System.Reflection;
namespace HZ.Common
{
/// <summary>
/// 用於方便對Com對象的屬性、方法調用
/// </summary>
public class ComObj
{
public static ComObj Create(string progId)
{
var type = Type.GetTypeFromProgID(progId);
if (type == null)
{
throw new Exception("服務器需要安裝" + progId + "才能使用此功能");
}
return new ComObj(Activator.CreateInstance(type));
}
private object _val;
/// <summary>
/// 實際的值
/// </summary>
public object Val
{
get { return _val; }
}
public ComObj(object comObject)
{
_val = comObject;
}
public ComObj Call(string mehtod, params object[] args)
{
if (_val == null)
return null;
var ret = _val.GetType().InvokeMember(mehtod, BindingFlags.InvokeMethod, null, _val, args);
return new ComObj(ret);
}
public ComObj this[string property]
{
get
{
if (_val == null)
return null;
var ret = _val.GetType().InvokeMember(property, BindingFlags.GetProperty, null, _val, null);
return new ComObj(ret);
}
set
{
if (_val != null)
_val.GetType().InvokeMember(property, BindingFlags.SetProperty, null, _val, new object[] { value.Val });
}
}
}
}