import openpyxl as l
import time
# 有对应操作的话,保存就好了,保存到硬盘上 。。。 wb.save(file_result_path)
file_open_path = r'D:\T\Documents\MobileFile\桌面\python学习\表\test_openpyxl.xlsx'
file_result_path = r'D:\T\Documents\MobileFile\桌面\python学习\表\result.xlsx'
wb = l.load_workbook(file_open_path) # 指定路径,打开工作簿
# ws = wb['Sheet1'] # 打开工作表
ws = wb['sheet_yzy1'] # 打开工作表
# -----------------------------------------------------------------
# wb = l.Workbook() # 新建 空的工作簿
# ws = wb['Sheet'] # 1_按照sheet名字 获取工作表
# ws = wb.active # 1_激活的工作表 获取工作表
# wb.worksheets # 获取所有的'sheet对象' 。。。可以接着下标,获取单个sheet对象
# wb.sheetnames #1_获取所有的'sheet名字' 可以接下标,看某个名字。
# ws.title #1_获取某个'sheet名字' 。。一般用title修改sheet名字
# wb.remove(wb['preSheet2']) # 删除工作表 。。。参数是sheet对象
# new_ws = wb.create_sheet('yzy1',0) # 新建工作表: 1(不必须)给sheet名字 会自动重命名为Sheet+数字 。。。2(不必须)还可以指定索引,默认在最后面添加。
# new_ws = wb.copy_worksheet(wb['Sheet1']) # 创建 表的副本,返回一个id不同的new_ws .。。会自动给新的sheet重命名: 'Copy'
# cell = ws.cell(1, 2) # 获取单元格对象
# cell_data = ws.cell(1, 2).value # 不是index 获取某个单元格的值,也可以修改
# for循环 也可以设置步长
# cell.row, cell.column # 获取单元格所在的行 和 列 不是index
'''
2023.10.03
'''
# 获取 范围内的单元格 (特别重要)
# cell_area = ws.iter_rows(min_row=1, max_row=3, min_col=1, max_col=3) # 最小行,最大行,最小列,最大列 ,按照顺序写的话,参数可省略 (不是index)
# for row in cell_area: # 拿到每一行的数据
# # print(row)
# for cell in row: # 一行内,每一个单元格的数据
# print(cell.value)
# -------
# print(ws.max_row) #最大的行数
# print(ws.max_column) #最大的列数
# ws.cell(r, 5).fill = l.styles.PatternFill(patternType='solid', fgColor='FFFF00') # 给单元格设置填充颜色
# ws.cell(r, 5).font = l.styles.Font(color='c00000') # 给单元格设置字体颜色
# 实例: C列文本和D列百分比的拼接
# for row in range(1, ws.max_row + 1):
# cell_data_C = ws.cell(row, 3).value # 2_指定单元格_纯数字,不是index
# cell_data_D = ws.cell(row, 4).value # 2_指定单元格_纯数字,不是index
#
# tmp = str(int(cell_data_D * 100)) + '%' # 因为D列是百分比,获取是小数,需要处理。
#
# data = cell_data_C + '(' + tmp + ')'
# ws.cell(row, 5, data) # 2_指定单元格_纯数字,不是index 可以直接写入数据
# -------------
'''
2023.10.04
'''
# 实例:读取txt(以空格分割的数据),然后把数据写入excel里。
txt_file = open(r'D:\T\Documents\MobileFile\桌面\python学习\表\test_txt_excel.txt', mode='r',
encoding='utf-8') # r是read
lines = txt_file.readlines() # 读取所有行
# 去掉 结尾的'\n',结果还是返回到lines里 (还是去掉\n吧,不然 '自动换行'打开的时候 会换行)
# for line in range(0, len(lines)):
# lines[line] = lines[line].split('\n')[0]
#
# col_first = ws.max_column + 2 # 和原来的数据 隔一列
# for row in range(len(lines)):
# row_data = lines[row] # 获取每一行的数据
# cell_data = row_data.split(' ') # 拿到空格分割后的数据列表
# # print(cell_data)
# for col in range(len(cell_data)):
# ws.cell(row + 1, col_first + col, cell_data[col]) # 写入数据
# ---------
# 打印出所有的sheet名字:
# print(wb.sheetnames)
# for i in wb.sheetnames: #循环的可以是列表
# print(i) #1_方法
# print(wb.worksheets)
# for i in wb.worksheets:
# print(i.title) # 2_方法
# print(str(i)[12:-2]) # 3_方法
# ----------
# 给所有sheet的名字前面,加pre
# for i in range(len(wb.worksheets)): # 1_方法
# wb.worksheets[i].title = 'pre' + wb.worksheets[i].title
# for i in wb.worksheets: # 2_方法
# i.title = 'pre' + i.title
# -------
# 对 开头不是pre的sheet表,进行删除:
# for sheet_name in wb.sheetnames:
# # print(sheet_name)
# # if sheet_name.find('pre', 0, 4) != -1: # 1_if
# if sheet_name[:3] != 'pre': # 2_if
# wb.remove(wb[sheet_name]) # 用worksheets不行,因为删除工作表之后,它会变化
# ---------------
'''
2023.10.05
'''
# 获取奇数行的数据:
# row_area = ws.iter_rows(1, ws.max_row, 1, ws.max_column) # 获取区域的单元格
# for row in row_area: # 整个奇数行 一行的单元格对象
# for cell in row:
# # print(cell.row)
# if cell.row % 2 == 1:
# print(cell.row, cell.column, cell.value)
# -------
# 获取C列数据,然后把数据 添加在最后一行。
# list_c = [] # 数据存到列表里,更容易操作
# row_area = ws.iter_rows(1, ws.max_row, 3, 3) # 获取C列
# # print('row_area: ', row_area)
#
# for row in row_area: # 一行的单元格对象
# # print('row_data: ', row_data)
# for cell in row:
# # print('cell.value: ', cell.value)
# list_c.append(cell.value)
# # print(list_c)
# ws.append(list_c) # 在sheet的最后一行,添加数据
# ------
'''
2023.10.06
'''
# 区域范围内的'空格' ,重新赋值。。。对<= 3的单元格,重新赋值。
# for row in range(1, ws.max_row + 1):
# # print(row)
# for col in range(1, ws.max_column + 1):
# cell_data = ws.cell(row, col).value
# # print(cell_data)
#
# # if str(cell_data) == 'None': # 1_'None'是NoneType类型,需要转化成str
# # ws.cell(row, col, 'yzy')
#
# if cell_data == None: # 2_或者直接None
# ws.cell(row, col, 'yzy')
#
# if cell_data != None and cell_data <= 3: # 需要先处理下None和str类型,直接参与计算会报错。
# ws.cell(row, col, str(ws.cell(row, col).value) + '(<= 3)')
# ----------
# 每一行累加,如果大于5,在最后的一列写>5
# sum = 0
# row_area = ws.iter_rows(2, ws.max_row, 2, ws.max_column) # 获取区域单元格
#
# for row in row_area:
# # print(row)
# for cell in row:
# # print(cell)
# sum += cell.value
# if sum > 5:
# ws.cell(cell.row, cell.column + 1, '>5') # 获取单元格所在的行 he 列 ,不是index
# sum = 0
# ------
# 把B列'数学'的 不同值的行,分别写在很多个sheet里: ...功能类似于筛选
# row_area = ws.iter_rows(2, ws.max_row, 2, 2) # 获取区域单元格_B列
# list_B = [] # 数据类型:单元格数值-这个单元格所在的行号 (存储双列的数据)
# for row in row_area: # 给list_B赋值
# for cell in row:
# # print(cell.value)
# list_B.append(str(cell.value) + '-' + str(cell.row)) # 获取单元格所在的行
#
# str_different_values = '' # 看B列'数学'不同的数值,有多少个。
# for i in list_B:
# values = i.split('-')[0]
# # print(type(values))
# if str_different_values.find(values) == -1:
# str_different_values += values + ',' # str里没有这个数据,就添加到str里
# new_ws = wb.create_sheet() # 有多少个不同的值,就创建多少个sheet,并以值的名字命名。
# new_ws.title = '数学_' + str(values)
# # print('str: ' + str_different_values)
#
# for i in list_B: # 写数据
# cell_value = int(i.split('-')[0]) # 单元格里的值
# row = int(i.split('-')[1]) # 这个单元格所在的行号
#
# sheet_name = '数学_' + str(cell_value)
# new_ws = wb[sheet_name] # 选中这个要插入数据的sheet
# # print(new_ws)
#
# row_area = ws.iter_rows(row, row, 1, ws.max_column) # 获取区域单元格_B列
#
# list_data = []
# for row in row_area: # 获取原来的表,整行的数据
# for cell in row:
# list_data.append(cell.value)
# # print(list_data)
# new_ws.append(list_data) # 在sheet的最后一行,写入数据
# -----------
# ------------------------------------------------------------------
# EndTag的生成:
update_time_EndTag = time.strftime('%Y-%m-%d %H:%M:%S', time.localtime()) # 格式化时间
date_show_row_EndTag = ws.max_row + 2 # 日期展示的行号
ws.merge_cells(start_row=date_show_row_EndTag, end_row=date_show_row_EndTag, start_column=1, end_column=5) # 合并单元格
fill_color_EndTag = l.styles.PatternFill(patternType='solid', fgColor='FFFF00') # 填充颜色
align_method_EndTag = l.styles.Alignment(horizontal='left', vertical='center') # 对齐方式
ws.cell(date_show_row_EndTag, 1, 'EndTag-最后生成时间:' + str(update_time_EndTag)) # 给单元格赋值
ws.cell(date_show_row_EndTag, 1).fill = fill_color_EndTag # 给单元格设置填充颜色
ws.cell(date_show_row_EndTag, 1).alignment = align_method_EndTag # 给单元格设置对齐方式
wb.save(file_result_path)
Python的openpyxl库:代码
于 2023-10-06 20:03:45 首次发布