1. 程式人生 > >關於用openpyxl處理excel,讀和寫的問題

關於用openpyxl處理excel,讀和寫的問題

首先我感覺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裡面。也不知道問題出在了哪裡。