com4j學習(1):Java操作Visio之Java讀取Visio圖形關係並存儲到XML檔案中
前言:
MicroSoft Visio是微軟旗下一款非常非常出色的繪圖軟體,可以用來繪製各種各樣的圖形(如流程圖、UML、工程圖等)。現在有這樣一個需求,我們想讀取visio中的圖形的形狀、屬性、連線關係等到程式中(java、c++、python都行),這樣我們就可以將Visio中的圖形之間存在的關係以其他的形式(XML、JSON等)進行儲存。這樣一來,就擴充套件了Visio的功能,不僅能得到圖形檔案,還能得到XML等其他資料儲存格式。本文采用Java的com4j庫來實現我們的需求。
並且你要學會如何自定義圖形,參考部落格:如何自定義形狀
正文:
現在我們一步一步搭建開發環境。
一、安裝JDK,Eclipse這些必要工具。本文不再贅述。
二、安裝Visio,本文使用的是2013版本。
四、上面下載了必要的開發工具後,接下來一步很重要,使用com4j生成visio介面(即需要和本地visio繫結)
4.1 解壓第三步下載的com4j包,將args4j-2.0.1.jar,tlbimp.jar,com4j.jar放到本機JDK的bin目錄下。
4.2 安裝好Visio後找到VISLIB.DLL檔案路徑,例如:D:\software\visio2013\VISLIB.DLL
4.3 cmd進入JDK安裝bin目錄,執行以下命令:
java -jar tlbimp.jar -o visio -p VisioTool "D:\software\visio2013\VISLIB.DLL"
執行之後在JDK的bin目錄出現一個名為visio的資料夾。這是一套操作visio的類庫。
4.5 將4.3中的visio資料夾和4.1的3個jar檔案和4.4中的dom4j檔案,匯入到我們的java工程中,就可以開始程式設計了。
五、來看一個例項,先在visio中隨便畫一個圖,然後執行下面程式碼,注意:執行程式碼的時候要關閉visio。
package com.jimmy.test;
import java.io.FileWriter;
import java.io.IOException;
import org.dom4j.Document;
import org.dom 4j.DocumentHelper;
import org.dom4j.Element;
import org.dom4j.io.XMLWriter;
import VisioTool.*;
public class TestMain {
public static void main(String[] args) {
// TODO Auto-generated method stub
String filePath = "D:\\JavaProject\\Test1\\input3.vsdx";
String outputDir = filePath + ".output";
// 建立Visio物件
IVApplication app = ClassFactory.createApplication();
// Visio物件設定為可見
app.visible(true);
// 開啟一個Visio檔案
IVDocument doc = app.documents().open(filePath);
// 建立一個Dom4j型別的Document物件
Document xmlDoc = DocumentHelper.createDocument();
Element root = xmlDoc.addElement("page");
try {
// 只讀取Visio文件中第一個頁面的資訊
IVPage page = doc.pages().itemFromID(0);
// 讀取Page物件的長和寬,並轉化為畫素單位(乘以96)
root.addAttribute("寬:", "" + ((int) (page.pageSheet().cells("PageWidth").resultIU() * 96)));
root.addAttribute("高:", "" + ((int) (page.pageSheet().cells("PageHeight").resultIU() * 96)));
IVShapes shapes = page.shapes();
System.out.println("shapes=" + shapes.count());
// 遍歷該Page物件中所有的Shape物件
for (int shapeCount = 1; shapeCount <= shapes.count(); shapeCount++) {
IVShape shape = shapes.itemU(shapeCount);
String shapeId = shape.text();
System.out.println("shapeName=" + shape.name());
System.out.println("PinX=" + shape.cells("PinX").resultIU() * 25.4);
// System.out.println("自定義屬性="+shape.cellsU("Prop.equ").result(new String()));
// 找出被我們事先標識了的Shape物件進行進一步處理
if (shapeId.length() > 0) {
// 在page元素下面新建一個shape元素
Element shapeElement = root.addElement("shape");
// 為shape元素新增id,height,width,x,y等屬性
shapeElement.addAttribute("id", shapeId);
shapeElement.addAttribute("height", "" + ((int) (shape.cells("Height").resultIU() * 96)));
shapeElement.addAttribute("width", "" + ((int) (shape.cells("Width").resultIU() * 96)));
shapeElement.addAttribute("x", "" + ((int) (shape.cells("PinX").resultIU() * 96)));
shapeElement.addAttribute("y", "" + ((int) (shape.cells("PinY").resultIU() * 96)));
shape.text("");
shape.export(outputDir + "\\" + shapeId + ".gif");
}
}
doc.saved(true);
} finally {
doc.close();// 關閉開啟的檔案
app.quit();// 退出Visio應用程式
}
try {
// lets write to a file
XMLWriter writer = new XMLWriter(new FileWriter("output.xml"));
writer.write(xmlDoc);
writer.close();
} catch (IOException e) {
}
}
}
總結:
至此,我們已經搭建起com4j的java開發visio的環境,接下來會慢慢深入visio圖形的屬性。
相關推薦
com4j學習(1):Java操作Visio之Java讀取Visio圖形關係並存儲到XML檔案中
前言: MicroSoft Visio是微軟旗下一款非常非常出色的繪圖軟體,可以用來繪製各種各樣的圖形(如流程圖、UML、工程圖等)。現在有這樣一個需求,我們想讀取visio中的圖形的形狀、屬性、連線關係等到程式中(java、c++、python都行),這樣我
git操作總結(1):常用操作流程之SSH、上傳、下載和改名字
一、配置SSH免金鑰登陸 1.生成金鑰 直接回車3-5次 ssh-keygen -t rsa -C "這裡換上你的郵箱" 2.在指定的儲存路徑下會生成2個名為id_rsa和id_rsa.pub的檔案 3.將id_rsa.pub檔案,把內容拷貝到Git的SSH金鑰配置上 4.g
Java虛擬機器學習(1):體系結構 記憶體模型
JVM記憶體區域模型 1.方法區 也稱”永久代” 、“非堆”, 它用於儲存虛擬機器載入的類資訊、常量、靜態變數、是各個執行緒共享的記憶體區域。預設最小值為16MB,最大值為64MB,可以通過-XX:PermSize 和 -XX:MaxPermSize 引數限制方法區的大小。
java演算法知識點解析(1):字串操作
import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.Scanner; public class main { static
ArcGIS API for JavaScript學習(1):第一個地圖
樣式表 參數 資源 charset 底層 arcgis 順序 api navi 1.簡介 ArcGIS API for JavaScript跟隨ArcGIS 9.3同時發布,是ESRI根據JavaScript技術實現的調用ArcGIS Server REST API接口的一
facets學習(1):什麽是facets
遺失 air 不同的 無縫切換 over 快速 後來 樣式 觀察 ML 數據集可以包含數億個數據點,每個數據點由數百(甚至數千)的特征組成,幾乎不可能以直觀的方式了解整個數據集。為幫助理解、分析和調試 ML 數據集,谷歌開源了 Facets,一款可視化工具。 Facets
C++學習(1):最大子段和(多種解法)
多少 問題: code namespace 數據 組成 amp using () 問題:給定由n個數(可能為負數)組成的序列a1,a2,a3,...,an,求該序列子段和的最大值。 第一種解法:(最容易考慮的方法,將所有的子段一一相加,然後比較) 1 #include&
Netty學習(1):Channel的概念
1. Channel Channel是Netty的核心概念之一,它是Netty網路通訊的主體,由它負責同對端進行網路通訊、註冊和資料操作等功能。 1.1 工作原理 如上圖所示: 一旦使用者端連線成功,將新建一個channel同該使用者端進行繫結 channel從EventL
ADB 學習(1):adb devices 命令
一、前言 關於環境搭建問題,這裡就不在寫了,之前在上一篇 monkey 環境搭建中,寫的也比較詳細,點選傳送門 因為monkey這個工具在執行時就是通過adb這個命令來與我們的
Jenkins 學習(1):Windows系統下安裝
一、jenkins是什麼? 還是小白,先放個連結:https://blog.csdn.net/ios_xumin/article/details/78125913 二、下載jenkins &nbs
three.js學習(1):
1.three.js是: three.js是用JavaScript編寫的WebGL第三方庫。官網(www.threejs.org) 2.three.js功能: three.js 是一款執行在瀏覽器中的 3D 引擎,你可以用它建立各種三維場景,包括了攝影機、光影、材質等各種物件。 3.thre
C#程式設計學習(04):基本操作學習總結
一、對話方塊窗體的設計 (1)修改exe圖示:專案-->右鍵-->屬性-->應用程式-->圖示和清單-->圖示,選擇要新增的圖示 (2)修改對話方塊圖示: 點選對話方塊 --> 屬性 --> ICON (3)固定對話方塊大小:點選對話方塊
MATLAB神經網路學習(1):單層感知器
單層感知器由一個線性組合器和一個二值閾值元件組成。 輸入是一個N維向量 x=[x1,x2,...,xn],其中每一個分量對應一個權值wi,隱含層輸出疊加為一個標量值: 隨後在二值閾值元件中對得到的v值進行判斷,產生二值輸出:
計算機軟體技術基礎的學習(1):資料結構
本文為大三下學習《計算機軟體技術基礎》的知識點一、------------資料結構:研究非數值運算(資料元素之間的關係)的程式設計------------------------------------(1)線性表: 順序儲存和鏈式儲存
pyCUDA教程-系列學習(1):GPU結構、pyCUDA、numbapro安裝及HelloGPU例子
GPU結構CPU v.s. GPU CPU是被設計用來處理複雜任務的,而GPU只能做好一件事-處理百萬級的低階任務(原來是被用來生成3D圖形中的三角形),而且GPU有上千個ALU(算術邏輯單元),而CPU通常只有8個。而且很多程式大部分時間都花在GPU擅長的簡單運算上了,所
Spring學習(1):控制反轉(IoC)和依賴注入(DI)的詳解以及註解(annotation)開發入門案例
前言 以往的java學習中,我們要想得到一個物件,就把它new出來。如:Apple apple = new Apple(); 在一些複雜的系統中,一個物件A可能依賴於物件B,C等(程式碼表現為A類持有B,C類的物件作為A類的屬性)。以往來說,我們想要使用B,
OpenFace學習(1):安裝配置及人臉比對
前言 前幾天在網上看到了openface(連結),覺得挺有趣就下載配置了一下,稍微修改了一下跑了個demo,效果還是很不錯的。這裡分享下安裝配置的過程以及demo。 簡介 環境搭建 我只是在筆記本上搭建了環境所以涉及到GPU的CUDA驅動的部
GitHub學習(一):基礎操作
在學習Python一段時間後,發現越來越多的程式程式碼都儲存在一個叫Github的網站裡面,好奇心驅使下去看了下這個東西,聽完介紹,感覺是個很好用的東西,大概的看了下廖雪峰老師的教程,然後就沒有管了,在我的思想裡面,檔案備份還是U盤加壓縮包好用,簡單方
MyBatis學習(1):Mybatis使用詳解和入門案例
前言 MyBatis和Hibernate一樣,是一個優秀的持久層框架。已經說過很多次了,原生的jdbc操作存在大量的重複性程式碼(如註冊驅動,建立連線,建立statement,結果集檢測等)。框架的作用就是把這些繁瑣的程式碼封裝,這樣可以讓程式設計師專注於sq
Docker學習(1):在Ubuntu下安裝Docker和關於容器的常用命令
一、Docker的安裝條件 1.執行64位CPU架構的計算機,Docker目前不支援32位CPU; 2.建議採用Linux3.8或更高版本的核心; 3.核心必須支援一種適合的儲存驅動