数据处理中 有时候会碰到处理完之后循环写入到excel的问题
主要使用两个库:openpyxl库和xlsxwriter库 目前xlrd库python支持不是很友好
使用Tkinter模块进行文件或者文件夹选择 我在这里使用的是文件夹选择 然后遍历文件夹里面的excel 最后写入excel不同的sheet或者写入到一张表中
这里我建3张表格 放入test文件夹下
import os
import openpyxl
import xlsxwriter
import pandas as pd
import tkinter as tk
from tkinter import filedialog
from openpyxl import load_workbook
root = tk.Tk()
root.withdraw()
Folderpath = filedialog.askdirectory() # 获得选择好的文件夹
# 添加try...except
try:
if os.path.isfile(Folderpath +'./合并.xlsx'):
os.remove(Folderpath + './合并.xlsx')
filelist = os.listdir(Folderpath)
# 在此文件夹下建立新的文件以合并
wb = openpyxl.Workbook()
wb.save(Folderpath + './合并.xlsx')
# 打开文件,以备后面写入用到,engine一定要选择xlsxwriter后面进行解释
writer = pd.ExcelWriter(Folderpath+'./合并.xlsx',engine='xlsxwriter')
for filename in filelist:
if filename.endswith('xlsx'): # 选取文件后缀名为.xlsx的文件
file_name = Folderpath + '/' + filename # 因为是相对路径,防止pd读取的时候显示Not found错误
file_name = file_name.replace('/','\\')
data = pd.read_excel(r'%s'%file_name) # 读取excel文件
# 写入到同一个excel不同的sheet中 sheet名字以文件命名
# sheet_name=filename.split('.')[0]
# 因为文件名是.xslx格式 所以取.之前的
data.to_excel(writer, sheet_name=filename.split('.')[0], index=False)
else:
pass
writer.close() # 关闭合并.xlsx
except FileNotFoundError:
print('未传入任何文件夹')
运行结果如下
之所以不使用’engine='openpyxl因为有的时候会出现警告或者错误 我演示下 并会有多余得Sheet产生
这里我们将engine修改为’openpyxl’ 因为要写入不同的sheet所以要添加mode=‘a’ mode='w’是写入同一个sheet里面 **
会出现这种情况产生,所以一般情况下使用engine=‘xlsxwriter**
这种情况是因为 我们每循环一次 然后让writer这个工作簿保存一下 如图所示
写入到同一个excel 需要在data.to_excel(writer, startrow=’ ')设置start参数 并且传进去之后也会出现上面所出现警告情况
我是这样处理的 使用上面的合并.xlsx文件 因为我上面的文件数据是不需要处理的 所以产生的sheet里面的数据与原数据相同(有人会说使用concat上面的三张表,在现实中碰见的都是处理之后的 与原数据完全不同),循环读取sheet然后进行合并
# 紧接上面部分缩写 在except之外
wb = load_workbook(Folderpath + '/合并.xlsx')
sheets = wb.sheetnames
df = pd.DataFrame()
for i in range(len(sheets)):
df1 = pd.read_excel(Folderpath + '/合并.xlsx', sheet_name=i)
df = df.append(df1)
df.to_excel(Folderpath + '/finally.xlsx', index=False)
因为是本人做数据时 所碰到的问题 网上搜过大量资料 都未能很好解决 自己摸索出来的 欢迎各位随时交流 如果有更好的方法