Python系列(6)——使用openpyxl將三種類型的數據添加進新sheet及已有的sheet中且不覆蓋原數據


 1 # -*- coding:utf-8 -*-
 2 import pandas as pd  3 import openpyxl  4 import numpy as np  5 # 有以下三種格式的數據,將它們添加進新sheet中以及添加進已有的sheet中
 6 list1 = [['張三', '', '未婚', 20], ['李四', '', '已婚', 28], ['小紅', '', '未婚', 18], ['小芳', '', '已婚', 25]]  7 list2 = {'name': ['a', 'b'], 'age': [18, 20]}  8 list3 = [{'name': 'tf', 'age': 10}, {'name': 'tom', 'age': 18}]  9 
 10 list4 = [['', '', '未婚', 20], ['', '', '已婚', 25]]  11 list5 = {'name': ['m', 'h'], 'age': [10, 50]}  12 list6 = [{'name': 'jerry', 'age': 25}, {'name': 'kk', 'age': 18}]  13 
 14 # --若沒使用to_excel可不使用pd.ExcelWriter打開文件,直接用openpyxl.load_workbook
 15 # 一、 list1-3如何添加進新sheet中且不覆蓋原數據
 16 # (1)list1類型數據添加進新sheet中
 17 excel_read = pd.ExcelWriter(r'C:\Users\Administrator\Desktop\test4.xlsx', engine='openpyxl')  18 excel_book = openpyxl.load_workbook(excel_read.path)  19 work_sheet = excel_book.create_sheet(title='new_list1')   # 增加新sheet名
 20 data1 = ['姓名', '性別', '婚姻', '年齡']   # 表頭放入
 21 work_sheet.append(data1)  22 for i in list1:  23  work_sheet.append(i)  24 excel_book.save(excel_read)  25 
 26 # (2)list2類型數據添加進新sheet中
 27 # 第一種寫法:使用to_excel--標題是有邊框的
 28 excel_read = pd.ExcelWriter(r'C:\Users\Administrator\Desktop\test4.xlsx', engine='openpyxl')  29 # 若報錯:AttributeError: ‘Workbook’ object has no attribute ‘add_worksheet’
 30 # 修改pd.ExcelWriter(xxx, engine=‘openpyxl’)下述其他代碼類似
 31 excel_book = openpyxl.load_workbook(excel_read.path)  32 excel_read.book = excel_book   # 有to_excel時這段代碼才需要且后面的保存需為excel_read.save()
 33 data2 = pd.DataFrame(list2)  34 data2.to_excel(excel_read, sheet_name='new_list2', index=False)  35 excel_read.save()  36 
 37 # 第二種寫法:利用numpy拆開字典數據,np.array(..)拆標題、..to_numpy()拆數據,然后分別append進sheet--但是這種拆分是沒有格式
 38 # (但可以設置格式)
 39 excel_read = pd.ExcelWriter(r'C:\Users\Administrator\Desktop\test4.xlsx', engine='openpyxl')  40 excel_book = openpyxl.load_workbook(excel_read.path)  41 new_sheet = excel_book.create_sheet('new_list2')  42 data2 = pd.DataFrame(list2)  43 column = np.array([data2.columns])  # 將行標題拿出[['name' 'age']]
 44 new_sheet.append(list(column[0]))  # 將標題寫進sheet中
 45 value = data2.to_numpy()   # 將值拿出[['a' 18] ['b' 20]]
 46 for i in range(len(value)):  47     new_sheet.append(list(value[i]))   # 值寫入sheet中
 48 excel_book.save(excel_read)  49 
 50 # (3)list3類型數據添加進新sheet中
 51 # 第一種寫法:手動拆字典,將標題和數據append進新sheet中
 52 excel_read = pd.ExcelWriter(r'C:\Users\Administrator\Desktop\test4.xlsx', engine='openpyxl')  53 excel_book = openpyxl.load_workbook(excel_read.path)  54 work_sheet3 = excel_book.create_sheet(title='new_list3')   # 創建新sheet
 55 data3 = [j for j, k in list3[1].items()]   # 插入行標題
 56 work_sheet3.append(data3)  57 for i in list3:  58     list_list = []  59     for j, k in i.items():  60  list_list.append(k)  61     work_sheet3.append(list_list)   # 轉化成列表直接添加到sheet中
 62 excel_book.save(excel_read)  63 
 64 # 第二種寫法:使用pd.DataFrame、to_excel
 65 excel_read.book = excel_book  66 data3_1 = pd.DataFrame(list3)  67 data3_1.to_excel(excel_read, sheet_name='new_list3', index=False)  68 excel_read.save()  69 # 第三種寫法:利用numpy拆開字典數據,np.array(..)拆標題、..to_numpy()拆數據,然后分別append進sheet,與list2的第二種寫法一樣
 70 
 71 # 二、list4-6如何添加進已存在的sheet中且不覆蓋原數據
 72 # 以下追加新的數據到已有sheet中,沒有使用to_excel,因此也可以不使用pd.ExcelWriter,直接openpyxl.load_workbook(....)
 73 # (1)list4類型數據添加進已有sheet中
 74 excel_read = pd.ExcelWriter(r'C:\Users\Administrator\Desktop\test4.xlsx', engine='openpyxl')  75 excel_book = openpyxl.load_workbook(excel_read.path)  76 work_sheet = excel_book['new_list1']  77 for i in list4:  78     work_sheet.append(i)    # 自動加入到最后一行的下面
 79 excel_book.save(excel_read)  80 
 81 # (2)list5類型數據添加進已有sheet中
 82 excel_read = pd.ExcelWriter(r'C:\Users\Administrator\Desktop\test4.xlsx', engine='openpyxl')  83 excel_book = openpyxl.load_workbook(excel_read.path)  84 # excel_read.book = excel_book # 有to_excel時這段代碼才需要,且后面的保存需為excel_read.save(),
 85 # 若是沒使用to_excel且后面的保存又為excel_read.save()時,這段代碼不寫上則excel會失去內容並打不開,
 86 # 所以若不寫這段代碼,直接將保存信息改為excel_book.save(excel_read)即可
 87 work_sheet = excel_book['new_list2']  88 data5 = pd.DataFrame(list5)  89 value = data5.to_numpy()   # [['m' 10] ['h' 50]]
 90 for i in range(len(value)):  91     work_sheet.append(list(value[i]))   # append的內容必須是可迭代對象,里面的value必須是list類型
 92 # 也可使用下面的代碼
 93 """
 94 rows = work_sheet.max_row  95 for i in range(len(value)):  96  for j in range(len(value[i])):  97  work_sheet.cell(i+1+rows, j+1, value[i][j])  98 """
 99 excel_book.save(excel_read) 100 # (3)list6類型數據添加進已有sheet中與list5類型一樣的方法
101 
102 
103 # 三、使用openpyxl在已有excel中寫入及追加數據
104 def write_xlsx(path, sheetname, value): 105     index = len(value) 106     # 下面的三條注釋代碼是創建新的excel及sheet,若原excel存在數據則被覆蓋,不是在已有excel中新建sheet
107     # workbook = openpyxl.Workbook()
108     # sheet = workbook.active
109     # sheet.title = sheetname
110     workbook = openpyxl.load_workbook(path)  # 打開已存在的excel
111     sheet = workbook.create_sheet(sheetname)  # 在excel中新建sheet
112     for i in range(index): 113         for j in range(len(value[i])): 114             sheet.cell(i+1, j+1, str(value[i][j]))   # 因為這里是標題,所以要str字符轉換
115  workbook.save(path) 116     print("xlsx格式表格數據寫入成功!") 117 
118 
119 def append_xlsx(path, sheetname, value): 120     index = len(value) 121     workbook = openpyxl.load_workbook(path) 122     sheet = workbook[sheetname] 123     """
124  rows = sheet.max_row 125  for i in range(index): 126  for j in range(len(value[i])): 127  sheet.cell(i+1+rows, j+1, value[i][j]) # 保持數據的原型 128                 """
129     # 也可直接使用下面的代碼追加數據
130     for i in range(index): 131         sheet.append(list(value[i]))  # append的內容必須是可迭代對象,里面的value必須是list類型
132  workbook.save(path) 133     print("xlsx格式表格數據追加成!") 134 
135 
136 df = pd.DataFrame({ 137         'name': ['Jack', 'kate', 'Jim', 'Steve', 'Mike', 'Lucy'], 138         'Gender': ['M', 'F', 'M', 'M', 'M', 'F'], 139         'Age': [17, 15, 22, 34, 18, 23], 140         'Height': [173, 168, 164, 180, 182, 190], 141         'Hobby': ['Reading', 'Music', 'Football', 'Reading', 'Cooking', 'Running']}) 142 df1 = df.copy() 143 column_name = np.array([df1.columns]) 144 write_xlsx(path=r'C:\Users\Administrator\Desktop\test5.xlsx', sheetname='newsheet', value=column_name) 145 append_xlsx(path=r'C:\Users\Administrator\Desktop\test5.xlsx', sheetname='newsheet', value=df1.to_numpy()) 146 
147 # 若是不使用def定義函數,直接寫成一串代碼,可直接寫成下面的形式
148 excel_book = openpyxl.load_workbook(r'C:\Users\Administrator\Desktop\test5.xlsx') 149 new_sheet = excel_book.create_sheet('new_sheet') 150 data = pd.DataFrame(df) 151 column = np.array([data.columns])  # 將行標題拿出[['name' 'Gender' ....]]
152 new_sheet.append(list(column[0]))  # 將標題寫進sheet中
153 value = data.to_numpy()   # 將值拿出[['Jack' 'M' 17 173 'Reading']['kate' 'F' 15 168 'Music'].....]
154 for i in range(len(value)): 155     new_sheet.append(list(value[i]))   # 值寫入sheet中
156 excel_book.save(r'C:\Users\Administrator\Desktop\test5.xlsx') 157 
158 # 四、使用xlrd/xlwt在已有excel中寫入和追加數據
159 import xlrd  # 讀取
160 import xlwt  # 寫入
161 from xlutils.copy import copy 162 import pandas as pd 163 import numpy as np 164 
165 
166 def write_xls(path, sheetname, value): 167     index = len(value)  # 獲取需要寫入數據的行數
168     # 下面注釋的兩條代碼是直接新建excel及sheet,若原excel存在數據則被覆蓋,不是在已有excel中新建sheet
169     # workbook = xlwt.Workbook() # 創建一個工作簿
170     # sheet = workbook.add_sheet(sheetname) # 在工作簿中新建一個表格
171     workbook = xlrd.open_workbook(path, formatting_info=True)  # 打開工作簿
172     new_workbook = copy(wb=workbook)    # 復制原excel中數據
173     sheet = new_workbook.add_sheet(sheetname, cell_overwrite_ok=True)  # 在工作簿中新建一個表格
174     for i in range(index): 175         for j in range(len(value[i])): 176             sheet.write(i, j, value[i][j])  # 向表格中寫入數據(對應的行和列)
177  new_workbook.save(path) 178     print("xls格式表格寫入成功!") 179 
180 
181 def append_xls(path, sheetname, value): 182     index = len(value)  # 獲取需要寫入的數據的行數
183     workbook = xlrd.open_workbook(path, formatting_info=True)  # 打開工作簿
184     # sheets = workbook.sheet_names() # 獲取工作簿里的所有表格
185     worksheet = workbook.sheet_by_name(sheetname)  # 獲取工作簿中sheetname的sheet
186     rows_old = worksheet.nrows  # 獲取表格中已存在的數據的行數
187     new_workbook = copy(wb=workbook)  # 將xlrd對象拷貝轉化為xlwt對象
188     new_worksheet = new_workbook.get_sheet(sheetname)  # 獲取轉化后的sheet,xlwt獲取sheet信息:workbook.get_sheet(索引號或者'sheet名')
189     for i in range(index): 190         for j in range(len(value[i])): 191             new_worksheet.write(i + rows_old, j, value[i][j])  # 追加寫入數據,注意從 i+rows_old 行開始
192  new_workbook.save(path) 193     print("xls格式表格追加寫入成功!") 194 
195 
196 df = pd.DataFrame({ 197         'name': ['Jack', 'kate', 'Jim', 'Steve', 'Mike', 'Lucy'], 198         'Gender': ['M', 'F', 'M', 'M', 'M', 'F'], 199         'Age': [17, 15, 22, 34, 18, 23], 200         'Height': [173, 168, 164, 180, 182, 190], 201         'Hobby': ['Reading', 'Music', 'Football', 'Reading', 'Cooking', 'Running']}) 202 df1 = df.copy() 203 column_name = np.array([df1.columns]) 204 write_xls(path=r'C:\Users\Administrator\Desktop\test2_xlwt.xls', sheetname='newsheet', value=column_name) 205 append_xls(path=r'C:\Users\Administrator\Desktop\test2_xlwt.xls', sheetname='newsheet', value=df1.to_numpy()) 206 print(column_name)  # [['name' 'Gender' 'Age' 'Height' 'Hobby']] 列標題
207 print(df1.to_numpy())  # 所有數據以列表形式[['Jack' 'M' 17 173 'Reading']['kate' 'F' 15 168 'Music'].....]
208 # 由於xlwt沒有append屬性,因此不能直接new_sheet.append(list(column_name[0])) 還需要new_sheet.write(...)一步步來,即按照上面的函數步驟走

 


免責聲明!

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



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