『Python』『Pandas/Xlwings』如何不覆盖已有工作表,把新数据写入新的Excel工作表

e n v : env:e n v :
p a n d a s : 1.3.0 \space \space \space pandas: \space 1.3.0 p an d a s :1.3.0
x l s i n g s : 0.22.2 \space \space \space xlsings: \space 0.22.2 x l s in g s :0.22.2
以前我总是用 x l w i n g s xlwings x lw in g s 把处理好的 D a t a F r a m e DataFrame D a t a F r am e 写进 E x c e l Excel E x ce l,但我发现虽然很方便,但 写入速度较慢,所以一直在抱怨为啥 P a n d a s Pandas P an d a s 的 t o _ e x c e l to_excel t o _e x ce l 函数这么拉,一写入就覆盖了原本存在的工作表,所以最近抽空就看了下 p a n d a s . t o _ e x c e l pandas.to_excel p an d a s .t o _e x ce l 这个方法,发现原来是我火星了, 它也支持不覆盖写入并且写入速度比 X l w i n g s Xlwings Xlw in g s 快好多倍,p a n d a s pandas p an d a s 永远滴神!!😛

Last updated: \space 2022/10/21

未写入前 e x c e l excel e x ce l 内的样子:

『Python』『Pandas/Xlwings』如何不覆盖已有工作表,把新数据写入新的Excel工作表

『Python』『Pandas/Xlwings』如何不覆盖已有工作表,把新数据写入新的Excel工作表

;X l w i n g s Xlwings Xlw in g s

import xlwings as xw
import time
class Xlwings:
    @classmethod
    def write(cls, file_path, sheet_name, df_name):
        app = xw.App(visible=False, add_book=False)
        app.display_alerts = False
        app.screen_updating = False
        wb = app.books.open(file_path)
        try:
            wb.sheets.add(sheet_name)
        except ValueError:
            wb.sheets[sheet_name].delete()
            wb.sheets.add(sheet_name)
        wb.sheets[sheet_name].range('A1').options(pd.DataFrame, index=False).value = df_name
        wb.save(file_path)
        wb.close()
        app.quit()

start = time.time()

df = pd.DataFrame(columns=['Col_a', 'Col_b'], data=[[6, 6], [5, 8]])
Xlwings.write(file_path=r'C:\testing\Testing.xlsx', sheet_name='Sheet_3', df_name=df)
print('Used time: ', time.time() - start)

X l w i n g s Xlwings Xlw in g s 的耗时

『Python』『Pandas/Xlwings』如何不覆盖已有工作表,把新数据写入新的Excel工作表

写入效果

『Python』『Pandas/Xlwings』如何不覆盖已有工作表,把新数据写入新的Excel工作表

然后我手动删除S h e e t _ 3 Sheet_3 S h ee t _3 后保存,并用p a n d a s pandas p an d a s 重新写入

P a n d a s Pandas P an d a s

class Pandas:
    @classmethod
    def write(cls, file_path, sheet_name, df_name):
        writer = pd.ExcelWriter(file_path, mode='r+')
        df_name.to_excel(writer, sheet_name=sheet_name, index_label=False, index=False)
        writer.save()
start = time.time()
df = pd.DataFrame(columns=['Col_a', 'Col_b'], data=[[6, 6], [5, 8]])
Pandas.write(file_path=r'C:\testing\Testing.xlsx', sheet_name='Sheet_3', df_name=df)
print('Used time: ', time.time() - start)
writer.save()

p a n d a s pandas p an d a s 的耗时

『Python』『Pandas/Xlwings』如何不覆盖已有工作表,把新数据写入新的Excel工作表

p a n d a s pandas p an d a s 的写入效果

『Python』『Pandas/Xlwings』如何不覆盖已有工作表,把新数据写入新的Excel工作表

不难发现 p a n d a s pandas p an d a s 不仅写入得更快,而且它还细心地给你的 h e a d e r header h e a d er 加粗还加了框线,我踏马吹爆好吧 ❤️

不过虽说 X l w i n g s Xlwings Xlw in g s 写入慢,但它能调用微软的 a p i api a p i 接口,做到很多 p a n d a s pandas p an d a s 做不到的事情(如格式设置、绘制图表等方面),所以在 E x c e l Excel E x ce l 自动化办公这一块,有些时候两者互补才是最优解

更新 更新更新

把脚本交付给 u s e r user u ser 后,发现可能由于 u s e r user u ser 的电脑性能较差,响应速度较慢(排除了环境的问题),上面的 Pandas.write方法失效,该方法依然会清空已有工作表, 所以改进了下方法

使用 with代码块,保证文件的正常关闭与保存


class Pandas:
    @classmethod
    def write(cls, file_path, sheet_name, df_name):
        with pd.ExcelWriter(file_path, engine='openpyxl', mode='a', if_sheet_exists='replace') as writer:
            df_name.to_excel(writer, sheet_name=sheet_name, index=False, index_label=False)

若要”同时”写入多个工作表,也可以这样写:

with pd.ExcelWriter(file_path) as writer:
    df_1.to_excel(writer, sheet_name='Sheet_1', index=False, index_label=False)
    df_2.to_excel(writer, sheet_name='Sheet_2', index=False, index_label=False)

\space \space \space \space \space \space \space 相关链接

Original: https://blog.csdn.net/m0_47149835/article/details/125861702
Author: Varian2333
Title: 『Python』『Pandas/Xlwings』如何不覆盖已有工作表,把新数据写入新的Excel工作表

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/752781/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球