本文编写于 1194 天前,最后修改于 1193 天前,其中某些信息可能已经过时。
Python OpenPyXl爬日历表内容生成线形列表
学校老师要给在校测温的志愿者颁发证书,现有值班表若干张,按照课表排列,单元格内格式为学院+姓名+手机号,需要生成excel,格式为学院+姓名,导出制作证书
测温安排如图,三个表,每一个表行数相同,都是9行,但列数不一定,单元格内排列为学院+姓名+手机,需要都提出来做一个格式

Python代码
直接上代码,具体看注释
import openpyxl as xl
import openpyxl.utils as xlut
from string import digits
import os
path = os.getcwd()
files = os.listdir(path)
folder = []
for index in range(len(files)):
if ".xlsx" in files[index]: # 去除非excel文件
folder.append(files[index])
# print(folder)
for xlname in folder: # 打开当前目录下每一个excel文件
# print(xlname)
# 实例化
wb = xl.load_workbook('{}{}'.format("./", xlname))
for name in wb.sheetnames: # 打开当前excel的每一个表
sheet = wb.get_sheet_by_name(name)
# print(sheet.title)
# print(sheet.max_column) # 列
# print(sheet.max_row) # 行
# maxr = int(sheet.max_row) # 行
maxc = int(sheet.max_column) # 列
remove_digits = str.maketrans('', '', digits)
punctuation = r"""!"#$%&'()*+,-./:;<=>?@[\]^_`{|}~“”?,!【】()、。:;’‘……¥·"""
dicts = {i: '' for i in punctuation}
punc_table = str.maketrans(dicts)
# # print(maxr)
# # print(xlut.get_column_letter(maxc))
maxx = str(xlut.get_column_letter(maxc))+str(9) # 数字转字母
# maxx = sheet.dimensions.split(":")[1]
# maxx = str("B")+str(sheet.max_column)
# print(maxx)
# print(sheet.dimensions.split(":")[1])
cells = sheet['B3': maxx] # 表格爬取范围是B3到最大的那列的第9行
for rowOfCellObjects in cells:
for cellObj in rowOfCellObjects:
# print(cellObj.coordinate)
temp1 = cellObj.value.translate(remove_digits) # 去除手机号
temp2 = temp1.translate(punc_table) # 去除标点
temp3 = temp2.replace(" ", "") # 去除空格
tempArr = temp3.split("\n")
if len(tempArr) > 1:
# print(tempArr)
for i in range(1, len(tempArr)):
print("{0:{2}<10}\t{1:{2}<10}".format(
tempArr[0], tempArr[i], chr(12288))) # 对齐
# print(cellObj.value)
# print('\n')
# print(wb.sheetnames)
输出结果

踩坑
openpyxl寻找最大的列的时候经常会报错
我还以为是缓存的原因,拼命打断点,然而没有什么卵用
最后发现excel上把觉得是空白的列删除,然后清除格式,比如合并单元格去掉啊之类的,之后就不会报错了
原来数据源也会出错