一、需求:
合并xlsx文件
二、思路:
- 使用openpyxl读取工作表,用ws.values()方法将读取数据转为生成器对象 ;
- 将生成器对象转换为dataframe格式;
- 进行合并,存入Excel中。
三、ws.values()方法介绍
(1) ws.values()方法用于获取工作表中的所有单元格的值。它返回一个生成器对象
,每个元素都是一个包含每行单元格值的元组
。
例如,假设有一个名为"Sheet1"的工作表,包含以下数据:
A | B | C
1 | 2 | 3
4 | 5 | 6
7 | 8 | 9
使用ws.values()方法将返回一个生成器对象,其中每个元素都是包含每行单元格值的元组。可以通过循环遍历生成器对象来获取每行的值。
import openpyxl
wb = openpyxl.load_workbook('example.xlsx')
ws = wb['Sheet1']
for row in ws.values():
print(row)
输出:
(1, 2, 3)
(4, 5, 6)
(7, 8, 9)
(2) ws.iter_rows()方法用于遍历工作表的每一行,并返回每行中的单元格对象。它也可以用于获取每行的值,但需要额外的处理来提取每个单元格的值。
import openpyxl
wb = openpyxl.load_workbook('example.xlsx')
ws = wb['Sheet1']
for row in ws.iter_rows(values_only=True):
print(row)
输出:
(1, 2, 3)
(4, 5, 6)
(7, 8, 9)
注:两个方法区别在于使用ws.values()方法可以直接获取每行的值作为元组,而ws.iter_rows()方法需要额外的参数和处理来获取每行的值。
四、实现代码
代码文件和xlsx文件放在一个文件夹中。
import time
import glob
import openpyxl
import pandas as pd
import xlsxwriter
t1 = time.time()
files = glob.glob('*.xlsx')
DF_data = pd.DataFrame()
for f in files:
file = openpyxl.load_workbook(f,read_only=True) # 读取每个文件
ws = file.worksheets[0] # 获取工作簿中第一个表
data = ws.values
my_cols = next(data)[:] # 获取首行
data = list(data)
df = pd.DataFrame(data,columns = my_cols)
DF_data = pd.concat([DF_data,df],ignore_index=True) #忽略首行
print(DF_data.info())
# 数据写入
writer = pd.ExcelWriter('result.xlsx',engine='xlsxwriter',options={'strings_to_urls':False})
DF_data.to_excel(writer,sheet_name='Sheet1',index=False) #将DataFrame对象保存为Excel文件。
ws_temp = writer.sheets['Sheet1']
ws_temp.set_column(4,4, 30) #调整第5列宽,也可不加
writer.close()
t= time.time()-t1
print(f'程序运行时间:{t:.2f}秒')