天天看點

com4j學習(1):Java操作Visio之Java讀取Visio圖形關系并存儲到XML檔案中

前言:

MicroSoft Visio是微軟旗下一款非常非常出色的繪圖軟體,可以用來繪制各種各樣的圖形(如流程圖、UML、工程圖等)。現在有這樣一個需求,我們想讀取visio中的圖形的形狀、屬性、連接配接關系等到程式中(java、c++、python都行),這樣我們就可以将Visio中的圖形之間存在的關系以其他的形式(XML、JSON等)進行存儲。這樣一來,就擴充了Visio的功能,不僅能得到圖形檔案,還能得到XML等其他資料存儲格式。本文采用Java的com4j庫來實作我們的需求。

推薦幾個科普的連結:

1、https://wenku.baidu.com/view/2d1f8ac9da38376baf1fae81.html?re=view

并且你要學會如何自定義圖形,參考部落格:如何自定義形狀

正文:

現在我們一步一步搭建開發環境。

一、安裝JDK,Eclipse這些必要工具。本文不再贅述。

二、安裝Visio,本文使用的是2013版本。

三、下載下傳com4j庫,這個庫是開源免費的,位址:https://com4j.kohsuke.org/

四、上面下載下傳了必要的開發工具後,接下來一步很重要,使用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.4 我們還需要dom4j庫來操作XML,下載下傳位址:https://dom4j.github.io/

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.dom4j.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圖形的屬性。