【问题标题】:Python CSV to Excel sheet by sheet with openpyxl [NOT OPTIMIZED]使用 openpyxl 逐页将 Python CSV 转换为 Excel [未优化]
【发布时间】:2021-06-08 08:31:51
【问题描述】:

我实际上有一个程序读取 csv 并将其插入到 xlsx 工作表中,但实际上这个程序需要太多时间来执行,我不知道我如何无法优化它,如果你有一些提示帮助请给我。

    df = pd.read_csv( file, sep=';', decimal='.', encoding="utf-8", index_col=False )
    df.to_excel( 'tmp.xlsx', sheet_name=action, index=None, header=True )

    book = openpyxl.load_workbook( template_file )
    writer = pd.ExcelWriter( template_file, engine='openpyxl' )
    writer.book = book
    writer.sheets = dict( ( ws.title, ws ) for ws in book.worksheets )
    df.to_excel( writer, action, index=None )
    writer.save()
    os.remove( 'tmp.xlsx' )```

【问题讨论】:

  • 通过使用模板文件,您强制 openpyxl 将所有内容加载到内存中。如果你能避免这种情况和 Pandas,事情会快很多,你似乎也不需要。
  • 实际上我有 8 个 csv 文件需要加载到 xlsx 中,但每个 csv 文件都进入 xlsx 的特殊工作表,我不知道没有这些 tmp 文件我怎么做
  • 在只读模式下将 csv 行与 openpyxl 行链接起来。
  • 我不明白如何

标签: python excel csv openpyxl


【解决方案1】:

要创建一个包含 8 个不同工作表(每个 CSV 文件一个)的 Excel 电子表格,您可以使用以下方法:

import openpyxl
import csv
import os

wb = openpyxl.Workbook()
del wb[wb.sheetnames[0]]        # Remove the default 'Sheet1'

for filename in ['file1.csv', 'file2.csv', 'file3.csv']:
    with open(filename, newline='') as f_input:
        ws = wb.create_sheet(title=os.path.basename(filename))
        
        for row in csv.reader(f_input, delimiter=';'):
            ws.append(row)
        
wb.save('output.xlsx')
  1. 首先创建一个 Excel 工作簿来存储 CSV 数据(并删除默认工作表)。

  2. 为每个文件创建一个新工作表。为工作表提供与文件名相同的名称(假设文件名不太长)。

  3. 对于 CSV 文件中的每一行,使用 ws.append() 将该行写入工作表。

  4. 处理完所有文件后,写出整个 Excel 电子表格。


如果您有现有的 Excel 电子表格要更新,可以使用以下方法:

import openpyxl
import csv
import os

wb = openpyxl.load_workbook('data.xlsx')

sheets = [
    ('file1.csv', 'Sheet A'),
    ('file2.csv', 'Sheet B'),
    ('file3.csv', 'Sheet C')
]

for filename, sheet in sheets:
    with open(filename, newline='') as f_input:
        ws = wb[sheet]
        
        for rowy, row in enumerate(csv.reader(f_input, delimiter=';'), start=1):    # make start first row number
            for colx, value in enumerate(row, start=1):                             # make start first col number    
                ws.cell(column=colx, row=rowy, value=value)
        
wb.save('data.xlsx')

这首先读取现有模板文件并覆盖现有条目(从左上角'A1'开始)

【讨论】:

  • 谢谢!我不需要创建工作表,因为我使用的模板文件已经获得了所有内容,但现在我加载此模板并只保存一次而不是每个工作表循环
  • 抱歉,我错过了您正在更新现有电子表格。我也添加了一个更新的解决方案来帮助解决这个问题
猜你喜欢
  • 2012-10-10
  • 1970-01-01
  • 1970-01-01
  • 2014-11-19
  • 2016-11-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多