python3环境下运行,使用openpyxl模块实现

调用逻辑关系,yaml to excel脚本调用source.yaml文件,生成excel表格,然后excel to yaml脚本调用生成的表格转换为yaml文件

1 source.yaml

- manufacturer: AudiPowerType: GasolinePrice: 2136000CarModel: RS7IsOnSale: Falsehubs:- PDKmodel: 带保时捷动态照明系统 (PDLS) 的 LED 主大灯description: 灰色巴新胡桃木内饰组件PDKnumber: 4detailsInfo: 软件版本要求为:加速特性- PDKmodel: Audi328Lidescription: 带加热功能的烟灰色阿帕奇木运动型方向盘PDKnumber: 1IsPurchase: TrueInterior:- PDKmodel: 选配description: 裸车很少有4S店会卖PDKnumber: 4IsPurchase: Falseskylight:- PDKmodel: 金属漆和特殊颜色根据车型不同,价格也不同description: 金属漆的选配价格在0-13500元不等PDKnumber: 1- PDKmodel: 保时捷Panamera在车漆的选择上相对简单description: 因为它连金属车漆也是免费的PDKnumber: 4detailsInfo: 那相对标准车漆,金属漆肯定要更好一些了。- PDKmodel: 21寸911 Turbo Designdescription: 百公里加速4.1SPDKnumber: 4detailsInfo: 软件版本要求为:加速特性- manufacturer: BMWPowerType: ElectricCarModel: III seriesPrice: 367000IsOnSale: Truehubs:- PDKmodel: 宝马328Lidescription: 百公里加速4.1SPDKnumber: 4detailsInfo: 软件版本要求为:加速特性Interior:- PDKmodel: 宝马328Lidescription: 百公里加速4.1SPDKnumber: 4detailsInfo: 软件版本要求为:加速特性IsPurchase: TrueCarSpoilers:- PDKmodel: 宝马328Lidescription: 百公里加速4.1SPDKnumber: 4detailsInfo: 软件版本要求为:加速特性security:- PDKmodel: 宝马328Lidescription: 百公里加速4.1SPDKnumber: 4detailsInfo: 软件版本要求为:加速特性domesticVersion: [2,3,4,5]- PDKmodel: 宝马328Lidescription: 百公里加速4.1SPDKnumber: 4detailsInfo: 软件版本要求为:加速特性skylight:- PDKmodel: 宝马328Lidescription: 百公里加速4.1SPDKnumber: 4detailsInfo: 软件版本要求为:加速特性importVersion: [1,3,4,6]IsPurchase: True- manufacturer: PorschePowerType: GasolinePrice: 2136000CarModel: panameraIsOnSale: Falsehubs:- PDKmodel: 带保时捷动态照明系统 (PDLS) 的 LED 主大灯description: 灰色巴新胡桃木内饰组件PDKnumber: 4detailsInfo: 软件版本要求为:加速特性- PDKmodel: Audi328Lidescription: 带加热功能的烟灰色阿帕奇木运动型方向盘PDKnumber: 1IsPurchase: TrueInterior:- PDKmodel: 选配description: 裸车很少有4S店会卖PDKnumber: 4IsPurchase: Falseskylight:- PDKmodel: 金属漆和特殊颜色根据车型不同,价格也不同description: 金属漆的选配价格在0-13500元不等PDKnumber: 1- PDKmodel: 保时捷Panamera在车漆的选择上相对简单description: 因为它连金属车漆也是免费的PDKnumber: 4detailsInfo: 那相对标准车漆,金属漆肯定要更好一些了。- PDKmodel: 21寸911 Turbo Designdescription: 百公里加速4.1SPDKnumber: 4detailsInfo: 软件版本要求为:加速特性

2 yaml to excel.py

# -*- coding:utf8 -*-
from ruamel import yaml
from openpyxl import Workbook
from openpyxl.styles import colors
from openpyxl.styles import Font,PatternFill,Alignment
# 表格颜色对照网址: https://zhuanlan.zhihu.com/p/154206853class YamlToExcel(object):def __init__(self):# 实例化workbookself.work_book = Workbook()# 激活 worksheetself.work_sheet = self.work_book.active# 设置sheet表名def set_worksheet_title(self,manufacturer):self.work_sheet.title = manufacturer@classmethoddef parse(cls):with open('source.yaml', encoding='UTF8') as f:data = f.read()return yaml.load(data, Loader=yaml.Loader)# 按照逻辑写入exceldef write_excel(self):# 设置列宽self.work_sheet.column_dimensions['A'].width = 17.0self.work_sheet.column_dimensions['B'].width = 11.0self.work_sheet.column_dimensions['C'].width = 14.0self.work_sheet.column_dimensions['D'].width = 11.0self.work_sheet.column_dimensions['E'].width = 15.0self.work_sheet.column_dimensions['F'].width = 15.0self.work_sheet.column_dimensions['G'].width = 40.0self.work_sheet.column_dimensions['H'].width = 12.0self.work_sheet.column_dimensions['I'].width = 17.0self.work_sheet.column_dimensions['J'].width = 17.0self.work_sheet.column_dimensions['K'].width = 16.0self.work_sheet.column_dimensions['L'].width = 37.0self.work_sheet.column_dimensions['M'].width = 40.0align = Alignment(horizontal='center', vertical='center', wrap_text=True) # 设置表格居中self.set_worksheet_title('CarSale')# 第一列到第十三列 合并单元格self.work_sheet.merge_cells(start_row=1, start_column=1, end_row=1, end_column=13)# 设置字体颜色font_color = Font(color=colors.BLACK, size=12)self.work_sheet.cell(row=1, column=1, value='选配指南').font = font_colorself.work_sheet.cell(row=1, column=1, value='选配指南').alignment = align# 填充背景颜色(橙色)background_color = PatternFill("solid", fgColor="FFBB02")self.work_sheet.cell(row=1, column=1).fill = background_color# 第二行描述信息description_list = ['动力类型', '售卖价格', '汽车厂商', '是否停售','汽车型号', '选配配件', '组件型号', '数量', '国产', '进口', '购买资格', '描述', '备注']column_number = 1for title_name in description_list:self.work_sheet.cell(row=2, column=column_number, value='{}'.format(title_name)).alignment = aligncolumn_number = column_number + 1# 第三行字段信息field_list = ['PowerType', 'Price', 'manufacturer', 'IsOnSale', 'CarModel', 'Selection', 'PDKmodel','PDKnumber','domesticVersion','importVersion', 'IsPurchase', 'description','detailsInfo']column_number = 1for field_name in field_list:self.work_sheet.cell(row=3, column=column_number, value='{}'.format(field_name)).alignment = aligncolumn_number = column_number + 1# 列对照表column_compare_dict = {"PDKmodel": 7, 'PDKnumber': 8, 'domesticVersion': 9, 'importVersion': 10,'IsPurchase': 11,'description':12,'detailsInfo':13}# 表格内容写入component_start_row = 4for component in self.parse():# Title : 角色/套餐ID/厂商/是否停售/型号self.work_sheet.cell(row=component_start_row, column=1, value='{}'.format(component.get('PowerType'))).alignment = alignself.work_sheet.cell(row=component_start_row, column=2, value='{}'.format(component.get('Price'))).alignment = alignself.work_sheet.cell(row=component_start_row, column=3, value='{}'.format(component.get('manufacturer'))).alignment = alignself.work_sheet.cell(row=component_start_row, column=4,value='{}'.format(component.get('IsOnSale') if component.get('IsOnSale') else '')).alignment = alignself.work_sheet.cell(row=component_start_row, column=5, value='{}'.format(component.get('CarModel'))).alignment = align# 占用行数汇总employ_sum = list()for key,value in component.items():title_list = ['PowerType', 'manufacturer', 'Price', 'CarModel', 'IsOnSale']if set(title_list) > set(component.keys()):employ_sum.append(1)breakelif key not in title_list:employ_sum.append(len(component.get(key)))# 元素值component_keys = [ key for key in component.keys() if key not in ['PowerType', 'manufacturer', 'Price', 'CarModel', 'IsOnSale'] ]temp_start_row = component_start_rowfor keys in component_keys:self.work_sheet.cell(row=temp_start_row, column=6, value='{}'.format(keys))if len(component.get(keys)) == 1:for k, v in component.get(keys)[0].items():if k in column_compare_dict.keys():self.work_sheet.cell(row=temp_start_row, column=column_compare_dict.get(k),value='{}'.format(v))temp_start_row = temp_start_row + 1print(keys,temp_start_row)else:part_merge_row = temp_start_rowfor part in component.get(keys):print(component)print(part_merge_row,part)for k, v in part.items():if k in column_compare_dict.keys():self.work_sheet.cell(row=part_merge_row, column=column_compare_dict.get(k),value='{}'.format(v))part_merge_row = part_merge_row + 1temp_start_row = temp_start_row + len(component.get(keys))# 合并单元格component_end_row = sum(employ_sum) + component_start_row - 1print(component_start_row,component_end_row)# 合并单元格self.work_sheet.merge_cells(start_row=component_start_row, start_column=1, end_row=component_end_row, end_column=1)self.work_sheet.merge_cells(start_row=component_start_row, start_column=2, end_row=component_end_row, end_column=2)self.work_sheet.merge_cells(start_row=component_start_row, start_column=3, end_row=component_end_row, end_column=3)self.work_sheet.merge_cells(start_row=component_start_row, start_column=4, end_row=component_end_row, end_column=4)self.work_sheet.merge_cells(start_row=component_start_row, start_column=5, end_row=component_end_row, end_column=5)# component数据之间添加空格,空格填充背景颜色(绿色)if component != self.parse()[-1]:background_color = PatternFill("solid", fgColor="00CCFFFF")self.work_sheet.cell(row=component_end_row + 1, column=1).fill = background_colorself.work_sheet.cell(row=component_end_row + 1, column=1, value='{}'.format(''))self.work_sheet.merge_cells(start_row=component_end_row + 1, start_column=1, end_row=component_end_row + 1, end_column=13)# print('end row',component_end_row)# 下一个起始值component_start_row = sum(employ_sum) + component_start_row + 1def save_excel(self):self.write_excel()self.work_book.save("Porsche.xlsx")if __name__ == '__main__':c = YamlToExcel()c.save_excel()

3 excel to yaml.py

# -*- coding:utf8 -*-
from openpyxl import load_workbookclass ExcelToYaml(object):def __init__(self):# 打开已有表格self.workbook = load_workbook('Porsche.xlsx')# print(workbook)self.worksheet = self.workbook['CarSale']@classmethoddef create_file(cls,content):with open('Excel表格转换Yaml.yaml', 'a+') as file:file.write('{}{}'.format(content,'\n') )def interval(self):# 范围区间interval_list = []temporary = 0for row in range(4, self.worksheet.max_row + 1):if self.worksheet.cell(row=row, column=1).value:interval_list.append([temporary, row - 1])temporary = rowinterval_list.append([temporary, self.worksheet.max_row + 1])return interval_list[1:]def run(self):components = list()for interval in self.interval():start = interval[0]end = interval[1]title = {}details_merge = {}has_value_row = Nonefor row in range(start, end):title.update({'manufacturer': self.worksheet.cell(row=row, column=3).value}) if self.worksheet.cell(row=row,column=3).value else Nonetitle.update({'PowerType': self.worksheet.cell(row=row, column=1).value}) if self.worksheet.cell(row=row,column=1).value else Noneif self.worksheet.cell(row=row, column=2).value and self.worksheet.cell(row=row, column=2).value != 'None':title.update({'Price': int(self.worksheet.cell(row=row, column=2).value)})title.update({'IsOnSale': True}) if self.worksheet.cell(row=row,column=4).value else Nonetitle.update({'CarModel': self.worksheet.cell(row=row, column=5).value}) if self.worksheet.cell(row=row,column=5).value else Nonedetails1 = {}details2 = {}if self.worksheet.cell(row=row, column=6).value:has_value_row = rowif self.worksheet.cell(row=row, column=7).value:details1.update({'PDKmodel': self.worksheet.cell(row=row, column=7).value})if self.worksheet.cell(row=row, column=8).value:if int(self.worksheet.cell(row=row, column=8).value.isdigit()):details1.update({'PDKnumber': int(self.worksheet.cell(row=row, column=8).value)})else:details1.update({'PDKnumber': self.worksheet.cell(row=row,column=8).value})if self.worksheet.cell(row=row, column=9).value:details1.update({'domesticVersion': self.worksheet.cell(row=row, column=9).value})if self.worksheet.cell(row=row, column=10).value:details1.update({'excludeVersion': self.worksheet.cell(row=row, column=10).value})if self.worksheet.cell(row=row, column=11).value:details1.update({'IsPurchase': self.worksheet.cell(row=row, column=11).value})if self.worksheet.cell(row=row, column=12).value:details1.update({'description': self.worksheet.cell(row=row, column=12).value})if self.worksheet.cell(row=row, column=13).value and self.worksheet.cell(row=row, column=13).value.strip().lower() != 'none':details1.update({'detailsInfo': self.worksheet.cell(row=row, column=13).value})previous = self.worksheet.cell(row=row, column=6).valuedetails_merge.update({previous: [details1]})else:details2.update({'PDKmodel': self.worksheet.cell(row=row, column=7).value}) if self.worksheet.cell(row=row,column=7).value else Nonedetails2.update({'PDKnumber': int(self.worksheet.cell(row=row, column=8).value) if int(self.worksheet.cell(row=row, column=8).value.isdigit()) else self.worksheet.cell(row=row,column=8).value}) if self.worksheet.cell(row=row, column=8).value else Nonedetails2.update({'domesticVersion': self.worksheet.cell(row=row, column=9).value}) if self.worksheet.cell(row=row, column=9).value else Nonedetails2.update({'importVersion': self.worksheet.cell(row=row, column=10).value}) if self.worksheet.cell(row=row, column=10).value else Nonedetails2.update({'IsPurchase': self.worksheet.cell(row=row, column=11).value}) if self.worksheet.cell(row=row,column=11).value else Nonedetails2.update({'description': self.worksheet.cell(row=row, column=12).value}) if self.worksheet.cell(row=row, column=12).value else None# if self.worksheet.cell(row=row,column=13).value and self.worksheet.cell(row=row,column=13).value != None else Noneif self.worksheet.cell(row=row, column=13).value and self.worksheet.cell(row=row, column=13).value.strip().lower()!='none':details2.update({'detailsInfo': self.worksheet.cell(row=row, column=13).value})if details2:previous = self.worksheet.cell(row=has_value_row, column=6).valuetemp_list = details_merge.get(previous)temp_list.append(details2)details_merge[previous] = temp_listtitle.update(details_merge)components.append(title)# 文件写入for i in components:for key,value in i.items():if isinstance(value,list):print('  {}:'.format(key))self.create_file('  {}:'.format(key))for part in value:for k,v in part.items():print('    {}: {}'.format(k,v).replace('    {}'.format(list(part.keys())[0]),'  - {}'.format(list(part.keys())[0])) )self.create_file('    {}: {}'.format(k,v).replace('    {}'.format(list(part.keys())[0]),'  - {}'.format(list(part.keys())[0])) )else:print('  {}: {}'.format(key,value).replace('  {}'.format(list(i.keys())[0]),'- {}'.format(list(i.keys())[0]).strip()))self.create_file('  {}: {}'.format(key,value).replace('  {}'.format(list(i.keys())[0]),'- {}'.format(list(i.keys())[0]).strip()))# breakif __name__ == '__main__':c = ExcelToYaml()c.run()

Python之yaml与excel互相转换相关推荐

  1. Python读取多个excel文件(删除字段、数据格式转换、dataframe多表合并)并写入ElasticSearch实战(自动创建索引、写入ElasticSearch、探索性数据分析)

    Python读取多个excel文件(删除字段.数据格式转换.dataframe多表合并)并写入ElasticSearch实战(自动创建索引.写入ElasticSearch.探索性数据分析) 目录

  2. python与excel的关系-使用python对excle和json互相转换的示例

    python 版本:2.7 只是读取excel的话可以直接使用xlrd 1.excle to json 代码如下 # -*-coding:utf8 -*- import xlrd from colle ...

  3. Python 实现office单个文件或整个文件夹(word,ppt,excel)转换成PDF文件,并获取PDF文件页数

    Python 实现office单个文件或整个文件夹(word,ppt,excel)转换成PDF文件,并获取PDF文件页数 文件夹中获取需要转换的文件数,将其全部转换或可单独转换单个文件,并获取转成PD ...

  4. 【Python】使用python实现yaml转json,json转yaml,以及批量实现yaml与json文件互相转换

    文章目录 1. 安装yaml库 2. yaml转json 3. json转yaml 4. 批量将yaml与json文件互相转换 1. 安装yaml库 想要使用python实现yaml与json格式互相 ...

  5. python excel文件转换成字符串_python利用pandas将excel文件转换为txt文件的方法

    python将数据换为txt的方法有很多,可以用xlrd库实现.本人比较懒,不想按太多用的少的插件,利用已有库pandas将excel文件转换为txt文件. 直接上代码: ''' function:将 ...

  6. python对excel某一列去重-「总结篇」Python中所有的Excel操作技巧

    原标题:「总结篇」Python中所有的Excel操作技巧 Python对于Excel的操作是多种多样的,掌握了相关用法就可以随心所欲的操作数据了! 操作xls文件 xlrd(读操作): import ...

  7. python处理excel表格数据-利用Python处理和分析Excel表中数据实战.doc

    利用Python处理和分析Excel表中数据实战 [利用python进行数据分析--基础篇]利用Python处理和分析Excel表中数据实战 原创 2017年06月28日 15:09:32 标签: p ...

  8. python字符串写入excel-使用python将数据写入excel

    由于经常需要用到这方面的内容,所以要好好记录一下,省的以后老找了 使用的代码版本为 Python3 首先呢,数据是这个样子的 V04002 V01000 V04001 V10004 V12001 V1 ...

  9. Python使用openpyxl读写excel文件

    Python使用openpyxl读写excel文件 Python使用openpyxl读取excel文件中数据 Python使用openpyxl往excel文件中写入数据 Python使用openpyx ...

最新文章

  1. Rulo扫地机器人app_要买这样的扫地机器人 浦桑尼克扫地机器人评测
  2. 蓝桥杯审核要多久_商标审核要多久?
  3. 455. 分发饼干001(贪心算法+详解)
  4. 解决debug JDK source无法查看局部变量的问题
  5. Spring AOP(面向切面编程)
  6. 07.Qt程序的发布
  7. app商城源码_淘客多商城系统开发 APP软件开发 源码搭建
  8. 【信息系统项目管理师】第十六章 变更管理思维导图
  9. scipy短时傅里叶分析STFT
  10. oracle 实现自增序列
  11. ffmpeg中的时间单位以及时间转换函数(av_q2d av_rescale_q)
  12. 小学计算机课题研究方案,《小学信息技术课堂有效教学的探究》课题研究方案...
  13. 清华一日游-恰逢清华大学99周年校庆
  14. CSS绘制渐变黑白背景栏
  15. 一维数组——折半查找法
  16. OLLYDBG使用笔记
  17. 1.mysql 的安装
  18. 中控考勤机连服务器显示1007,中控智慧ZK-S1007动态人脸识别考勤门禁终端
  19. 计算机组装与维护我要自学网,【答疑】3D机械建模软件有哪些,3D机械建模一般用的是哪个软件? - 视频教程线上学...
  20. STM32启动代码学习

热门文章

  1. python罗马数字转换阿拉伯数字_20202427-张启辰《Python3初学:罗马数字转阿拉伯数字》...
  2. html文件的启示标记,某html学习心得分享.ppt
  3. Cohort Analysis Using Python
  4. WeRateDog---分析推特数据
  5. 晓宇哥新年力作!AI离线语音开关控制器
  6. Android 编译速度优化黑科技 - RocketX
  7. Windows 8.1下释放磁盘空间的指南
  8. 2014阿里巴巴实习生招聘-研发工程师笔试题/网络编程小结
  9. 设计标志性专辑封面的 5 个技巧
  10. 第九章 Mysql语言