首先,导入openpyxl库中的读取和新建文件包(比较官方的名称我没有查,就按照好理解的方向这样说),文中关于行和列的理解都是个人想法,可能有和读者不同之处。
先详细说怎么样读取单个excel文件,批量在后边写。
excel表格格式如下,需要弄清楚的就是excel文件路径,以及内部工作表的名称,两者均为字符串格式:
此处需要注意大小写的问题,严格按照下边代码中的大小写键入
os库用于后边批量处理
from openpyxl import load_workbook, Workbook #读取=加载, 新建
import os
1、读取已存在的excel文件
path = r'E:\pythonTest\2021-12-31.xlsx'
wb = load_workbook(path)
print(wb)
运行结果:
<openpyxl.workbook.workbook.Workbook object at 0x000002444BC60FD0>
显示一个对象的形式
根据文件格式,读取其中工作表的内容
sheet_005 = wb['0.05m']
print(sheet_005)
print(type(sheet_005))
运行结果:
<Worksheet "0.05m">
<class 'openpyxl.worksheet.worksheet.Worksheet'>
此时,sheet_005是一个元组对象,那么要读取其中的数据(这里可能有其他的方式,我就直接写自己用过的,没有详查)需要对里边的数据进行定位,我因为处理的关系,按行读取和按列分别读取,以及读取二维的情况
按行读取:
rows = sheet_005['b1:j1']
#得到的内容是1行9列
for row in rows:
for i in range(9):
print(row[i].value)
运行结果:
45.3456
46.3456
47.3456
48.3456
49.3456
50.3456
51.3456
52.3456
53.3456
按列读取:
cols = sheet_005['a2:a10']
#得到的内容是9行1列
for col in cols:
print(col[0].value)
运行结果:
23.5167
24.5167
25.5167
26.5167
27.5167
28.5167
29.5167
30.5167
31.5167
读取二维的情况:
path = r"E:\pythonTest\2021-12-31.xlsx"
wb = load_workbook(path)
sheet_005 = wb['0.05m']
data = sheet_005['b2:j10']
for d in data:
for i in range(9):
if d[i].value != None:
print(d[i].value)
运行结果:
0.302119106054306
0.3005659878253937
0.2625385522842407
0.2840092778205872
0.3061999976634979
0.3017207086086273
0.3038829267024994
0.3220527768135071
0.3237947821617126
0.3207892179489136
0.3028714954853058
0.2637502551078796
0.2534836530685425
0.253666490316391
0.266710102558136
0.2634153366088867
0.2857251763343811
0.3227577209472656
0.3185969889163971
0.3055056631565094
0.2600562572479248
0.2565443217754364
0.2556202709674835
0.2537874281406403
0.2476959973573685
0.2596182227134705
0.2735748291015625
0.2842697501182556
0.2630136013031006
0.2532234787940979
0.2525502741336823
0.2542127370834351
0.2646780908107758
0.2624187767505646
0.2621198892593384
0.3370471298694611
0.3249744772911072
0.3106313049793243
0.2642513513565063
0.3019898533821106
0.2691900730133057
0.257877379655838
0.2709497213363647
0.2727532088756561
0.3150153458118439
0.3248605132102966
0.2938291728496552
0.2970251739025116
0.2867810130119324
0.3157626986503601
0.2825500667095184
0.2774896025657654
0.2862694561481476
0.2954988181591034
0.2895880043506622
0.2916149795055389
0.2997244298458099
0.299854189157486
0.3112888336181641
0.2700950503349304
0.254077821969986
0.2723859548568726
0.2887678444385529
0.2891480326652527
0.2959722280502319
0.3032049238681793
0.2998882830142975
0.2962991893291473
0.2498120218515396
0.257283478975296
0.3057393729686737
0.27692911028862
0.2761669456958771
0.2838139533996582
0.2868392765522003
0.2837753891944885
0.2908490598201752
0.2874066829681396
0.2941864132881165
0.2949732542037964
2、创建一个excel文件,并且将内容写入
new_path = r"E:\pythonTest\2022-12-08.xlsx"
new_wb = Workbook()
#新建一个sheet,title可以对sheet名称进行修改
new_sheet_005 = new_wb.create_sheet(title = '0.05m',index = 0)
new_sheet = new_wb.create_sheet(title='这是一个工作表', index = 1)
#可以对工作表中的内容写入
new_sheet_005['b3'] = '1'
#存储
new_wb.save(new_path)
运行结果:
3、批量对文件进行读取
这里就是将上文中 path 的值写到文件夹即可,利用 os 库中的 listdir() 函数对文件进行遍历,从而实现批量读取:
还有要注意的地方就是在遍历过程中,file 所代表的字符串只有文件名,但是 load_workbook() 函数要读取的是文件完整的目录,因此需要将 path 和 file 进行拼接,在这里注意 // 的转义问题。
path = r"E:\pythonTest"
for file in os.listdir(path):
print(file)
wb = load_workbook(path+'//'+file)
sheet_005 = wb['0.05m']
print(sheet_005['b3'].value)
运行结果:
2021-12-31.xlsx
0.3207892179489136
2022-12-08.xlsx
1
批量写入
类似的操作,但是要考虑到根据文件的内容生成新的不同文件名,否则同名文件会覆盖
path = r"E:\pythonTest"
for file in os.listdir(path):
new_file_name = 'new' + file[0:10] + '.xlsx'
new_wb = Workbook()
#此处index设置与前边有所不同
new_sheet1 = new_wb.create_sheet(title='0.05m', index = 1)
new_sheet2 = new_wb.create_sheet(title='这是一个工作表', index = 0)
new_sheet1['d3'].value = 45
for i in range(1,10):
for j in range(1,10):
new_sheet1[i][0].value = i*j
new_wb.save(path+'//'+new_file_name)
这里有一点我不太清楚,就是new_sheet1[i][0] 这里的0只能写0,我不太理解这里,但是够我用了,所以没有深究,如果有小伙伴看到这里能给我解答的话,不胜感谢。
运行结果: