SVG格式可以直接显示在网页上面,用来实现诸如统计Chart图表、流程图、组织结构图的功能。为了使图像可以下载下来以便于修改,可以将SVG转为Visio的vsd(x)格式。方法很简单,主要是使用Visio组件自带的方法,先打开svg文件,然后另存为vsd(x)文件。调用方法如下:

  1. /// <summary>
  2. /// svg转vsd
  3. /// </summary>
  4. /// <param name="svgFn">svn文件名</param>
  5. /// <param name="desVsdFn">输出的vsd(x)文件名</param>
  6. private static void Svg2Vsd(string svgFn, string desVsdFn)
  7. {
  8. var app = ComObj.Create("Visio.Application");
  9. try
  10. {
  11. app["Visible"] = new ComObj(false);
  12. var docs = app["Documents"];
  13. short visOpenHidden = , visOpenRO = ;
  14. var doc = docs.Call("OpenEx", svgFn, visOpenHidden + visOpenRO);
  15. doc.Call("SaveAs", desVsdFn);
  16. doc.Call("Close");
  17. }
  18. finally
  19. {
  20. app.Call("Quit");
  21. }
  22. }

这里用到了一个我自己写的ComObj类,其作用是为了便于通过反射来调用诸如Office之类的Com组件,并且使调用时的代码简洁明了!

为什么要用反射的方式来动态调用,而不采用直接引用Com组件的方式呢?主要是为了减少程序代码对Com组件的依赖耦合,从而方便代码的编译和发布部署。动态调用的方式,可以不添加组件的引用,就能编译、运行。如果服务器未安装这个Com组件,也可以进行直观的提示,而不是程序出错。

这个类的代码如下:

  1. using System;
  2. using System.Reflection;
  3.  
  4. namespace HZ.Common
  5. {
  6. /// <summary>
  7. /// 用于方便对Com对象的属性、方法调用
  8. /// </summary>
  9. public class ComObj
  10. {
  11. public static ComObj Create(string progId)
  12. {
  13. var type = Type.GetTypeFromProgID(progId);
  14. if (type == null)
  15. {
  16. throw new Exception("服务器需要安装" + progId + "才能使用此功能");
  17. }
  18. return new ComObj(Activator.CreateInstance(type));
  19. }
  20.  
  21. private object _val;
  22. /// <summary>
  23. /// 实际的值
  24. /// </summary>
  25. public object Val
  26. {
  27. get { return _val; }
  28. }
  29. public ComObj(object comObject)
  30. {
  31. _val = comObject;
  32. }
  33.  
  34. public ComObj Call(string mehtod, params object[] args)
  35. {
  36. if (_val == null)
  37. return null;
  38. var ret = _val.GetType().InvokeMember(mehtod, BindingFlags.InvokeMethod, null, _val, args);
  39. return new ComObj(ret);
  40. }
  41. public ComObj this[string property]
  42. {
  43. get
  44. {
  45. if (_val == null)
  46. return null;
  47. var ret = _val.GetType().InvokeMember(property, BindingFlags.GetProperty, null, _val, null);
  48. return new ComObj(ret);
  49. }
  50. set
  51. {
  52. if (_val != null)
  53. _val.GetType().InvokeMember(property, BindingFlags.SetProperty, null, _val, new object[] { value.Val });
  54. }
  55. }
  56. }
  57. }

SVG格式转Visio的vsd格式方法,附带C#动态调用Office的Com组件方法的更多相关文章

  1. .Net 下采用GET/POST/SOAP方式动态调用WebService的简易灵活方法(C#) [轉]Redfox

    一直以来,我都为动态调用WebService方法而烦恼.在.Net环境下,最常用的方法就是采用代理类来调用WebService,可以通过改变代理类的Url属性来实现动态调用,但当xmlns改变时就会出 ...

  2. Struts2动态调用DMI及错误解决方法

    在Strust2中action可以定义自己的方法,调用方法有两种方式,一种方式是struts.xml中指定method来表示需要用到的方法, 但是这种方法缺点在于如果你的Action中有很多方法则要多 ...

  3. Java父类对象调用子类实体:方法重写与动态调用

    众所周知Java的handle和C++的ponter而不是object对应,我们很熟悉C++的父类pointer调用子类实体的例子,那么对于Java的handle是不是也可以这样呢? 这里我先给一个例 ...

  4. python 动态调用模块、类、方法(django项目)

    需求:近一段时间基于django框架,开发各业务层监控代码,每个业务的监控逻辑不同,因此需要开发监控子模块,动态的导入调用. 项目名称:demo_django App:common_base.moni ...

  5. struts配置通配符*来匹配方法,实现动态调用

    01:web.xml中配置,启动struts2 <?xml version="1.0" encoding="UTF-8"?> <web-app ...

  6. Win2008服务启动不能调用Office Word的解决方法

    本文为大家分享一下如何解决Windows Server 2008 服务启动不能调用Office Word的问题,分享这个教程的原因是,今天在Windows server2008上部署一个应用时发现了一 ...

  7. Date类型之组件方法

    在之前总结了Date类型的继承方法和格式化方法,现在来总结一下日期时间组件方法,这些方法都是直接取得和设置日期值中特定部分的方法. var d = new Date(); //getDate() 从 ...

  8. java基础:方法的定义和调用详细介绍,方法同时获取数组最大值和最小值,比较两个数组,数组交换最大最小值,附练习案列

    1. 方法概述 1.1 方法的概念 方法(method)是将具有独立功能的代码块组织成为一个整体,使其具有特殊功能的代码集 注意: 方法必须先创建才可以使用,该过程成为方法定义 方法创建后并不是直接可 ...

  9. [转]学习 WCF (6)--学习调用WCF服务的各种方法

    转自:http://www.cnblogs.com/gaoweipeng/archive/2009/07/26/1528263.html 作者这篇博文写得很全面. 根据不同的情况,我们可以用不同的方法 ...

随机推荐

  1. 【转】Jqgrid学习之ColModel API

    ColModel 是jqGrid里最重要的一个属性,设置表格列的属性. 属性 数据类型 备注 默认值 align string left, center, right. left classes st ...

  2. mfc---ActiveX控件

    AvtiveX控件可看做是一个极小的服务器应用程序,不能独立运行,必须嵌入到某个容器程序中 容器应用程序:可以嵌入或链接对象的应用程序 服务器应用程序:创建对象并且当对象被双击时,可以被启动的应用程序 ...

  3. connect函数的用法

    无论流式套接字(如TCP)还是数据报(如UDP),均可以使用connect函数.对于流式套接字,使用connect函数后,建立固定地址的连接,之后可以使用send/rev函数进行数据收发.对于数据报, ...

  4. Struts文件下载

    /* 文件下载的先决条件 * 1. 在xml配置文件中必须配置一个type="stream"的result, result中不需要填写任何内容 * 2. 在Action中编写一个接 ...

  5. Delete Node in a Linked List leetcode

    Write a function to delete a node (except the tail) in a singly linked list, given only access to th ...

  6. 九度oj1163题

    题目描述: 输入一个整数n(2<=n<=10000),要求输出所有从1到这个整数之间(不包括1和这个整数)个位为1的素数,如果没有则输出-1. 输入: 输入有多组数据. 每组一行,输入n. ...

  7. python 语法笔记(一)

    #python3里面input默认接收到的事str类型,而python2里面却认为是int类型n=int(input('请输入想要第几个数')) #如果将int省去,python3中该程序将会报错a, ...

  8. 你真的会 snapshot 吗? - 每天5分钟玩转 OpenStack(163)

    ​这是 OpenStack 实施经验分享系列的第 13 篇. instance snapshot 操作可用于备份或者将 instance 保存为新的 image.如果在生产系统中执行 snapshot ...

  9. poolingHttpclientConnectionmanager 使用

    在阅读 netflix zuul 的simpleHostRoutingFilter 中,发现了一些问题. 主要是关于poolingHttpclientConnectionmanager. 在寻找其中的 ...

  10. solr home 目录设置

    对于在tomcat 中部署solr 来说,有以下三处可以配置 solr.solr.home(即solr的数据文件位置): 1. 在解压缩solr.war后的webapps/solr 中的WEB-INF ...