Pandas可以读取和修改单个Excel文件工作表(选项卡)而无需修改文件的其余部分吗?

HaP*_*ran 18 python excel pandas

许多电子表格都有公式和格式,用于读取和写入Excel文件的Python工具无法忠实再现.这意味着我想以编程方式创建的任何文件必须是我从头开始创建的东西,然后其他Excel文件(具有上述复杂性)必须引用该文件(这会产生各种其他依赖性问题).

我对Excel文件'tabs'的理解是它们实际上只是XML文件的集合.那么,是否可以使用pandas(或其中一个底层读/写引擎,如xlsxwriter或openpyxl来修改其中一个选项卡,其他选项卡(其中有更多邪恶的东西)完好无损?

编辑:我将尝试通过一个例子进一步阐述问题.

  • Excel Sheet test.xlsx有四个选项卡(又名工作表):Sheet1,Sheet2,Sheet3,Sheet4
  • 我使用pandas.read_excel()将Sheet3读入DataFrame(让我们称之为df)
  • Sheet1和Sheet2包含公式,图形和各种格式,openpyxl和xlrd都无法成功解析,Sheet4包含其他数据.我根本不想触摸那些标签.
  • Sheet2实际上对Sheet3上的单元格有一些引用
  • 我对df进行了一些编辑,现在想把它写回到sheet3,保持其他工作表不变(并且工作簿中其他工作表对它的引用完整)

我可以这样做,如果是这样,怎么样?

Pau*_*ong 11

关于excel和python(特别是pandas)之间的交互,我有一个类似的问题,我被提到了这个问题.

感谢stackoverflow社区的一些指示,我找到了一个名为xlwings的软件包,它似乎涵盖了HaPsantran所需的许多功能.

要使用OP的示例:

使用现有的excel文件,您可以通过在excel中命名并将其导入要导入到pandas的数据块(Sheet3)中的锚点并执行:

# opened an existing excel file
Run Code Online (Sandbox Code Playgroud)

wb = Workbook(Existing_file)

# Find in the excel file a named cell and reach the boundary of the cell block (boundary defined by empty column / row) and read the cell 
Run Code Online (Sandbox Code Playgroud)

df = Range(Anchor).table.value

# import pandas and manipulate the data block
df = pd.DataFrame(df) # into Pandas DataFrame
df['sum'] = df.sum(axis= 1)

# write back to Sheet3
Range(Anchor).value = df.values
Run Code Online (Sandbox Code Playgroud)

测试了这个实现没有缓和excel文件中的现有公式

如果这可以解决您的问题以及是否有任何我可以提供的帮助,请告诉我.

对xlwings开发人员的高度赞誉,他们使这成为可能.


以下是来自@jamzsabb的进一步问题后我之前回答的更新,并反映了xlwings更新到> = 0.9.0后更改的API.

import xlwings as xw
import pandas as pd
target_df = xw.Range('A7').options(pd.DataFrame, expand='table').value # only do this if the 'A7' cell (the cell within area of interest) is in active worksheet
#otherwise do:
#sht = xw.Book(r'path to your xlxs file\name_of_file.xlsx`).sheets['name of sheet']
#target_df = sht.Range('A7').options(pd.DataFrame, expand='table').value # you can also change 'A7' to any name that you've given to a cell like 'interest_table`
Run Code Online (Sandbox Code Playgroud)


DSM*_*DSM 6

我90%有信心"能pandas做到这一点" 的答案是否定的.发布负面信息很难,因为总有可能会有一些我错过的聪明,但这是一个案例:

可能的界面引擎xlrd/xlwt/xlutils,openpyxlxlsxwriter.没有一个适用于您的目的,因为xlrd/wt不支持所有公式,xlsxwriter无法修改现有xlsx文件,并且openpyxl丢失图像和图表.

因为我经常需要这样做,所以我只是将简单的输出写入一个单独的文件,然后直接调用win32api来复制工作簿之间的数据,同时保留我所有同事的闪亮数字.这很烦人,因为这意味着我必须在Windows而不是*nix下进行,但它确实有效.

如果你在Windows下工作,你可以做类似的事情.(我想知道在这种情况下使用这种方法添加本机插入选项是否有意义,或者我们应该只发布一个配方.)


PS:这个问题让我不时烦恼,我已经想到了足够的现代Excel格式,以便为其中一个库添加对此的支持.

PPS:但是由于忽略了你没有处理的东西而且没有修改它们似乎很容易,没有人似乎支持它的事实让我觉得有些令人头痛,而且Redmond参与其中我愿意相信它.@ john-machin会知道细节,如果他是关于..


pat*_*ng1 6

我正在添加一个使用 openpyxl 的答案。从版本 2.5 开始,您可以在现有文件中保留图表(有关该问题的更多详细信息可在此处找到)。

出于演示目的,我按照 OP 指南使用 pandas 创建了一个 xlsx 文件。名为“Sheet2”的选项卡具有引用“Sheet3”的公式并包含一个图表。

import pandas as pd

df = pd.DataFrame({'col_a': [1,2,3],
                  'col_b': [4,5,6]})

writer = pd.ExcelWriter('test.xlsx', engine='xlsxwriter')
df.to_excel(writer, sheet_name='Sheet1', index=False)
workbook=writer.book
worksheet = writer.sheets['Sheet1']
df.head(0).to_excel(writer, sheet_name='Sheet2', index=False)
workbook=writer.book
worksheet = writer.sheets['Sheet2']
for i in range(2, len(df) + 2):
    worksheet.write_formula('A%d' % (i), "=Sheet3!A%d" % (i))
    worksheet.write_formula('B%d' % (i), "=Sheet3!B%d" % (i))
chart = workbook.add_chart({'type': 'column'})

chart.add_series({'values': '=Sheet2!$A$2:$A$4'})
chart.add_series({'values': '=Sheet2!$B$2:$B$4'})

worksheet.insert_chart('A7', chart)

df.to_excel(writer, sheet_name='Sheet3', index=False)
df.to_excel(writer, sheet_name='Sheet4', index=False)

writer.save()
Run Code Online (Sandbox Code Playgroud)

运行上面的代码后预期的 test.xlsx:

第一个代码块之后的 test.xlsx

然后,如果我们使用 openpyxl 运行下面的代码,我们可以修改“Sheet3”中的数据,同时保留“Sheet2”中的公式和图表,并且更新的数据现在位于该文件中。

from openpyxl import load_workbook

wb = load_workbook('test.xlsx')
ws = wb['Sheet3']
ws['B2'] = 7
ws['B3'] = 8
ws['B4'] = 9
wb.save('test.xlsx')
Run Code Online (Sandbox Code Playgroud)

运行第二个代码块后预期的 test.xlsx:

第二个代码块之后的 test.xlsx


adr*_*anX 0

如果您将“工作表”视为“选项卡”,则可以通过使用该parse(sheet_name)函数访问特定选项卡来仅修改其中一个选项卡。

一个例子在这里: Reading an Excel file in python using pandas

要写回Excel,(同时控制工作表)使用该to_excel函数,此处: http ://pandas.pydata.org/pandas-docs/stable/ generated/pandas.DataFrame.to_excel.html

  • 如果您可以发布一段代码来演示这一点(这样,除了您读入的工作表之外,还包含*其他工作表*的源文件,除了您编写的工作表之外,不会被更改),那会很有帮助。 (2认同)