本文编写于 1407 天前,最后修改于 1406 天前,其中某些信息可能已经过时。

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上把觉得是空白的列删除,然后清除格式,比如合并单元格去掉啊之类的,之后就不会报错了

原来数据源也会出错

参考

  1. Openpyxl 教程
  2. python去除文本中的标点