用 pandas 数据帧替换 xlsx sheet 中的数据
Replacing data in xlsx sheet with pandas dataframe
我有一个包含多个选项卡的 xlsx 文件,其中之一是 Town_names
,其中已经有一些数据。
我想用数据框覆盖该数据 - Town_namesDF
- 同时保持其余的 xlsx 选项卡完好无损。
我试过以下方法:
with pd.ExcelWriter(r'path/to/file.xlsx', engine='openpyxl', mode='a') as writer:
Town_namesDF.to_excel(writer,sheet_name='Town_names')
writer.save()
writer.close()
但它最终会创建一个新选项卡 Town_names1
而不是覆盖 Town_names
选项卡。我错过了什么吗?谢谢。
您可以尝试暂时存储所有其他工作表,然后再将它们添加回去。不过,我认为这不会保存任何公式或格式。
Store_sheet1=pd.read_excel('path/to/file.xlsx',sheetname='Sheet1')
Store_sheet2=pd.read_excel('path/to/file.xlsx',sheetname='Sheet2')
Store_sheet3=pd.read_excel('path/to/file.xlsx',sheetname='Sheet3')
with pd.ExcelWriter(r'path/to/file.xlsx', engine='openpyxl', mode='a') as writer:
Town_namesDF.to_excel(writer,sheet_name='Town_names')
Store_sheet1.to_excel(writer,sheet_name='Sheet1')
Store_sheet2.to_excel(writer,sheet_name='Sheet2')
Store_sheet3.to_excel(writer,sheet_name='Sheet3')
writer.save()
writer.close()
因为你想覆盖,但是没有直接的选项(就像在 julia 的 XLSX 中有 cell_ref 的选项)。如果存在重复项,只需将其删除,然后写入即可。
with pd.ExcelWriter('/path/to/file.xlsx',engine = "openpyxl", mode='a') as writer:
workBook = writer.book
try:
workBook.remove(workBook['Town_names'])
except:
print("worksheet doesn't exist")
finally:
df.to_excel(writer, sheet_name='Town_names')
writer.save()
好吧,我已经做到了。这不是一个干净的解决方案,一点也不快,但我已经使用 openpyxl 文档来处理 pandas,在此处找到:https://openpyxl.readthedocs.io/en/latest/pandas.html
我有效地选择了 Town_names
sheet,用 ws.delete_rows()
清除它,然后将我的数据帧的每一行附加到 sheet.
wb = openpyxl.load_workbook(r'path/to/file.xlsx')
ws = wb.get_sheet_by_name('Town_names')
ws.delete_rows(0, 1000)
wb.save(r'path/to/file.xlsx')
wb = openpyxl.load_workbook(r'path/to/file.xlsx')
activeSheet = wb.get_sheet_by_name('Town_names')
for r in dataframe_to_rows(Town_namesDF, index=False, header=True):
activeSheet.append(r)
for cell in activeSheet['A'] + activeSheet[1]:
cell.style = 'Pandas'
wb.save(r'path/to/file.xlsx')
有点乱,我希望有比我更好的解决方案,但这对我有用。
您好,您可以使用 xlwings 完成该任务。这是一个例子。
import xlwings as xw
import pandas as pd
filename = "test.xlsx"
df = pd.read_excel(filename, "Town_names")
# Do your modifications of the worksheet here. For example, the following line "df * 2".
df = df * 2
app = xw.App(visible=False)
wb = xw.Book(filename)
ws = wb.sheets["Town_names"]
ws.clear()
ws["A1"].options(pd.DataFrame, header=1, index=False, expand='table').value = df
# If formatting of column names and index is needed as xlsxwriter does it, the following lines will do it.
ws["A1"].expand("right").api.Font.Bold = True
ws["A1"].expand("down").api.Font.Bold = True
ws["A1"].expand("right").api.Borders.Weight = 2
ws["A1"].expand("down").api.Borders.Weight = 2
wb.save(filename)
app.quit()
我有一个包含多个选项卡的 xlsx 文件,其中之一是 Town_names
,其中已经有一些数据。
我想用数据框覆盖该数据 - Town_namesDF
- 同时保持其余的 xlsx 选项卡完好无损。
我试过以下方法:
with pd.ExcelWriter(r'path/to/file.xlsx', engine='openpyxl', mode='a') as writer:
Town_namesDF.to_excel(writer,sheet_name='Town_names')
writer.save()
writer.close()
但它最终会创建一个新选项卡 Town_names1
而不是覆盖 Town_names
选项卡。我错过了什么吗?谢谢。
您可以尝试暂时存储所有其他工作表,然后再将它们添加回去。不过,我认为这不会保存任何公式或格式。
Store_sheet1=pd.read_excel('path/to/file.xlsx',sheetname='Sheet1')
Store_sheet2=pd.read_excel('path/to/file.xlsx',sheetname='Sheet2')
Store_sheet3=pd.read_excel('path/to/file.xlsx',sheetname='Sheet3')
with pd.ExcelWriter(r'path/to/file.xlsx', engine='openpyxl', mode='a') as writer:
Town_namesDF.to_excel(writer,sheet_name='Town_names')
Store_sheet1.to_excel(writer,sheet_name='Sheet1')
Store_sheet2.to_excel(writer,sheet_name='Sheet2')
Store_sheet3.to_excel(writer,sheet_name='Sheet3')
writer.save()
writer.close()
因为你想覆盖,但是没有直接的选项(就像在 julia 的 XLSX 中有 cell_ref 的选项)。如果存在重复项,只需将其删除,然后写入即可。
with pd.ExcelWriter('/path/to/file.xlsx',engine = "openpyxl", mode='a') as writer:
workBook = writer.book
try:
workBook.remove(workBook['Town_names'])
except:
print("worksheet doesn't exist")
finally:
df.to_excel(writer, sheet_name='Town_names')
writer.save()
好吧,我已经做到了。这不是一个干净的解决方案,一点也不快,但我已经使用 openpyxl 文档来处理 pandas,在此处找到:https://openpyxl.readthedocs.io/en/latest/pandas.html
我有效地选择了 Town_names
sheet,用 ws.delete_rows()
清除它,然后将我的数据帧的每一行附加到 sheet.
wb = openpyxl.load_workbook(r'path/to/file.xlsx')
ws = wb.get_sheet_by_name('Town_names')
ws.delete_rows(0, 1000)
wb.save(r'path/to/file.xlsx')
wb = openpyxl.load_workbook(r'path/to/file.xlsx')
activeSheet = wb.get_sheet_by_name('Town_names')
for r in dataframe_to_rows(Town_namesDF, index=False, header=True):
activeSheet.append(r)
for cell in activeSheet['A'] + activeSheet[1]:
cell.style = 'Pandas'
wb.save(r'path/to/file.xlsx')
有点乱,我希望有比我更好的解决方案,但这对我有用。
您好,您可以使用 xlwings 完成该任务。这是一个例子。
import xlwings as xw
import pandas as pd
filename = "test.xlsx"
df = pd.read_excel(filename, "Town_names")
# Do your modifications of the worksheet here. For example, the following line "df * 2".
df = df * 2
app = xw.App(visible=False)
wb = xw.Book(filename)
ws = wb.sheets["Town_names"]
ws.clear()
ws["A1"].options(pd.DataFrame, header=1, index=False, expand='table').value = df
# If formatting of column names and index is needed as xlsxwriter does it, the following lines will do it.
ws["A1"].expand("right").api.Font.Bold = True
ws["A1"].expand("down").api.Font.Bold = True
ws["A1"].expand("right").api.Borders.Weight = 2
ws["A1"].expand("down").api.Borders.Weight = 2
wb.save(filename)
app.quit()