我将尝试通过一个例子来解释我的问题:
比方说,我有一个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文件中的所有工作表,这基本上将所有工作表作为DataFrames的字典(OrderedDict)提供。
现在,我想修改我的sheet2并保存它而不打扰其他人。因此,使用 Python Pandas库执行此操作是否可行。
[UPDATE-4/1/2019]
我正在使用Pandas read_excel从excel文件中读取所需的任何工作表,使用数据库中的数据验证数据并更新excelfile中的状态列。
所以要写出excel中的status列,我使用的是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
如果我做错了什么,请纠正我!有什么更好的办法吗?
对此的任何帮助将不胜感激:)
答案 0 :(得分:0)
要一次修改一张纸,可以使用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")