需要用到的python库:
处理xlsx文件: openpyxl
处理xls文件 :xlrd,xlwt,xlutils

需求:当前层级1和层级2交叉出现在excel表格中,层级关系不够明显,为了易读性,需要将层级1的子级(层级2)取出关心的字段,放到层级1的同一行尾部。若有多个子集,放在不同的行,效果如图2

代码:
两个文件:importer.py,common.py

common.py代码:-----------------------------------------------

#导入excel文件名
SRC_FILE_NAME = “ZX222021AllWorkItems1645432725013.xlsx”
DST_FILE_NAME = “ZX222021AllWorkItems.xlsx”
DST_SHEET_NAME = “ZX222021AllWorkItems”

importer.py代码:-----------------------------------------------

#!/usr/bin/env python3
#-- coding: utf-8 --

import openpyxl
from openpyxl import load_workbook
from openpyxl import Workbook
from openpyxl.styles import Font, Border, Alignment, PatternFill, Side
import common as c
import os, sys
import xlrd
import xlwt
from xlutils.copy import copy
#列表形式保存源数据
def func_ws_data_to_list(ws_src, list_src):
for row in ws_src.rows:
tmp_list = list()
for cell in row:
tmp_list.append(cell.value)
list_src.append(tmp_list)
del list_src[0]

#设置表项格式
def func_ws_dst_style_set(ws_dst):
i = 1
#标题
title_list = [“FPGA标识”,“FPGA标题”,“状态”,“FPGA标识”,“模块”,“标号”,“标题”]
ws_dst.append(title_list)
while i < 8:
ws_dst.cell(row=1, column=i).font = Font(name =‘宋体’ ,size = 16)
ws_dst.cell(row=1, column=i).alignment = Alignment(vertical=‘center’)
ws_dst.cell(row=1, column=i).fill = PatternFill(“solid”, fgColor=“C8C8C8”)
ws_dst.cell(row=1, column=i).border = Border(left =Side(border_style=‘thin’,color=‘000000’),
right =Side(border_style=‘thin’,color=‘000000’),
top =Side(border_style=‘thin’,color=‘000000’),
bottom=Side(border_style=‘thin’,color=‘000000’))
i += 1
#行高
ws_dst.row_dimensions[1].height = 36
#列宽
ws_dst.column_dimensions[‘A’].width = 18
ws_dst.column_dimensions[‘B’].width = 56
ws_dst.column_dimensions[‘C’].width = 9
ws_dst.column_dimensions[‘D’].width = 18
ws_dst.column_dimensions[‘E’].width = 10
ws_dst.column_dimensions[‘F’].width = 20
ws_dst.column_dimensions[‘G’].width = 56

#获取每个层级1对应的层级2的个数
def func_next_level_num_get(list_src, list_map):
list_len = len(list_src)
i = 0
ws_col_idx = 0 #层级关系所在列
level2_num = 0
while i < list_len:
level = list_src[i][ws_col_idx]
if (i + 1 < list_len):
level_next = list_src[i+1][ws_col_idx]
else:
level_next = 1 #最后一行一定没有子级,可以认为是1
if (“1” == level):
if (“1” == level_next):
list_map.append(0)
else:
level2_num = level2_num + 1
else:
if (“2” == level_next):
level2_num = level2_num + 1
else:
list_map.append(level2_num)
level2_num = 0
i = i + 1
#统计level1的子级个数
print("level1 num = ", len(list_map))
i = 0
while i < 20:
if(list_map.count(i) > 0):
print("number of level2 = “, i, " :”, list_map.count(i))
i += 1

#写目的xlsx文件
def func_xlsx_wr(wb_dst, ws_dst, list_src, list_map):
level1_num = 1 #level1固定只有1条
level2_num = 0 #level2条数
level1_row = 2
level2_row = 2
wr_num = 0
list_idx = 0
i = 0
title_str_full = “”
title_str_part = “”
tmp_str = “”
title_col = 4 #title所在列(列索引从0开始)
str_beg_idx = 0
str_end_idx = 0
for item in list_map:
wr_num = int(item) + 1 #本次需要从列表中读取多少个元素
level2_num = wr_num - level1_num
while i < wr_num:
if i == 0: #写level1
ws_dst.cell(row = level1_row, column = 1).value = list_src[list_idx + i][3] #写第1列
ws_dst.cell(row = level1_row, column = 2).value = list_src[list_idx + i][4] #写第2列
ws_dst.cell(row = level1_row, column = 3).value = list_src[list_idx + i][5] #写第3列
else:
#写level2
if level2_num < 2:
level2_row = level1_row
else:
level2_row = level1_row + i - 1 #第一轮i加了1,这里减掉
#写FPGA标识
ws_dst.cell(row = level2_row, column = 4).value = list_src[list_idx + i][3]
#截取拆分字符串
title_str_full = list_src[list_idx + i][title_col]
#print(title_str_full)
str_beg_idx = int(title_str_full.find(“】”)) + 1
str_end_idx = int(len(title_str_full))
title_str_part = title_str_full[str_beg_idx:str_end_idx]
#截取COP
str_beg_idx = title_str_part.find(“【”)
str_end_idx = title_str_part.find(“】”)
tmp_str = title_str_part[str_beg_idx:str_end_idx + 1] #字符串截取左闭右开,右边需要加1
ws_dst.cell(row = level2_row, column = 5).value = tmp_str
#截取标号
str_beg_idx = title_str_part.find(“TR”)
if str_beg_idx < 0:
None #无标号,则都是标题
else:
#str_end_idx = title_str_part.find(" ")
str_end_idx = str_beg_idx + 13
tmp_str = title_str_part[str_beg_idx:str_end_idx + 1]
ws_dst.cell(row = level2_row, column = 6).value = tmp_str
#截取标题
str_beg_idx = str_end_idx + 1
str_end_idx = len(title_str_part)
tmp_str = title_str_part[str_beg_idx:str_end_idx + 1]
tmp_str.lstrip(‘’)
ws_dst.cell(row = level2_row, column = 7).value = tmp_str
i += 1
if (wr_num < 3):
level1_row += 1
else:
#合并单元格并居中
ws_dst.merge_cells(start_column = 1, end_column=1, start_row=level1_row, end_row=level2_row)
ws_dst.merge_cells(start_column = 2, end_column=2, start_row=level1_row, end_row=level2_row)
ws_dst.merge_cells(start_column = 3, end_column=3, start_row=level1_row, end_row=level2_row)
ws_dst.cell(row=level1_row, column=1).alignment = Alignment(vertical=‘center’)
ws_dst.cell(row=level1_row, column=2).alignment = Alignment(vertical=‘center’)
ws_dst.cell(row=level1_row, column=3).alignment = Alignment(vertical=‘center’)

        level1_row += level2_numi = 0list_idx += wr_num

#数据导入
def func_xlsx_data_transfer(wr_src, ws_dst, wb_dst):
list_src = list()
list_map = list()
func_ws_data_to_list(wr_src, list_src)
#print(len(list_src))
func_next_level_num_get(list_src, list_map)
func_xlsx_wr(wb_dst, ws_dst, list_src, list_map)

def process():
#打开源文件
wb_src = load_workbook(c.SRC_FILE_NAME)
wss_src = wb_src.worksheets
print(len(wb_src.sheetnames))
ws_src = wss_src[0]
print(“xlsx文件《”,c.SRC_FILE_NAME,“》已加载”)

#新建文件wb_dst
wb_dst = openpyxl.Workbook()
ws_dst = wb_dst.create_sheet(c.DST_SHEET_NAME, 0)
#设置表格格式
func_ws_dst_style_set(ws_dst)
wb_dst.save(c.DST_FILE_NAME)
#进行数据导入
func_xlsx_data_transfer(ws_src, ws_dst, wb_dst)
wb_dst.save(c.DST_FILE_NAME)
wb_dst.close()
print("导入已完成")

if name == ‘main’:
process()

文件见附件

python3处理excel脚本相关推荐

  1. python怎么读取excel某一行某一列-python3读取excel文件只提取某些行某些列的值方法...

    今天有一位同学给了我一个excel文件,要求读取某些行,某些列,然后我试着做了一个demo,这里分享出来,希望能帮到大家: 首先安装xlrd: pip3 install xlrd 然后上代码: imp ...

  2. python读取excel某一行内容-python3读取excel文件只提取某些行某些列的值方法

    今天有一位同学给了我一个excel文件,要求读取某些行,某些列,然后我试着做了一个demo,这里分享出来,希望能帮到大家: 首先安装xlrd: pip3 install xlrd 然后上代码: imp ...

  3. python3读取excel数据-python3读取Excel表格数据的代码分享

    python3 读取Excel表格中的数据 需要先安装openpyxl库 通过pip命令安装: pip install openpyxl 源码如下: #!/usr/bin/python3 #-*- c ...

  4. python3读取excel数据-python3 读取Excel表格中的数据

    需要先安装openpyxl库 通过pip命令安装: pip install openpyxl 源码如下: #!/usr/bin/python3 #-*- coding:utf-8 -*- import ...

  5. python3操作excel(xls与xlsx版本的爱恨情仇)

    python3操作excel 背景 大概操作说明 操作xls的代码 背景 本来一直是使用go来搞的.毕竟我不会py.但是excel文件格式比较久,是xls的.目前go语言操作xls存在问题,就是某单元 ...

  6. 【Python数据分析】Python3操作Excel(二) 一些问题的解决与优化

    [Python数据分析]Python3操作Excel(二) 一些问题的解决与优化 参考文章: (1)[Python数据分析]Python3操作Excel(二) 一些问题的解决与优化 (2)https: ...

  7. Python开发 之 Python3读写Excel文件(较全)

    Python3读写Excel文件 1.Python中几种常用包比较 2.用xlrd包读取Excel文件 2.1.用法 2.1.1.引用包 2.1.2.打开文件 2.1.3.获取你要打开的sheet文件 ...

  8. 大新闻!微软正考虑添加 Python 为官方的 Excel 脚本语言

    (点击上方蓝字,快速关注我们) 来源: 开源中国 www.oschina.net/news/91595/python-as-an-official-scripting-language-to-exce ...

  9. python3读取excel数据-Python3读取和写入excel表格数据的示例代码

    python操作excel主要用到 xlrd 和 xlwt 这两个库,xlrd读取excel表格数据, 支持 xlsx和xls格式的excel表格 :xlwt写入excel表格数据: 一.python ...

最新文章

  1. mysql replication延迟_MySQL Replication--复制延迟01--源码瞎猜
  2. 计算机专业好的211大学6,计算机专业好的985大学有哪些?附985211计算机大学名单排名...
  3. C++ (14) 异常处理
  4. SageMaker使用托管容器训练本地网络模型
  5. ASP.NET Page和Response 输出js的区别
  6. 结合领域驱动设计的SOA分布式软件架构
  7. 【JZOJ4861】【NOIP2016提高A组集训第7场11.4】推冰块
  8. 抓取新浪的每日星座运势
  9. 流处理开源框架Flink原理简介和使用
  10. 动态规划——最长公共子序列(洛谷P1439)
  11. 【Mac】Mac下SSH免密登录localhost
  12. WPF 图片splashScreen效果
  13. 【转】设计模式六大原则(1):单一职责原则
  14. android 蓝牙通讯测试工具,Android Bluetooth 学习(2)应用层实现蓝牙设备查找、tcp_ip通信...
  15. RecyclerView学习(二)之缓存探索
  16. Xmanager中的Xbrowser怎么使用?
  17. 懒人的findviewbyid
  18. FileSystemWatcher的Created事件问题
  19. matlab 模拟 峰信号
  20. 使用artisan命令创建控制器

热门文章

  1. java 佛祖保佑_佛祖保佑,永无bug
  2. 目标跟踪之数据标注软件ViBAT使用指导
  3. Context-Free Grammar及形状规则集
  4. 站群服务器金手指排名稳定,黑帽seo手法使用金手指:黑帽SEO,常见的SEO作弊手...
  5. 北京交警二环路机动车道“瘦身”,最高“礼遇”骑行人
  6. win10 labelme 使用记录
  7. 南充中等计算机专业学校排名,南充计算机/电脑学校哪里好|南充外国语中等专业学校计算机应用|顺庆计算机学校怎么样|南充中专学校...
  8. iPhone屏蔽IOS更新、iPhone系统更新的提示(免越狱,有效期更新至2021年)
  9. 小试ESP8266(一) 一只电阻, 几条语句, 摆脱深度睡眠反复重启的困扰
  10. 微信公众号开发者原生态的servlet