【问题标题】:Can I modify specific sheet from Excel file and write back to the same without modifying other sheets using Pandas | openpyxl我可以在不使用 Pandas 修改其他工作表的情况下修改 Excel 文件中的特定工作表并写回相同的工作表吗?打开pyxl
【发布时间】:2019-08-09 10:47:59
【问题描述】:

我会试着用一个例子来解释我的问题:

假设我有一个 Excel 文件 test.xlsx,它有五个选项卡(也称为工作表):Sheet1、Sheet2、Sheet3、Sheet4 和 sheet5。我有兴趣阅读和修改 sheet2 中的数据。

我的 sheet2 有一些列,其单元格是下拉列表,这些下拉列表值在 sheet4 和 sheet5 中定义。我不想触摸 sheet4 和 sheet5。 (我的意思是 sheet4 和 sheet5 对 Sheet2 上的单元格有一些引用)。

我知道我可以使用 pd.read_excel('test.xlsx', sheetnames=None) 读取 excel 文件中的所有工作表,这基本上将所有工作表作为 DataFrame 的字典(OrderedDict)。

现在我想修改我的 sheet2 并保存它而不打扰其他人。那么使用 Python Pandas 库是否可以做到这一点。

[更新 - 2019 年 4 月 1 日]

我正在使用 Pandas read_excel 从我的 excel 文件中读取我需要的任何表格,使用数据库中的数据验证数据并更新 excelfile 中的状态列。

因此,为了在 excel 中写回状态列,我使用的是 openpyxl,如下面的伪代码所示。

import pandas as pd
import openpyxl

df = pd.read_excel(input_file, sheetname=my_sheet_name)
df = df.where((pd.notnull(df)), None)

write_data = {}

# Doing some validations with the data and building my write_data with key 
# as (row_number, column_number) and value as actual value to put in that 
# cell.

at the end my write_data looks something like this: 
{(2,1): 'Hi', (2,2): 'Hello'}

现在我定义了一个名为 WriteData 的单独类,用于使用 openpyxl 写入数据

# WriteData(input_file, sheet_name, write_data)

book = openpyxl.load_workbook(input_file, data_only=True, keep_vba=True)
sheet = book.get_sheet_by_name(sheet_name)

for k, v in write_data.items():
   row_num, col_num = k
   sheet.cell(row=row_num, column=col_num).value = v

book.save(input_file)

现在,当我执行此操作时,它会删除所有公式和图表。 我使用的是 openpyxl 2.6.2

如果我做错了什么,请纠正我!有没有更好的办法?

对此的任何帮助将不胜感激:)

【问题讨论】:

    标签: python excel python-3.x pandas openpyxl


    【解决方案1】:

    要一次修改一个工作表,您可以使用 pandas excel writer:

    sheet2 = pd.read_excel("test.xlsx", sheet = "sheet2")
    
    ##modify sheet2 as needed.. then to save it back:
    
    with pd.ExcelWriter("test.xlsx") as writer:
            sheet2.to_excel(writer, sheet_name="sheet2")
    

    【讨论】:

      猜你喜欢
      • 2015-03-24
      • 2018-06-07
      • 1970-01-01
      • 2010-10-03
      • 1970-01-01
      • 1970-01-01
      • 2011-06-16
      • 2019-11-30
      • 2018-08-31
      相关资源
      最近更新 更多