前言
前段时间有业务需求需要Java后端开发生成Xmind思维导图文件后可导出或在线预览,在网上找了很多资料发现效果都不是很理想,然后自己写了个认为还看的过去的Demo在这里分享一下,Demo的代码都是随手写的有大量的冗余和优化的空间,建议调整后应用,写的不好勿喷!
一、准备工作
Jar包依赖导入
需要依赖Jar包的私信我
**主题背景颜色**
```java
package com.maple.xmind;
import lombok.Data;
/**
* @author : 谁喝了我的厚乳拿铁
* @version : v1.0
* @description :
* @createTime : 2023/12/19 20:28
*/
@Data
public class XmindConstant {
//#F6A04D 橘色 #FDD834 黄色 #7986CB 紫色 #EA8ABA 粉色 #0096BF 蓝色
//#8EDE99 绿色 #FF9595 亮粉色 #D0D0D0 灰色 #0CE6CF 深蓝色
public static String[] superviseColorArray = {"#F6A04D", "#FDD834", "#7986CB", "#EA8ABA", "#0096BF", "#8EDE99", "#FF9595", "#D0D0D0", "#0CE6CF"};
//#EEEEEE 事件白色 #19A719 事件绿色 #FF5252 事件红色
public static String[] eventColorArray = {"#FFFFFF", "#8EDE99", "#FF5252"};
// #0098B9 蓝色 #B7C82B 草绿 #F3D4B2 浅橘 #E7C2C0 浅粉 #A8D4CC 浅蓝绿 #D8DCAF 淡浅黄
public static String[] matterColorArray = {"#0098B9", "#B7C82B", "#F3D4B2", "#E7C2C0", "#A8D4CC", "#D8DCAF"};
public static String logicRight = "org.xmind.ui.logic.right";
public static String leftFish = "org.xmind.ui.fishbone.leftHeaded";
}
实体类
package com.maple.xmind;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
/**
* @author : 谁喝了我的厚乳拿铁
* @version : v1.0
* @description :
* @createTime : 2023/12/19 20:39
*/
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class SubjectBranch {
/**
* 主题子分支内容
* */
private String branchContent;
}
二、逻辑思维导图生成
效果图:
Demo导出代码
package com.maple.xmind;
import com.maple.business.util.XmindConstant;
import lombok.extern.slf4j.Slf4j;
import org.xmind.core.*;
import org.xmind.core.style.IStyle;
import org.xmind.core.style.IStyleSheet;
import org.xmind.ui.style.Styles;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.Random;
/**
* @author : 谁喝了我的厚乳拿铁
* @version : v1.0
* @description : Java后端生成XMind思维导图示例
* @createTime : 2023/12/19 20:59
*/
@Slf4j
public class LogicalXmind {
public static void main(String[] args) {
xmindExport();
}
/**
* 生成XMind思维导图并导出为文件
*/
public static void xmindExport() {
IWorkbookBuilder workbookBuilder = Core.getWorkbookBuilder();
IWorkbook workbook = workbookBuilder.createWorkbook();
ISheet primarySheet = workbook.getPrimarySheet();
ITopic topTopic = primarySheet.getRootTopic();
topTopic.setTitleText("主要Xmind中心主题");
topTopic.setStructureClass(XmindConstant.logicRight);
IStyleSheet styleSheet = workbook.getStyleSheet();
IStyle style = styleSheet.findStyle(topTopic.getStyleId());
if (style == null) {
style = styleSheet.createStyle(IStyle.TOPIC);
styleSheet.addStyle(style, IStyleSheet.NORMAL_STYLES);
}
// 设置主题的Style
style.setProperty(Styles.FillColor, "#00BC7B");
style.setProperty(Styles.TextColor, "#FFFFFF");
style.setProperty(Styles.FontWeight, Styles.FontWeight);
style.setProperty(Styles.FontSize, "20pt");
style.setProperty(Styles.LineWidth, "2pt");
style.setProperty(Styles.LineColor, Styles.NONE);
topTopic.setStyleId(style.getId());
// 添加第二层主题分支测试数据 根据业务需求动态增加
for (int i = 0; i < 5; i++) {
buildTopic(workbook, topTopic, "第二层主题分支" + i);
}
try {
// 生成文件到指定路径
workbook.save(Files.newOutputStream(Paths.get("C:\\Users\\25478\\Desktop\\test2.xmind")));
System.out.println("Xmind思维导图生成成功!");
} catch (Exception e) {
System.out.println("Xmind思维导图生成失败!");
}
}
/**
* 构建主题分支
*
* @param workbook XMind工作簿
* @param parentTopic 父主题
* @param topicName 主题名称
*/
private static void buildTopic(IWorkbook workbook, ITopic parentTopic, String topicName) {
ITopic topic = workbook.createTopic();
topic.setTitleText(topicName);
IStyleSheet styleSheet = workbook.getStyleSheet();
IStyle style = styleSheet.findStyle(topic.getStyleId());
if (style == null) {
style = styleSheet.createStyle(IStyle.TOPIC);
styleSheet.addStyle(style, IStyleSheet.NORMAL_STYLES);
}
Random random = new Random();
// 修改Style样式
// 填充随机颜色
style.setProperty(Styles.FillColor, XmindConstant.superviseColorArray[random.nextInt(9)]);
style.setProperty(Styles.TextColor, "#000229");
style.setProperty(Styles.FontWeight, Styles.FontWeight);
style.setProperty(Styles.FontSize, "20pt");
style.setProperty(Styles.LineWidth, "2pt");
style.setProperty(Styles.LineColor, Styles.DEF_TOPIC_LINE_COLOR);
topic.setStyleId(style.getId());
for (int i = 0; i < 3; i++) {
// 添加第三层主题分支测试数据
ITopic subTopic = workbook.createTopic();
subTopic.setTitleText("第三层主题分支" + i);
IStyleSheet subStyleSheet = workbook.getStyleSheet();
IStyle subStyle = subStyleSheet.findStyle(subTopic.getStyleId());
if (subStyle == null) {
subStyle = styleSheet.createStyle(IStyle.TOPIC);
styleSheet.addStyle(subStyle, IStyleSheet.NORMAL_STYLES);
}
// 修改Style样式
// 填充随机颜色
subStyle.setProperty(Styles.FillColor, XmindConstant.eventColorArray[i]);
subStyle.setProperty(Styles.TextColor, "#000229");
subStyle.setProperty(Styles.FontWeight, Styles.FontWeight);
subStyle.setProperty(Styles.FontSize, "16pt");
subStyle.setProperty(Styles.LineWidth, "2pt");
subStyle.setProperty(Styles.LineColor, Styles.DEF_TOPIC_LINE_COLOR);
subTopic.setStyleId(subStyle.getId());
IManifest manifest = workbook.getManifest();
try {
// 加载小图标
String filePath = "C:\\Users\\25478\\Desktop\\image\\";
switch (i + 1) {
case 1:
filePath = filePath + "flag.png";
break;
case 2:
filePath = filePath + "complete.png";
break;
case 3:
filePath = filePath + "alarm.png";
break;
default:
break;
}
IFileEntry entry = manifest.createAttachmentFromFilePath(filePath);
IImage image = subTopic.getImage();
image.setSource("xap:" + entry.getPath());
image.setHeight(20);
image.setWidth(20);
image.setAlignment("left");
} catch (Exception e) {
log.info("读取图标失败!");
}
topic.add(subTopic);
}
parentTopic.add(topic);
}
}
三、鱼骨图思维导图生成
效果图:
Demo导出代码
package com.maple.xmind;
import com.maple.business.util.XmindConstant;
import lombok.extern.slf4j.Slf4j;
import org.xmind.core.*;
import org.xmind.core.style.IStyle;
import org.xmind.core.style.IStyleSheet;
import org.xmind.ui.style.Styles;
import java.nio.file.Files;
import java.nio.file.Paths;
import java.util.ArrayList;
import java.util.List;
import java.util.Random;
/**
* @author : 谁喝了我的厚乳拿铁
* @version : v1.0
* @description : 导出Xmind文件
* @createTime : 2023/12/19 20:28
*/
@Slf4j
public class FishXmind {
public static void main(String[] args) {
xmindExport();
}
/**
* 导出Xmind文件
*/
public static void xmindExport() {
// 创建Xmind工作簿
IWorkbookBuilder workbookBuilder = Core.getWorkbookBuilder();
IWorkbook workbook = workbookBuilder.createWorkbook();
ISheet primarySheet = workbook.getPrimarySheet();
ITopic topTopic = primarySheet.getRootTopic();
topTopic.setTitleText("Xmind中心主题");
topTopic.setStructureClass(XmindConstant.logicRight);
// 设置中心主题样式
IStyleSheet styleSheet = workbook.getStyleSheet();
IStyle style = styleSheet.findStyle(topTopic.getStyleId());
if (style == null) {
style = styleSheet.createStyle(IStyle.TOPIC);
styleSheet.addStyle(style, IStyleSheet.NORMAL_STYLES);
}
style.setProperty(Styles.FillColor, "#00BC7B");
style.setProperty(Styles.TextColor, "#FFFFFF");
style.setProperty(Styles.FontWeight, Styles.FontWeight);
style.setProperty(Styles.FontSize, "20pt");
style.setProperty(Styles.LineWidth, "2pt");
style.setProperty(Styles.LineClass, Styles.BRANCH_CONN_STRAIGHT);
style.setProperty(Styles.LineColor, Styles.NONE);
topTopic.setStyleId(style.getId());
// 添加备注内容
IPlainNotesContent plainContent = (IPlainNotesContent) workbook.createNotesContent(INotes.PLAIN);
plainContent.setTextContent("这是备注内容!");
INotes notes = topTopic.getNotes();
notes.setContent(INotes.PLAIN, plainContent);
// 添加五个测试主题分支,可以根据业务需求动态增加或减少数据
for (int i = 0; i < 2; i++) {
Random random = new Random();
// 随机主题背景颜色
String colorCode = XmindConstant.matterColorArray[random.nextInt(6)];
// 准备分支主题子内容
List<SubjectBranch> branchList = new ArrayList<>();
for (int k = 0; k < 7; k++) {
branchList.add(SubjectBranch.builder().branchContent(i + "号主题分支子内容" + k).build());
}
buildTopic(workbook, topTopic, "主题分支" + i + "号", colorCode, branchList);
}
try {
workbook.save(Files.newOutputStream(Paths.get("C:\\Users\\25478\\Desktop\\test.xmind")));
} catch (Exception e) {
System.out.println("Xmind思维导图生成失败!");
}
}
/**
* 构建主题
*
* @param workbook 工作簿
* @param topTopic 顶级主题
* @param itemName 主题名称
* @param colorCode 主题背景颜色
* @param branchList 分支列表
*/
private static void buildTopic(IWorkbook workbook, ITopic topTopic, String itemName, String colorCode, List<SubjectBranch> branchList) {
ITopic rootTopic = workbook.createTopic();
rootTopic.setStructureClass(XmindConstant.leftFish);
rootTopic.setTitleText(itemName);
IStyleSheet styleSheet = workbook.getStyleSheet();
IStyle style = styleSheet.findStyle(rootTopic.getStyleId());
if (style == null) {
style = styleSheet.createStyle(IStyle.TOPIC);
styleSheet.addStyle(style, IStyleSheet.NORMAL_STYLES);
}
Random random = new Random();
style.setProperty(Styles.FillColor, XmindConstant.superviseColorArray[random.nextInt(9)]);
style.setProperty(Styles.TextColor, "#FFFFFF");
style.setProperty(Styles.FontWeight, Styles.FontWeight);
style.setProperty(Styles.FontSize, "20pt");
style.setProperty(Styles.LineWidth, "2pt");
style.setProperty(Styles.LineColor, Styles.DEF_TOPIC_LINE_COLOR);
rootTopic.setStyleId(style.getId());
for (SubjectBranch subjectBranch : branchList) {
ITopic topicSon = workbook.createTopic();
topicSon.setTitleText(subjectBranch.getBranchContent());
IStyleSheet sonStyleSheet = workbook.getStyleSheet();
IStyle sonStyle = sonStyleSheet.findStyle(topicSon.getStyleId());
if (sonStyle == null) {
sonStyle = styleSheet.createStyle(IStyle.TOPIC);
styleSheet.addStyle(sonStyle, IStyleSheet.NORMAL_STYLES);
}
sonStyle.setProperty(Styles.FillColor, colorCode);
sonStyle.setProperty(Styles.ShapeClass, Styles.TOPIC_SHAPE_ROUNDEDRECT);
sonStyle.setProperty(Styles.TextColor, "#000229");
sonStyle.setProperty(Styles.FontWeight, Styles.FontWeight);
sonStyle.setProperty(Styles.FontSize, "16pt");
sonStyle.setProperty(Styles.LineWidth, "2pt");
sonStyle.setProperty(Styles.LineColor, Styles.DEF_TOPIC_LINE_COLOR);
topicSon.setStyleId(sonStyle.getId());
// 增加鱼骨图分支
for (int i = 0; i < 2; i++) {
ITopic topicItem = workbook.createTopic();
topicItem.setTitleText("分支" + i);
IStyleSheet itemStyleSheet = workbook.getStyleSheet();
IStyle itemStyle = itemStyleSheet.findStyle(topicItem.getStyleId());
if (itemStyle == null) {
itemStyle = styleSheet.createStyle(IStyle.TOPIC);
styleSheet.addStyle(itemStyle, IStyleSheet.NORMAL_STYLES);
}
itemStyle.setProperty(Styles.TextColor, "#000229");
itemStyle.setProperty(Styles.FontWeight, Styles.FontWeight);
itemStyle.setProperty(Styles.FontSize, "14pt");
itemStyle.setProperty(Styles.LineWidth, "2pt");
itemStyle.setProperty(Styles.LineColor, Styles.DEF_TOPIC_LINE_COLOR);
topicItem.setStyleId(itemStyle.getId());
topicSon.add(topicItem);
}
rootTopic.add(topicSon);
}
topTopic.add(rootTopic);
}
}
总结
个人了解到的Xmind官方Github上好像已经找不到Java生成思维导图的库了,全网找了很多资料参考发现maven依赖都是不全的,基础的org.xmind.core还能找到,但是生成出来的效果差强人意,需要配合对应ui的jar包使用生成的思维导图才勉强能用。其中的样式API的使用建议参考:java导出xmind(java导出思维导图),样式上还有很多坑,有些样式根本实现不了,上面的效果折腾了好几天基本算是我的极限了,如果有写错和说错的地方可以评论留言补充。