關於用openpyxl處理excel,讀和寫的問題
阿新 • • 發佈:2019-02-18
首先我感覺openpyxl是不可以修改已經存在資料的Excel檔案的。我是一個新手,所以如果寫的不對,還請指出來。這個以後我也會慢慢修改裡面的東西,主要是給自己當做筆記使用的。
這是我之前幫別人處理Excel表格寫的程式。
import openpyxl import math import os, shutil """該程式是對excel表格進行處理,將每一個Excel表格中的每個sheet進行讀取,並 計算出每個方向上的平均風速,寫入到對應的sheet。""" def dealdata(filename,filepath_one): wb = openpyxl.load_workbook(filepath_one) # 獲取workbook中所有的表格 sheets_n = wb.sheetnames print(sheets_n) # 建立一個全域性的字典用來儲存每個sheet生成的平均值。 Total_data = {} # 迴圈遍歷所有sheet for i in range(len(sheets_n)): sheet = wb[sheets_n[i]] print('\n\n第' + str(i + 1) + '個sheet: ' + sheet.title + '->>>') print(sheet.max_row) num_Dict = {} for r in range(1, sheet.max_row + 1): if r == 1: print('\n' + ''.join( [str(sheet.cell(row=r, column=c).value).ljust(17) for c in range(1, sheet.max_column + 1)])) else: # print(''.join([str(sheet.cell(row=r, column=c).value).ljust(20) for c in range(1, sheet.max_column + 1)])) for num in range(1, sheet.max_column + 1): # print(str(sheet.cell(row = r,column = num).value).ljust(20)) num_Dict.setdefault(r, []).append(sheet.cell(row=r, column=num).value) # print(num_Dict[r]) # 對每一行的資料進行累加求得平均值。 X_num = 0 Y_num = 0 Z_num = 0 n = 0 for value in num_Dict.values(): print("12 = " +str(value[0])) print("13 = " +str(value[1])) print("14 = " +str(value[2])) print("15 = " +str(value[3])) n = n + 1 X_num += float(value[1]) Y_num += float(value[2]) Z_num += float(value[3]) print(X_num) print(Y_num) print(Z_num) print(n) print(sheet.max_row) Ave_x = float(X_num / (sheet.max_row - 1)) Ave_y = float(Y_num / (sheet.max_row - 1)) Ave_z = float(Z_num / (sheet.max_row - 1)) print(Ave_x) print(Ave_y) print(Ave_z) dict_excel = [] # dict_excel.append("Ave") dict_excel.append(Ave_x) dict_excel.append(Ave_y) dict_excel.append(Ave_z) Total_data.setdefault(sheet.title, []).append(dict_excel) # 建立一個新的,用來儲村計算出來平均速度的資料 of = open("Exceldeal" + filename+".txt", "a") for value in sheets_n: print(Total_data[value]) of.write(value) datas = list(Total_data[value]) for data in datas: for da in data: # print(len(da)) print(da) of.write('\t' + '{:<20}'.format(str(da))) of.write("\n") # 向上面的檔案寫入計算得出X,Y方向上的和速度。 # for sped in Total_data.values(): # print(sped) Dict_num = {} for name in sheets_n: data_vec = list(Total_data[name]) for data in data_vec: # for dat in data: print("nih = " + str(data[0])) sum = math.sqrt(pow(data[0], 2) + pow(data[1], 2)) Dict_num[name] = sum; for name in sheets_n: of.write(name) of.write('\t' + '{:<20}'.format(Dict_num[name])) of.write("\n") of.close() def getpath(filepath_all): Dict_file = { } # work_dir = 'D:\\python_work\\newpython\\file' for parent, dirnames, filenames in os.walk(filepath_all): for filename in filenames: file_path = os.path.join(parent, filename) print(filename) print(file_path) Dict_file[filename] = file_path return Dict_file def main(filepath): #filepath = 'D:\\python_work\\newpython\\file' workfile_dir = { } workfile_dir = getpath(filepath) for key in workfile_dir.keys(): print(key) dealdata(key,workfile_dir[key]) if __name__ == '__main__': filepath = 'D:\\python_work\\newpython\\xiteishan' main(filepath)
檔案的輸入部分,我認為都一樣, 輸出我這裡用的是另輸出一個TXT檔案。然後把檔案手動的插入excel表格的一個sheet裡。
我之前用wb.active.append(列表),寫入到已存在資料的Excel表格,這個方法,因為一個excel裡有好多sheet,本來想對每個sheet裡面的資料求平均值,然後再新增到對應sheet的最後一行。可是發現最後都寫入到了一個sheet裡面。也不知道問題出在了哪裡。