当前位置: 首页 > 工具软件 > com4j > 使用案例 >

com4j学习(1):Java操作Visio之Java读取Visio图形关系并存储到XML文件中

沃弘图
2023-12-01

前言:

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图形的属性。

 类似资料: