程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> .NET網頁編程 >> C# >> C#入門知識 >> SVG格式轉Visio的vsd格式方法,附帶C#動態調用Office的Com組件方法,

SVG格式轉Visio的vsd格式方法,附帶C#動態調用Office的Com組件方法,

編輯:C#入門知識

SVG格式轉Visio的vsd格式方法,附帶C#動態調用Office的Com組件方法,


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

 

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved