最近写了个java操作visio文档的小工具.使用了javacom & jacob,参考了c++操作visio的com技术,并请教了javacom的作者Miika.
public class JVisio {
private static Log log = LogFactory.getLog(JVisio.class);
/**
* Visio 程序
*/
IVApplication visioApp = null;
/**
*
* 默认visio可见
*
*/
public JVisio() {
this(true);
}
/**
*
* @param visible
*/
public JVisio(boolean visible) {
this.visioApp = new IVApplication();
this.visioApp.setVisible(visible);
}
/**
* 退出
*
*/
public void quit() {
this.visioApp.Quit();
}
/**
* 打开文档
*
* @param visioFile
* visio file name.
* @return
*/
public IVDocument addDocument(String visioFile) {
IVDocument doc = null;
try {
doc = this.visioApp.getDocuments().Add(visioFile);
} catch (Exception ex) {
log.error("Error of open the file '" + visioFile + "'!");
ex.printStackTrace();
}
return doc;
}
/**
* 文件另存为
*
* @param document
* @param distFile
* 这里的路径分隔符一定是要是 \\,例如E:\\workspace\\jvisio\\test\\tt_out.vsd
* @return
*/
public short saveAs(IVDocument document, String distFile) {
return document.SaveAs(distFile);
}
/**
* 获取visio文档里的一个master
*
* @param document
* 文档
* @param masterNameUIDOrIndex
* master的索引或者名称
* @return
*/
public IVMaster getMaster(IVDocument document, String masterNameUIDOrIndex) {
IVMasters masters = document.getPages().getItem(new Integer(1))
.getDocument().getMasters();
IVMaster master = masters.getItem(masterNameUIDOrIndex);
log.info("Get the master :"
+ (master == null ? null : master.getName()));
return master;
}
/**
* 获取单元格
*
* for example :
*
* double pageWidth = getCells(bts,"PageWidth").getResultIU();
*
* @param master
* @param localeSpecificCellName
* @return
*/
public IVCell getCells(IVMaster master, String localeSpecificCellName) {
return master.getPageSheet().getCells(localeSpecificCellName);
}
/**
* 画模具
*
* @param document
* 文档
* @param master
* 模具
* @param xPos
* x坐标
* @param yPos
* y坐标
* @return
*/
public IVShape drop(IVDocument document, IVMaster master, double xPos,
double yPos) {
IVPage tpage = document.getPages().getItem(new Integer(1));
return tpage.Drop(master.getDispatch(), xPos, yPos);
}
/**
* 画折线
*
* @param document 目标document
* @param fromShape 起点的模具
* @param fromPointName 起点的名称
* @param toShape 目标点的模具
* @param toPointName 目标点的名称
* @param connectLine 线模具
* @param needTab
*/
public void visioDrawOrthLine(IVDocument document, IVShape fromShape,
String fromPointName, IVShape toShape, String toPointName,
IVShape connectLine, boolean needTab) {
// 要连线的起点
IVCell fromCell = fromShape.getCells(fromPointName);
// 要连线的终点
IVCell toCell = toShape.getCells(toPointName);
// 线的起终点
IVCell beginOfLine = connectLine.getCells("BeginX");
IVCell endOfLine = connectLine.getCells("EndX");
// 连接
beginOfLine.GlueTo(fromCell);
endOfLine.GlueTo(toCell);
if (needTab) {
IVCell x2 = connectLine.getCells("Geometry1.X2");
double k = x2.getResultIU();
String v = String.valueOf(k * 2);
x2.setFormulaU(v);
connectLine.getCells("Geometry1.X3").setFormulaU(v);
}
}
/**
* 标注文字
*
* @param document
* @param text
* 标注的文字
* @param rectangle
* 矩形
* @param vertAlign
* 1表示yes,0表示no
* @param horzAlign
* 1表示yes,0表示no
* @param textColor
* "RGB(128,32,64)"
*/
public void visioDrawText(IVDocument document, String text,
Rectangle rectangle, int vertAlign, int horzAlign, String textColor) {
IVPage page = document.getPages().getItem(new Integer(1));
IVShape textShape = page.DrawRectangle(rectangle.getX1(), rectangle
.getY1(), rectangle.getX2(), rectangle.getY2());
// some properties:
// 字体大小
IVCell cell = textShape.getCells("Char.Size");
if (cell != null)
cell.setFormulaU("8pt");
// 垂直居中
cell = textShape.getCells("VerticalAlign");
if (cell != null)
cell.setFormulaU(String.valueOf(vertAlign));
// Para.HorzAlign
cell = textShape.getCells("Para.HorzAlign");
if (cell != null)
cell.setFormulaU(String.valueOf(horzAlign));
// text color
cell = textShape.getCells("Char.Color");
if (cell != null)
cell.setFormulaU(textColor);
textShape.setText(text);
}
使用示例:
public class Demo {
private static Log log = LogFactory.getLog(Demo.class);
public static void main(String[] args) {
JVisio visio = new JVisio();
String basedir = "E:\\workspace\\jvisio\\test\\";
try {
// 打开模具
IVDocument model = visio.addDocument(basedir + "model.vss");
// 打开模板
IVDocument template = visio.addDocument(basedir + "template.vst");
// 获取bts模型
IVMaster bts = visio.getMaster(model, "BTS");
IVMaster gfq = visio.getMaster(model, "功分器");
log.info(bts.getName());
log.info(gfq.getName());
// 标注文字
/*
* Rectangle rectangle = new Rectangle(0, 5, 2, 7);
* visio.visioDrawText(template, "哈哈", rectangle, 0, 0,
* "RGB(128,32,64)");
*/
// 连线
IVShape btsShape = visio.drop(template, bts, 1, 5);
IVShape gfqShape = visio.drop(template, gfq, 2, 7);
IVMaster line = visio.getMaster(model, "1/2馈线");
IVShape lineShape = visio.drop(template, line, 1, 1);
visio.visioDrawOrthLine(template, btsShape, "Connections.X1",
gfqShape, "Connections.X1", lineShape, false);
// 另存为
visio.saveAs(template, basedir + "out.vsd");
} catch (Exception ex) {// 捕捉Runtime Exception,并关闭visio.
visio.quit();
}
}
}
分享到:
相关推荐
通过java操作visio的方式:开源com4j
支持读写Visio文件,含demo,模具模板等文件必须是自己本机有的(可以到Visio安装目录去查找类似文件)VisioMain是读 Demo是创建写
例如,如果你需要创建一个新的Visio文档,你可以这样操作: ```java import com4j.Variant; import com.microsoft.visio.Application; import com.microsoft.visio.Document; import com.microsoft.visio.Visio; ...
对于与Visio、Word和Excel的交互,com4j.jar允许Java代码创建并操作这些应用程序的对象,例如打开文档、读取单元格、获取形状属性等。 为了具体实现,开发者需要按照以下步骤操作: 1. 添加依赖:将args4j-2.0.1....
2、cmd进入JDK安装目录,运行 java -jar tlbimp....在JDK安装目录出现一套操作visio的类库(可以不做,资源包括生成的类库,test文件夹就是) 3、把args4j-2.0.1.jar加入到你的项目里。运行VisioMain.java类就成功了
Java使用Com4j读取Visio是通过Java的COM(Component Object Model)接口来操作Microsoft Visio应用程序,实现对Visio文件的访问和处理。Com4j是一个开源库,它为Java提供了与COM对象交互的能力,弥补了Java不直接...
做项目时实现的功能,客户要求上传visio文件后,把visio中的图片读取出来,然后用图片展示出来,这个功能就应运而生了。 PS:包中附有jcom.dll文件,这个是关键,需要将jcom.dll文件放到服务器的bin目录下
这些库允许Java代码创建、打开、修改和保存Visio文档,以及执行其他复杂的任务,如绘制形状、连接线和应用样式。 2. **Visio对象模型**:在Visio中,一切皆为对象。工作簿、页面、形状、连接线等都是对象,每个对象...
Visio中的COM接口提供了丰富的功能,如打开Visio文档、获取或设置形状属性、遍历图表层次结构等。使用Com4j,你可以创建一个`com4j.Dispatch`对象来代表Visio的应用程序,然后调用其方法执行各种操作。 例如,以下...
综上所述,文章《java Jacob 解析visio》深入探讨了在Java环境下解析和操作Visio文档的技术方案,以及通过编程手段充分利用Visio在绘图方面的强大功能。通过对Visio文档不同格式的解析方法以及使用COM接口进行编程的...
这个“Java 值传递Visio资源”包含了几个Visio图形文件,帮助我们直观地理解这两种传递方式。 1. **值传递**: 当方法调用时,对于基本类型(如int, double, char等)的参数,实际传递的是变量的副本。这意味着在...
在Java开发中,有时我们需要对Office文件如Word、Excel和PowerPoint进行操作和编辑,例如创建、读取、修改或导出数据。Apache POI是一个强大的开源库,专门用于处理微软的Office文档格式,包括旧的HSSF/HWPF(用于...
`java.io.File`类则用于文件和目录的操作。 接着,"jar包"是Java的可执行文件格式,包含编译后的类文件和其他资源。在Java开发中,开发者经常会引用第三方的jar包来获取特定的功能,如Apache Commons、Google Guava...
- `Winstchs.exe`:可能是一个Windows下的命令行工具,用于执行各种文件操作,包括转换。但具体功能需要根据软件文档进一步了解。 - `xConvert.exe`:可能是一个文件转换工具,支持多种格式之间的转换,包括Visio...
Java软件开发流程图Visio 2013.vsdx 文档管理软件、自动化打包软件、禅道、svn、maven等都在流程里面有规划
- **工具库**:使用com4j库,可以方便地在Java中操作Visio文档。 - **安装**:通过Maven或Gradle添加com4j依赖。 - **实例**:加载Visio文档并操作其内容: ```java import com.visio.*; public class ...
“00JAVA常用软件图标.vssx”文件则是一个Visio模具,包含了上述提到的软件、框架和数据库的图标。Visio是一款强大的图形设计工具,特别适合绘制流程图、架构图和UML图。使用这个模具,开发者可以在设计图表时快速...
此资源为viso文档,主要为Java 输入与输出的UML类,包括:输入流与输出流的层次结构、Reader和Writer的层次结构、Closeable、Flushable、Readable和Appendable接口。