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 }); } } } }