
1 import pandas as pd 2 import numpy as np 3 data1 = pd.DataFrame(np.arange(12).reshape((3, 4))) 4 data2 = pd.DataFrame(np.random.randn(1, 2)) 5 data3 = pd.DataFrame(np.random.randn(2, 3)) 6 data4 = pd.DataFrame(np.random.randn(3, 4))
--該代碼是后續內容所使用到的數據。
使用Pandas數據庫對Excel文件進行寫入並保存--新增多個sheet時覆蓋原excel表中保存的sheet數據與不覆蓋原excel表中保存的sheet數據的情況
# 1.使用 文件.to_excel ---覆蓋原數據,只保留最后一個to_excel的sheet
"""
df1 = ....
df2 = ....
df1.to_excel('文件名',sheet_name='1',...)
df2.to_excel('文件名',sheet_name='2',..)
執行結果:只有df2信息,出現'2'sheet, to_excel只保存最后一個數據,原文件數據全部消失並被替代
"""
file_excel = r'C:\Users\Administrator\Desktop\test.xls'
data1.to_excel(file_excel, sheet_name='sheet_data1')
data2.to_excel(file_excel, sheet_name='sheet_data2') # test.xls表中只有data2的sheet_data2內容
# ps:從指定單元格開始寫入
data = pd.DataFrame({'One': [1, 2, 3]})
data.to_excel(file_excel, sheet_name='123', startrow=10, startcol=2, index=False) # 從123sheet的11行3列單元格開始寫入
# 2.使用pd.ExcelWriter('文件名') 及 文件.to_excel ---覆蓋原數據,同時執行多個to_excel時才保存多個sheet,結束后再執行一個數據的to_excel只剩該數據的sheet
"""
writer = pd.ExcelWriter('文件')
df1 = ....
df2 = ....
df1.to_excel(writer,sheet_name='1')
df2.to_excel(writer,sheet_name='2')
writer.save()
執行結果:df1、df2的信息均有,同時出現'1'與'2'sheet,原文件數據全部消失並被替代
writer = pd.ExcelWriter('文件')
df3 = ....
df3.to_excel(writer,sheet_name='3')
writer.save()
執行結果:只有df3信息,出現'3'sheet,原文件數據全部消失並被替代
"""
excel_writer = pd.ExcelWriter(r'C:\Users\Administrator\Desktop\test2.xlsx') # 定義writer,選擇文件(文件可以不存在,相當於新建文件)
data1.to_excel(excel_writer, sheet_name='sheet_data1')
data2.to_excel(excel_writer, sheet_name='sheet_data2')
excel_writer.save() # 保存文件 ---data1和data2都在,原數據被覆蓋
excel_writer = pd.ExcelWriter(r'C:\Users\Administrator\Desktop\test2.xlsx')
data3.to_excel(excel_writer, sheet_name='sheet_data3')
excel_writer.save() # 只有data3,原data1和data2被覆蓋
excel_writer.close() # 關閉excel_writer
# ps:2.將不同表格中的數據寫入同一個excel中的同一個sheet
writer = pd.ExcelWriter(r'C:\Users\Administrator\Desktop\test2.xlsx')
data1.to_excel(writer, index=False) # 不寫sheet_name默認進excel中同一個sheet
data2.to_excel(writer, startcol=7, index=False) # 自行定義行、列開始寫入的位置
data3.to_excel(writer, startrow=6, index=False)
writer.save()
# 3.使用openpyxl.load_workbook--不覆蓋原數據且保存多個sheet--openpyxl打開的文件格式需為.xlsx格式
"""
from openpyxl import load_workbook # 導入模塊load_workbook
writer = pd.ExcelWriter('文件')
save_book = load_workbook(writer.path)
writer.book = save_book # 將'文件'原表中的內容保存
df1 = ....
df2 = ....
df1.to_excel(writer,sheet_name='1')
df2.to_excel(writer,sheet_name='2')
writer.save()
執行結果:df1、df2的sheet信息均存在,且原文件的sheet數據都存在,沒有覆蓋原數據
"""
from openpyxl import load_workbook
writer = pd.ExcelWriter(r'C:\Users\Administrator\Desktop\test2.xlsx', engine='openpyxl')
# 若報錯:AttributeError: ‘Workbook’ object has no attribute ‘add_worksheet’,修改pd.ExcelWriter(xxx, engine=‘openpyxl’),下述其他代碼類似
save_book = load_workbook(writer.path)
writer.book = save_book # 將test2.xlsx原表中的內容保存
data4.to_excel(writer, sheet_name='sheet_data4') # 原表格中的數據均存在,並保存新的數據data4,若再執行一遍,新數據會被再次保存為副本sheet_data41
writer.save()
# 若excel文件格式為.xls需用xlrd及xlutils.copy打開已存在的excel,寫入多個sheet且不覆蓋原數據
import xlrd
from xlutils.copy import copy
writer = pd.ExcelWriter(r'C:\Users\Administrator\Desktop\test2.xls')
data = xlrd.open_workbook(writer.path, formatting_info=True)
# formatting_info參數表示是否復制原excel格式(只復制數據和格式,不復制原表中的公式)
excel = copy(wb=data) # 完成xlrd對象向xlwt對象轉換(因為xlrd只能讀xlwt才能寫) --將文件復制到內存
writer.book = excel
data4.to_excel(writer, sheet_name='newsheet')
writer.save()
# ps:(3).只更改指定sheet中的某些數據,其他數據及sheet保持不變
# (3.1)將修改與未修改的sheet均讀取出來,修改之后,再同時保存到新的excel中--若數據多、修改次數較多比較困難
import pandas as pd
read_excel = pd.ExcelFile(r'C:\Users\Administrator\Desktop\test2.xlsx')
df_change_1 = read_excel.parse(sheet_name='sheet_data1')
df_change_2 = read_excel.parse(sheet_name='sheet_data2')
df_change_3 = read_excel.parse(sheet_name='sheet_data3')
df_change_2.loc[0, 0] = 8
writer = pd.ExcelWriter(r'C:\Users\Administrator\Desktop\test3.xls')
df_change_1.to_excel(writer, sheet_name='sheet_data3')
df_change_2.to_excel(writer, sheet_name='sheet_data3')
df_change_3.to_excel(writer, sheet_name='sheet_data3')
writer.save() # 更改df_change_2中的數據,並將更改后的與原sheet保存在一起
# ps: 若sheet較多,可使用循環遍歷+條件語句讀取與保存數據
read_excel = pd.ExcelFile(r'C:\Users\Administrator\Desktop\test4.xlsx')
sheet_names = read_excel.sheet_names # 讀取sheet表名
writer = pd.ExcelWriter(r'C:\Users\Administrator\Desktop\test5.xls')
j = 1
for i in sheet_names:
if j <= len(sheet_names):
dfj = read_excel.parse(i) # 讀取多個sheet數據
dfj.loc[0, 0] = 8 # 更改第2個sheet數據
'.....其他要修改的內容類似'
dfj.to_excel(writer, i) # 將多個sheet數據寫入到writer中
j += 1
# (3.2)直接修改指定的sheet表中某些數據,然后進行保存,其他數據及sheet內容保持不變
import openpyxl
writer = pd.ExcelWriter(r'C:\Users\Administrator\Desktop\test2.xlsx')
writer_book = openpyxl.load_workbook(writer.path)
work_sheet = writer_book.worksheets[0] # 獲取要修改的sheet表(這里是第一個sheet)
work_sheet.cell(1, 1, 'hello') # 將1行1列的數據改為hello
work_sheet['B2'] = 'python' # 將B2單元格改為python
writer_book.save(writer) # 將修改后的數據保存到原表中
# 與追加新的sheet到excel末尾中是不沖突的
data4 = pd.DataFrame({'name': [1, 2, 3]})
writer.book = writer_book # 將test2.xlsx原表中的內容保存
data4.to_excel(writer, sheet_name='dfhdwashd')
writer.save()
# ps:(4)向excel表的某一sheet中添加數據,覆蓋原sheet數據,但不改變其他的sheet內容(即:指定sheet中用新數據替代原數據,其他sheet數據保持不變)
writer = pd.ExcelWriter(r'C:\Users\Administrator\Desktop\test2.xlsx')
writer_book = openpyxl.load_workbook(writer.path)
writer.book = writer_book
idx = writer_book.sheetnames.index('sheet_data2') # 找到sheet_data2的索引
writer_book.remove(writer_book.worksheets[idx]) # 刪除sheet_data2工作表中的原數據
writer_book.create_sheet('sheet_data2', idx) # 重新創建空白的sheet_data2工作表
writer.sheets = dict((i.title, i) for i in writer_book.worksheets) # 保存其他用不到的sheet頁面
data = pd.DataFrame({'name': [1, 2, 3]})
data.to_excel(writer, 'sheet_data2') # 將新數據data寫入sheet_data2工作表中
print(writer.sheets)
writer.save()