python xmind 包使用详解(其中解决导出的xmind文件 xmind8可以打开 xmind2020及之后版本打开报错问题)
pip install xmind 使用
場景 xmind8 可以打开 xmind2020 报错
main_fest.xml(xmind8 打开另存后 更改后缀为.zip 里边包含META-INF/manifest.xml)
** 将xmind文件修改后缀为zip ---->解压---->放入main_fest.xml —>压缩为zip —>修改后缀为xmind**
import xmind import os import re import shutil import zipfile from xmind.core.const import TOPIC_DETACHED from xmind.core.markerref import MarkerId from xmind.core.topic import TopicElement def extract(d_path, f_path, mode="zip"): """ zip解压缩乱码问题处理 :param d_path: :param f_path: :return: """ root = d_path if not os.path.exists(root): os.makedirs(root) if mode == 'zip': zf = zipfile.ZipFile(f_path,"r") elif mode == 'rar': zf = rarfile.RarFile(f_path,"r") for n in zf.infolist(): srcName = n.filename try: decodeName = srcName.encode("cp437").decode("utf-8") except: try: decodeName = srcName.encode("cp437").decode("gbk") except: decodeName = srcName spiltArr = decodeName.split("/") path = root for temp in spiltArr: path = os.path.join(path, temp) if decodeName.endswith("/"): if not os.path.exists(path): os.makedirs(path) else: if not os.path.exists(os.path.dirname(path)): os.makedirs(os.path.dirname(path)) f = open(path, "wb") f.write(zf.read(srcName)) f.close() zf.close() def aftertreatment(path): """ **場景 xmind8 可以打开 xmind2020 报错 main_fest.xml(xmind8 打开另存后 更改后缀为.zip 里边包含META-INF/manifest.xml) xmind 修改后缀为zip ----》解压---- 》放入main_fest.xml --- 》压缩zip 修改后缀为xmind** """ # 修改名字 retval = os.path.dirname(os.path.abspath(__file__)) folder = os.path.dirname(path) name = os.path.basename(path) unzip_folder = os.path.splitext(name)[0] zip_name = unzip_folder + ".zip" os.chdir(folder) os.rename(name, zip_name) os.chdir(retval) # 解压 unzip_path = os.path.join(folder, unzip_folder) if not os.path.exists(unzip_path): os.mkdir(unzip_path) inf_folder = os.path.join(unzip_path, "META-INF") if not os.path.exists(inf_folder): os.mkdir(inf_folder) extract(unzip_path, os.path.join(folder, zip_name)) shutil.copyfile("./META-INF/manifest.xml", os.path.join(inf_folder, "manifest.xml")) os.remove(os.path.join(folder, zip_name)) shutil.make_archive(unzip_path, 'zip', unzip_path) file_path = unzip_path + '.zip' print(file_path) os.chdir(os.path.dirname(file_path)) os.rename(os.path.basename(file_path), name) os.chdir(retval) shutil.rmtree(unzip_path) def gen_xmind_file(data, path): # load an existing file or create a new workbook if nothing is found workbook = xmind.load(path) # get the first sheet(a new workbook has a blank sheet by default) sheet1 = workbook.getPrimarySheet() # design_sheet1(sheet1) # create sheet2 gen_sheet2(workbook, sheet1, data) # now we save as test.xmind xmind.save(workbook, path=path) # 修复 aftertreatment(path) def recursive(children, node, workbook): if len(children) == 0: return for c in children: t = TopicElement(ownerWorkbook=workbook) t.setTitle(c["data"]["text"]) if len(c["children"]): recursive(c["children"], t, workbook) node.addSubTopic(t) def gen_sheet2(workbook, sheet2, data): # ***** second sheet ***** # create a new sheet and add to the workbook by default # sheet2 = workbook.createSheet() center = data["root"]["data"]["text"] sheet2.setTitle(center) # a sheet has a blank sheet by default root_topic2 = sheet2.getRootTopic() root_topic2.setTitle(center) topics = data["root"]["children"] for t in topics: # use other methods to create some sub topic element topic = TopicElement(ownerWorkbook=workbook) # set a topic hyperlink from this topic to the first sheet given by s1.getID() # topic1.setTopicHyperlink(sheet1.getID()) # print(t["data"]["text"], t["data"]["layout_mind_offset"]["x"], t["data"]["layout_mind_offset"]["y"]) topic.setTitle(t["data"]["text"]) # set its title # topic.setPosition(t["data"]["layout_mind_offset"]["x"], t["data"]["layout_mind_offset"]["y"]) recursive(t["children"], topic, workbook) root_topic2.addSubTopic(topic) if __name__ == '__main__': data = { "root": { "data": { "id": "c1jsg864saw0", "created": 1585126506413, "text": "新手指南", "color": "#000000", "font-weight": "bold", "font-size": 32 }, "children": [ { "data": { "id": "c1jsisau8rc0", "created": 1585126706961, "text": "节点操作", "expandState": "expand", "layout_mind_offset": { "x": 36, "y": 93 }, "background": "#ffc000", "font-size": 22, "color": "#000000", "font-weight": "bold", "layout_right_offset": { "x": -48, "y": -39 }, "icon": "youxian_01" }, "children": [ { "data": { "id": "c1jslg11qzk0", "created": 1585126915340, "text": "插入节点", "font-size": 18, "color": "#ffc000", "layout_right_offset": { "x": 96, "y": -95 }, "background": "#404040", "font-weight": "bold", "icon": "qizhi_01" }, "children": [ { "data": { "id": "c1jsn3rlhbc0", "created": 1585127045376, "text": "下级:快捷键【Tab】 ", "font-size": 18, "color": "#ffc000", "layout_right_offset": { "x": 27, "y": -12 }, "background": "transparent" }, "children": [ ] }, { "data": { "id": "c1jso0dk2cg0", "created": 1585127116361, "text": "同级:快捷键【Enter】 ", "font-size": 18, "color": "#ffc000", "layout_right_offset": { "x": 27, "y": 0 }, "background": "transparent" }, "children": [ ] }, { "data": { "id": "c1jsp3q5g4g0", "created": 1585127202017, "text": "上级:快捷键【Shift + Tab】", "font-size": 18, "color": "#ffc000", "layout_right_offset": { "x": 30, "y": 13 }, "background": "transparent" }, "children": [ ] } ] }, { "data": { "id": "c1jslivsluw0", "created": 1585126921553, "text": "移动节点", "font-size": 18, "color": "#fabf8f", "expandState": "expand", "layout_right_offset": { "x": 97, "y": -36 }, "background": "#404040", "font-weight": "bold" }, "children": [ { "data": { "id": "c1jsqis0d540", "created": 1585127313145, "text": "上移:快捷键【Alt + ↑ 】", "background": "transparent", "font-size": 18, "color": "#fbd4b4", "layout_right_offset": { "x": 32, "y": -12 } }, "children": [ ] }, { "data": { "id": "c1jsqjz54o80", "created": 1585127315753, "text": "下移:快捷键【Alt + ↓ 】", "font-size": 18, "color": "#fbd4b4", "layout_right_offset": { "x": 31, "y": 0 }, "background": "transparent" }, "children": [ ] }, { "data": { "id": "c1jsqkfoncw0", "created": 1585127316753, "text": "收起/展开:快捷键【 / 】", "font-size": 18, "color": "#fbd4b4", "layout_right_offset": { "x": 34, "y": 13 }, "background": "transparent" }, "children": [ ] } ] }, { "data": { "id": "c1jt8kpu4x40", "created": 1585128727922, "text": "文字换行 ", "expandState": "expand", "font-size": 18, "layout_right_offset": { "x": 103, "y": 25 }, "color": "#ffc000", "background": "#404040", "font-weight": "bold", "icon": "star_02" }, "children": [ { "data": { "id": "c1jt94rf40w0", "created": 1585128771553, "text": "快捷键【Shift + Enter 】", "font-size": 18, "layout_right_offset": { "x": 13, "y": -1 }, "color": "#ffc000" }, "children": [ ] } ] } ] }, { "data": { "id": "c1jswayqnqo0", "created": 1585127766323, "text": "画布操作", "layout_mind_offset": { "x": -737, "y": -222 }, "font-size": 22, "background": "#e5dfec", "color": "#000000", "font-weight": "bold", "layout_right_offset": { "x": 29, "y": 83 } }, "children": [ { "data": { "id": "c1jswgwssps0", "created": 1585127779266, "text": "放大画布:Ctrl +“+”", "font-size": 18, "color": "#ccc0d9", "layout_right_offset": { "x": 68, "y": -38 }, "layout_left_offset": { "x": -36, "y": -47 } }, "children": [ ] }, { "data": { "id": "c1jswhh0nmo0", "created": 1585127780488, "text": "缩小画布:Ctrl +“-”", "font-size": 18, "color": "#ccc0d9", "layout_right_offset": { "x": 68, "y": -22 }, "layout_left_offset": { "x": -39, "y": -28 } }, "children": [ ] }, { "data": { "id": "c1jswivop5k0", "created": 1585127783552, "text": "拖动画布:按住鼠标右键", "font-size": 18, "color": "#ccc0d9", "layout_right_offset": { "x": 69, "y": 2 }, "layout_left_offset": { "x": -39, "y": -3 } }, "children": [ ] }, { "data": { "id": "c1jswjvpi9k0", "created": 1585127785730, "text": "定位节点中心:双击鼠标左键", "font-size": 18, "color": "#ccc0d9", "layout_right_offset": { "x": 71, "y": 14 }, "layout_left_offset": { "x": -41, "y": 10 } }, "children": [ ] } ] }, { "data": { "id": "c1jsleo62hk0", "created": 1585126912385, "text": "导出格式", "layout_mind_offset": { "x": -46, "y": 108 }, "expandState": "expand", "font-size": 22, "background": "#c2d69b", "color": "#262626", "font-weight": "bold", "layout_right_offset": { "x": 5, "y": 153 } }, "children": [ { "data": { "id": "c1knktgogog0", "created": 1585214320627, "text": "图片", "font-size": 18, "color": "#000000", "expandState": "expand", "layout_right_offset": { "x": 58, "y": -20 }, "background": "#c2d69b", "layout_left_offset": { "x": -48, "y": -28 } }, "children": [ { "data": { "id": "c1jsqis0d540", "created": 1585127313145, "text": "JPG、PNG、SVG", "background": "transparent", "font-size": 18, "color": "#c2d69b", "layout_right_offset": { "x": 1, "y": 1 } }, "children": [ ] } ] }, { "data": { "id": "c1knl8lj2m00", "created": 1585214353572, "text": "文件", "font-size": 18, "color": "#000000", "expandState": "expand", "layout_right_offset": { "x": 61, "y": 0 }, "background": "#c2d69b", "layout_left_offset": { "x": -47, "y": 2 } }, "children": [ { "data": { "id": "c1jsqis0d540", "created": 1585127313145, "text": "PDF、json、TXT、markdown", "background": "transparent", "font-size": 18, "color": "#c2d69b", "layout_right_offset": { "x": 0, "y": 1 } }, "children": [ ] } ] } ] } ] }, "subtree": [ ], "template": "default", "theme": "classic-compact", "relLine": [ ], "style": { }, "themeBgColor": "", "background": "", "version": "1.5.2", "ppts": [ ] } path = '/home/python/Desktop/proejct_xx/_media/temp_file/test.xmind' gen_xmind_file(data, path=path)
到此这篇关于python xmind 包使用 (其中解决导出的xmind文件 xmind8可以打开 xmind2020及之后版本打开报错问题)的文章就介绍到这了,更多相关python xmind 包使用内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!
赞 (0)