时间比较仓促, 所以整理的比较不全面, 以后会推出我经常用的一些方法,
读取=
1.精准读取
1.1 按照单元格的表示读取 例如 A1
from openpyxl import load_workbook
#你需要打开文件的路径
wb = load_workbook(r'C:\Users\hcf\Desktop\a.xlsx')
# 你打开文件之后显示的sheet页, (当然你也可以根据wb.get_sheet_by_name('sheet页名称')获取
#或者 wb.get_sheet_names() 然后遍历获取, 以后介绍)
ws = wb.active
aa = ws['A1'].value
print(aa)
1.2 按照单元格坐标获取 (row=1, column=1)
from openpyxl import load_workbook
wb = load_workbook(r'C:\Users\hcf\Desktop\a.xlsx')
ws = wb.active
aa = ws.cell(row=1,column=1).value
print(aa)
1.3 公式操作:
from openpyxl import load_workbook
#你需要打开文件的路径
wb = load_workbook(r'C:\Users\hcf\Desktop\a.xlsx')
# 你打开文件之后显示的sheet页, (当然你也可以根据wb.get_sheet_by_name('sheet页名称')获取
#或者 wb.get_sheet_names() 然后遍历获取, 以后介绍)
ws = wb.active
ws['A1'] = '=B1&C1&D1'
print(aa)
2.大范围读取
2.1 全部行的遍历获取
from openpyxl import load_workbook
wb = load_workbook(r'C:\Users\hcf\Desktop\a.xlsx')
ws = wb.active
#从第一行获取
for row in ws.rows:
for col in row:
print(col.value)
2.2指定行的便利获取
from openpyxl import load_workbook
wb = load_workbook(r'C:\Users\hcf\Desktop\a.xlsx')
ws = wb.active
#注意这里虽然也是从第一行获取, 但是转换成list 之后, 不要忘记集合的下标是从0开始的
for row in list(ws.rows)[0:1]:
for col in row:
print(col.value)
根据一个简单的实例详细介绍
改程序做的是一个简单的拼合功能, 将省市县拼接成一段详细的地址, 将经纬度拼接成一个完整的经纬度
程序的入口在最下面的 if name == ‘main’:
from openpyxl import load_workbook
from sys import argv
import os
# 该命令是在外部调用的时候接收参数使用的
file1 = argv[1]
# file1 = r"D:\proj\code\2to3\test\input\input_2.xlsx"
file2 = argv[2]
# file2 = r"D:\proj\code\2to3\test\output_2.xlsx"
def joint_address_lat_long(input_file, name):
# 打开input文件
file = load_workbook(input_file)
# 获取第一个sheet页
sheet_names = file.get_sheet_names()
table = file.get_sheet_by_name(sheet_names[0])
# 因为range()方法是左闭右开的方法, 所以需要在最大行上加1, 才会遍历全部的行数, 虽然里面的3 在其他的集合中读取的是第4个值, 但是在操作excel中, 坐标是从1 开始的.这一点要谨记......
for col in range(3, table.max_row + 1):
# 这是很简单的公式拼合方式
table['X' + str(col)] = '=U' + str(col) + '&V' + str(col) + '&W' + str(col)
table['AE' + str(col)] = '=Y' + str(col) + '+Z' + str(col) + '/60+AA' + str(col) + '/3600'
table['AF' + str(col)] = '=AB' + str(col) + '+AC' + str(col) + '/60+AD' + str(col) + '/3600'
if os.path.isdir(file2):
print('......开始存储文件......')
output_file = os.path.join(file2, name)
file.save(output_file)
print('......文件存储成功......')
else:
file.save(file2)
print('......执行完毕......')
def check_path():
# 判断 file1 是不是一个目录文件
if os.path.isdir(file1):
# 遍历这个目录文件
for root, dirs, files in os.walk(file1):
for name in files:
# 建议不要使用(root +'/'+name)这种路径拼合方式, openpyxl 提供了路径拼合的方法
input_file = os.path.join(root, name)
if (not input_file.startswith('~$')) and input_file.endswith('.xlsx'):
joint_address_lat_long(input_file, name.replace('input', 'output'))
else:
joint_address_lat_long(file1)
if __name__ == "__main__":
check_path()
可能很多接触不多的小伙伴, 看到上面的代码会很头疼, 后面我会介绍一些具体的方法, 其实细细的理解不是很难
打开文件 : wb = load_workbook(r’C:\Users\hcf\Desktop\a.xlsx’)
获取文件中的sheet : ws = wb.active(获取打开文件显示的sheet页)
sheet_name = wb.get_sheet_names() # 得到的是这个文件所有的sheet名称, 需要自己去遍历
ws = wb.get_sheet_by_name(sheet_name) # 根据sheet 名称获取sheet 对象
获取最大行 : row_num = sheet.max_row
获取最大列 : col_num = sheet.max_column
其实还有一个很简单的方法 , 当你拿到了 sheet 对象的时候, 可以 help(sheet) 运行脚本, sheet 所具有的所有的方法都会打印到控制台上
获取所有的行对象
sheet.rows
可以进行遍历(最上面有使用这个方法)
for row in ws.rows:
for col in row:
print(col.value)
给单元格设置底色
from openpyxl import load_workbook
from openpyxl.styles import PatternFill
from openpyxl import Workbook
# wb = Workbook()
wb = load_workbook(r'C:\Users\hcf\Desktop\a.xlsx')
redFill = PatternFill(start_color='00FF00', end_color='00FF00', fill_type='solid')
ws = wb.active
ws.cell(row=1, column=1).fill = redFill
wb.save(r'C:\Users\hcf\Desktop\a.xlsx')
=写入==
其实上面也有写入的部分, 但是有一点很重要, 写入的时候必须要保存的, 否则是不会生效的, 理由就不用说了吧
=新建==
from openpyxl import Workbook
wb = Workbook()
# 这就相当于创建了一个新的excel,
# 可以进行所有通过load_workbook()打开的excel 同样的方法, 上面的代码有这个方法的注释
# 最后保存的时候
wb.save('详细路径文件名也需要定义')
以后的更新会根据实际的例子来进行…