python_openpyxl_入门

jefxff 153,651 2020-02-04

python 库之 openpyxl 入门

openpyxl是一个用于读取/写入Excel 2010 xlsx / xlsm / xltx / xltm文件的Python库。

openpyxl 配合爬虫小程序将爬取到的数据保存为Excel文件格式, 便于分析, 或者将一些程序产生的数据保存到Excel中以备不时之需, 很有用! 值得好好学习一下, 现在我入门先!

安装

使用pip安装 openpyxl, 同时安装 pillow 库.

    pip install openpyxl
    pip install pillow

使用

1. 导入库并创建一个新的工作簿
# 导入Workbook类
from openpyxl import Workbook

# 实例化一个Workbook对象, 创建一个工作簿
wb = Workbook()

# 获取活动工作表, 新创建的工作簿默认是第一张工作表即"sheet"
ws = wb.active

# 创建新的工作表, wb.create_sheet第一个参数是工作表的title, 第二个参数可以指定工作表的下标, 默认从 0 开始
ws1 = wb.create_sheet(title="Mysheet1")
# ws2第二个参数 "0", 会将表插入到工作簿的第一张, 但是当前活动表还是ws表
ws2 = wb.create_sheet(title="Mysheet2", 0)

# 查看新创建表的 title
ws1_name = ws1.title  # 'Mysheet1'

# 使用 Workbook.sheetname 属性查看工作簿的所有工作表的名称
all_sheet_names = wb.sheetnames
# print(all_sheet_names)  # ['Mysheet2', 'Sheet', 'Mysheet1']


## 读写一个单元格数据
c = ws['A1']
print(c) # <Cell 'Sheet'.A1>
# 读取'A1'单元格的值
# print(c.value)  # None 因为新创建的表, 还未赋值
print(ws['A1'].value)  # 和c.value效果一样, 但是还是觉得这样用直接

# 给 'A1' 单元格赋值
ws['A1'] = "id"
print(ws['A1'].value) # 'id'

ws['B1'] = 'name'
ws['C1'] = 'age'


## 读写多个单元格的数据(使用切片访问单元格范围)
cells = ws['A1':'C2']

# 要添加的数据
content = [1, 'jeff', 26]
# 使用 append函数 添加一行数据, 每执行一次, 向下移动一行添加数据
ws.append(content)

# 读取添加的数据
for rowOfCellObject in ws['A1':'C2']:
    for cellObject in rowOfCellObject:
        print(cellObject.coordinate, cellObject.value)
    print('...END OF ROW...\n') 
### 输出如下:
# A1 id
# B1 name
# C1 age
# ...END OF ROW...

# A2 1
# B2 jeff
# C2 26
# ...END OF ROW...
# ws['B1'] = 'name'
# ws['C1'] = 'age'

# 保存工作簿, wb.save() 方法接收一个参数, 即保存文件的位置即名称
wb.save(r"C:\Users\Administrator\Desktop\Excel_demo.xlsx")

2. 加载一个已经存在的工作簿
# 导入库
from openpyxl import load_workbook

# 加载已有工作簿, 使用load_workbook
wb = load_workbook(r"C:\Users\Administrator\Desktop\log.xlsx")

# 查看工作簿的所有工作表
print(wb.sheetnames) # ['wechat_seeded', 'Sheet2', 'Sheet3']

# 获取active表
print(wb.active) # <Worksheet "wechat_seeded">

# ## 接下来的读写单元格数据和 1.中的一样
3. 单元格中使用日期类型
# 导入库
import datetime
from openpyxl import Workbook 

# 创建工作簿
wb = Workbook()

# 获取当前的表
ws = wb.active

ws['A1'] = "Time"
# 将A2单元格的日期设置为当前的日期, 并按格式显示
ws['A2'] = datetime.datetime.now().strftime('%Y-%m-%d')
ws['A3'] = datetime.datetime(2018, 7, 21)
# print(ws['A2'].value) # '2019-07-31'
# print(ws['A3'].value)  # "2018-07-21 00:00:00"
4. 单元格中使用简单的公式
# 导入库
from openpyxl import Workbook 

# 创建工作簿
wb = Workbook()

# 获取当前的表
ws = wb.active

ws["A1"] = 1
ws["B1"] = 2
# 给C1单元格直接赋值为需要在excel中的公式
ws["C1"] = "=SUM(A1:B1)"
print(ws["C1"].value)  # 显示的是"=SUM(A1:B1)" 但是在Excel表中显示的是计算结果
5. 批量修改已有excel

批量打开文件夹中的excel工作簿以及工作簿中的所有工作表, 在已有工作表的下面添加固定的文字

# coding=utf-8

import os
import openpyxl
# 用于设置自动换行, 左对齐
from openpyxl.styles import Alignment

# 根路径, 将所有的excel相关的文件夹放在此文件夹下
path = 'D:\File\Python\Python_Excel\Excel_Self\Contents'
# 需要写入单元格的值
strs = "多谢惠顾!请贵公司核对后签字盖章并在次月5日前将原件交回本公司,否则,基于本公司信用管理政策,将很可能影响到后续的供货安排。为了能向贵公司提供更好的产品和服务,需要您的配合与支持,谢谢!"


def get_excel_path(path:str) -> list:
    '''
        传入str类型的路径, 返回的是该路径下的已.xlsx结尾的文件的集合
    '''
    #  存放excel路径的列表
    result_excels = []
    
    # 对根路径进行迭代
    for each_entry in os.scandir(path):
        # 判断文件是不是目录
        if each_entry.is_dir():
            # 如果是目录, 则将该目录传递给函数, 递归调用
            result_excels += get_excel_path(each_entry.path)

        # 如果文件是一个普通文件, 判断是不是excel文件, 如果是就加入到result_excels
        else:
            if each_entry.path.endswith('.xlsx'):
                result_excels.append(each_entry.path)

    return result_excels


def write_to_excel(result_excels:list):
    '''
        传入一个excel工作簿的列表, 打开每一个工作簿的工作表, 完成合并单元格, 赋值等工作
    '''
    # 这个for 循环打开result_excels列表中的每一个excel
    for each_excel in result_excels:
        print(each_excel)
        wb = openpyxl.load_workbook(each_excel)
        # 获取所有的工作表
        sheets = wb.sheetnames
        
        # 获取每一个sheet, 并且在最大行的后面增加固定的值
        for each_sheet in sheets:
            # 获取工作表
            ws = wb[each_sheet]
            # 获取工作表最大行(有内容的最大行数)加2行的行数
            start = ws.max_row + 2
            # 合并单元格
            ws.merge_cells(start_row=start, start_column=1, end_row=start, end_column=10)
            # 设置单元格左对齐, 上下居中, 自动换行
            alignment = Alignment(horizontal="left", vertical="center", wrap_text=True)
            ws.cell(row=start, column = 1).alignment = alignment
            # 设置行高
            ws.row_dimensions[start].height = 30
            # 给合并后的单元格赋值
            ws.cell(row=start, column = 1).value = strs
            # 设置确认, 审核, 制单的单元格
            ws.cell(row=start+1, column=1, value="客户名称确认(签字并盖章):")
            ws.cell(row=start+1, column=5, value="审核:")
            ws.cell(row=start+1, column=9, value="制单:TLL")
        # 保存
        wb.save(each_excel)

# 调用函数
write_to_excel(get_excel_path(path))

6. 暂时先学到这里, 碰到实际需求在学习

学习网站: openpyxl文档


# python