Python系列(4)——Pandas數據庫新增多個sheet覆蓋與不覆蓋原excel表中的sheet數據 及 修改某個sheet,但不改變其他sheet數據的情況


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))
View Code

--該代碼是后續內容所使用到的數據。

使用Pandas數據庫對Excel文件進行寫入並保存--新增多個sheet時覆蓋原excel表中保存的sheet數據與不覆蓋原excel表中保存的sheet數據的情況

# 1.使用 文件.to_excel ---覆蓋原據,只保留最后一to_excelsheet
"""
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表中只有data2sheet_data2

# ps指定元格
data = pd.DataFrame({'One': [1, 2, 3]})

data.to_excel(file_excel, sheet_name='123', startrow=10, startcol=2, index=False)  # 123sheet113元格


# 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()
執行結果:df1df2的信息均有,同時出現'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()  # 保存文件   ---data1data2都在,原據被覆蓋

excel_writer = pd.ExcelWriter(r'C:\Users\Administrator\Desktop\test2.xlsx')
data3.to_excel(excel_writer, sheet_name='sheet_data3')
excel_writer.save()   # 只有data3,data1data2被覆蓋
excel_writer.close()  # 關閉excel_writer

 # ps2.不同表格中的入同一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()
執行結果:df1df2sheet信息均存在,且原文件的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需用xlrdxlutils.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       # 更改第2sheet數據
            '.....其他要修改的內容類似'
        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')   # 11列的數據改為hello
work_sheet['B2'] = 'python'  # B2單元格改為python
writer_book.save(writer)  # 將修改后的數據保存到原表

# 與追加新的sheetexcel末尾中是不沖突的
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()

 

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM