python3处理excel脚本
需要用到的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’)
#數據導入
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,“》已加載”)
if name == ‘main’:
process()
文件見附件
總結
以上是生活随笔為你收集整理的python3处理excel脚本的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: vue项目使用预渲染 进行seo优化
- 下一篇: iOS UIScrollView 无法滚