Java实现.xlsx转.xmind
简单的就是将excel表格里面的数据转成一个Xmind的流程图
重要声明!!!入门新手一枚 如有错误 还请见谅~
源码地址:点击跳转
前期准备
1.安装Xmind,就直接去官网下载一个就好了,以下是我的版本 可以参考
2.给Idea配置maven环境,因为要用到相关的poi和xmind的依赖包,教程可以自行搜索 配置完成后用cmd/终端 mvn -v 指令检查是否配置成功就可以了
配置成功页面
正式编码
- 首先在pom.xml文件中把需要用的依赖包配置好
<!--Xmind -->
<dependency>
<groupId>com.github.eljah</groupId>
<artifactId>xmindjbehaveplugin</artifactId>
<version>0.8</version>
</dependency>
<!--poi -->
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.17</version>
</dependency>
2.Main.class
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.xmind.core.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
public class Main {
public static void main(String[] args) throws IOException, InvalidFormatException, CoreException {
Data data= new Data();
//excel存放的目录
String path="/Users/may/Desktop/";
List<Map<String, Object>> dataList = new ArrayList<>();
//目录拼接文件名 获取到对应的文件
dataList=data.setPath(path+"test_case01.xlsx");
//创建一个空白界面
IWorkbookBuilder workbookBuilder= (IWorkbookBuilder) Core.getWorkbookBuilder();
//创建工作溥
IWorkbook iWorkbook=workbookBuilder.createWorkbook(data.fileName);
//获取默认sheet
ISheet primarySheet=iWorkbook.getPrimarySheet();
//创建一个流程图的主题
ITopic rootTopic= primarySheet.getRootTopic();
//设置成为正确的逻辑图
rootTopic.setStructureClass("org.xmind.ui.logic.right");
rootTopic.setTitleText(data.fileName);
//忽略表头
for (int i=1;i<dataList.size();i++){
//因为第一列是表头 不需要显示在逻辑图中 所以忽略第一行的数据 i从0开始
//先定义一个父节点的位置,父结点也就是当前数据需要链接的结点,就当前位置 父结点就是根结点
ITopic lastTopic = rootTopic;
for (String value : dataList.get(i).keySet()) {
//标记是否存在相同结点
boolean flag=false;
String key=value;
//就当前数据创建一个新结点
ITopic topic = iWorkbook.createTopic();
topic.setTitleText((String) dataList.get(i).get(key));
//caseId不用显示在逻辑图中,所以对key==caseId 数据不做处理
if (key.equals("caseId")) {
continue;
}
//创建一list对象 用来装父结点的所子结点
List<ITopic> chil= (List<ITopic>) lastTopic.getAllChildren();
//如果chil长度<1,证明当前父结点没有子结点,直接父结点中添加就行
if (chil.size()<1){
//将当前结点链接到父结点上
lastTopic.add(topic,ITopic.ATTACHED);
//将当前结点当作下一个新结点的父结点
lastTopic = topic;
}
else {
//如果chil长度>1,可能存在当前结点topic和lasttopic结点相同,
for (int k=0;k<chil.size();k++){
if (topic.getTitleText()==chil.get(k).getTitleText()) {
//如果相同 就将相同结点的topic 赋给 lasttopic
//并且将flag=true 表示存在相同结点
lastTopic = chil.get(k);
flag = true;
break;
}
}
if (!flag){//如果flag==flase,证明不存在相同结点,所以即使循环结束也依旧要把当前结点 topic链接到lasttopic 并且更新lasttopic
lastTopic.add(topic,ITopic.ATTACHED);
lastTopic = topic;
}
}
}
}
File file1 = new File(path+data.fileName+".xmind");
//判断该路径下是否存在该文件,如果存在那么删除,如果不存在 直接新建
if (file1.exists()){
file1.delete();
}
iWorkbook.save(path+data.fileName+".xmind");
}
}
3.Dat.class
import net.sf.json.JSONArray;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.*;
import java.util.*;
public class Data {
String path;
String fileName;
//只做数据处理
public List<Map<String, Object>> setPath(String path) throws IOException {
this.path = path;
File file = new File(path);
this.fileName = file.getName();
fileName = fileName.substring(0, fileName.indexOf("."));
//System.out.println(this.fileName);
List<Map<String, Object>> mapsList = null;
String result = null;
if (!file.exists()) {
System.out.println("文件名不存在,请确认无误后重试!");
} else {
if (!file.canRead()) {
System.out.println("该文件没有读取权限,请确认无误后重试!");
} else {
// 打开特定类型的输入流,读取文件的字节流 读取的内容in是一个地址:java.io.FileInputStream@19469ea2
InputStream in = new FileInputStream(file);
//System.out.println((char) in.read());
//读取
XSSFWorkbook sheets = new XSSFWorkbook(in);
//System.out.println( sheets);
//获取第一个sheet
XSSFSheet sheet = sheets.getSheetAt(0);
//getRow(0)读取第一行表头 A1/B1...
XSSFRow titile = sheet.getRow(0);
//System.out.println(sheet.getRow(0));
System.out.println(sheet.getPhysicalNumberOfRows());
//定义二维数组,存储读取出来的数据
mapsList = new ArrayList<>();
for (int i = 0; i < sheet.getPhysicalNumberOfRows(); i++) {
//从第二行开始
XSSFRow row = sheet.getRow(i);
//System.out.println(row.getPhysicalNumberOfCells());
//用于存储当前行的所有数据,以键-值的形式存储 HashMap允许存储相同的元素
Map<String, Object> map = new LinkedHashMap<>();
//循环遍历当前行
//row.getPhysicalNumberOfCells()只统计有内容总列数
//getLastCellNum 如果最后有数据的列为n,则返回n-1
for (int j = 0; j < row.getLastCellNum() + 1; j++) {
//获取这行数据中,对应列的键-值
XSSFCell title1 = titile.getCell(j);
//System.out.println(title1);
XSSFCell cell = row.getCell(j);
//System.out.println(cell);
//将获取到的值进行类型转换
if (cell == null) {
continue;
}
//修改单元格类型-文本类型
cell.setCellType(CellType.STRING);
//map里面只能是String Object类型的数据,现在的title1和cell的类型是XSSFCell类型 所以需要装换一下
String titleName = title1.getStringCellValue();
String valueName = cell.getStringCellValue();
//替换表格中的换行符
//if (valueName.contains("\n")) {
// valueName = valueName.replace("\n", "***");
//}
map.put(titleName, valueName);
}
System.out.println(map);
mapsList.add(map);
}
}
}
return mapsList;
}
}
输出效果
1、原始excel文件
2、输出Xmind文件结果
参考资料
1、poi Api:https://poi.apache.org/components/spreadsheet/how-to.html#event_api点击跳转
2、Xmind Api:http://sites.actsmind.com/support/xmnd-api点击跳转