我有一個生成 SVG 圖表的應用程式,我們想創建一個匯出到 Visio 選項,理想情況下,該選項將在幕后(通過服務器端 C#)獲取 SVG 檔案并將其直接轉換為 MS Visio .vsdx 檔案用戶可以下載然后在 Visio 中無縫打開和編輯(而不是必須下載 SVG 檔案,然后自己將其匯入 Visio)。實際上,試圖復制 Visio GUI 在后端 C# 中提供的“Open SVG”功能。
我已經看到了很多從 Visio 到 SVG 的答案,但事實恰恰相反。
我也知道 .vsdx 只是一個 zip 檔案,但具有該擴展名。里面是一堆特定于 visio 的檔案和檔案夾 - 如果有人知道這些檔案/檔案夾及其內容的最低要求是什么以及 SVG 適合的位置,也許這??是一種方法。
任何指導將不勝感激。
uj5u.com熱心網友回復:
把這個挖出來,信用/來源:https ://programmer.group/5c650f3227420.html
SVG 可以轉換為 Visio 的 vsd 格式。方法很簡單。主要方法是打開SVG檔案,保存為vsd檔案。呼叫方法如下:
/// <summary>
/// svg turn vsd
/// </summary>
/// <param name="svgFn">svn file name</param>
/// <param name="desVsdFn">Preserved vsd file name</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>
/// For convenience Com Object attributes, method calls
/// </summary>
public class ComObj
{
public static ComObj Create(string progId)
{
var type = Type.GetTypeFromProgID(progId);
if (type == null)
{
throw new Exception("Servers need to be installed" progId "To use this feature");
}
return new ComObj(Activator.CreateInstance(type));
}
private object _val;
/// <summary>
/// Actual value
/// </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 });
}
}
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/492518.html
上一篇:svelte中的動態SVG注入
