Python讀寫excel文件

用python對(duì)excel文件進(jìn)行一般的處理,十幾行代碼就能做很多事了。
xlrd和xlwt這兩個(gè)庫(kù)可以操作excel,其中xlrd是讀excel,xlwt是寫excel的庫(kù),但是相比而言我還是更喜歡大一統(tǒng)的openpyxl。
openpyxl可以很方便的讀寫excel文件,包括單元格樣式,合并等,這里只是簡(jiǎn)單寫個(gè)demo入一下門。話不多說(shuō),直接上代碼。
待讀取的excel文件內(nèi)容如下:


image.png
# -*- coding: UTF-8 -*-
import os

import openpyxl


def read_excel(filepath, attrOpt=None, rownumOfHeader=1):
    """
    讀取excel數(shù)據(jù)
    :param filepath: excel文件路徑
    :param attrOpt: 屬性字典,key為屬性名稱,value為列序號(hào)(從1開(kāi)始);對(duì)于每行數(shù)據(jù)會(huì)根據(jù)其序號(hào)賦值給對(duì)應(yīng)的屬性名,封裝成一個(gè)字典類型;不傳或傳空則是一個(gè)有序數(shù)組
    :param rownumOfHeader: 表頭占用的行數(shù),數(shù)據(jù)讀取會(huì)跳過(guò)表頭,默認(rèn)表頭占1行
    :return:
    """
    wb = openpyxl.load_workbook(filepath)
    ws = wb.active
    dataArr = []
    rownumStart = rownumOfHeader
    for r in range(rownumStart, ws.max_row):
        if attrOpt is None or len(attrOpt) == 0:
            rowData = []
            for c in range(ws.max_column):
                rowData.append(ws.cell(r + 1, c + 1).value)
            dataArr.append(rowData)
        else:
            rowData = {}
            for attrName, index in attrOpt.items():
                rowData[attrName] = ws.cell(r + 1, index).value
            dataArr.append(rowData)
    return dataArr


def write_excel(filepath, dataArr):
    """
    寫excel
    :param filepath: 文件路徑
    :param dataArr: 數(shù)據(jù)集
    :return:
    """
    wb = openpyxl.Workbook()
    ws = wb.worksheets[0]
    for i in range(0, len(dataArr)):
        rowData = dataArr[i]
        if rowData is not None and len(rowData) > 0:
            for j in range(0, len(rowData)):
                ws.cell(i + 1, j + 1).value = rowData[j]
    wb.save(filepath)


def append_rows(filepath, dataArr):
    """
    追加數(shù)據(jù)行,若文件不存在則創(chuàng)建并寫入
    :param filepath: 文件路徑
    :param dataArr: 數(shù)據(jù)集
    :return: 
    """
    if not os.path.exists(filepath):
        write_excel(filepath, dataArr)
        return
    wb = openpyxl.load_workbook(filepath)
    ws = wb.worksheets[0]
    maxRow = ws.max_row
    for i in range(0, len(dataArr)):
        rowData = dataArr[i]
        if rowData is not None and len(rowData) > 0:
            for j in range(0, len(rowData)):
                ws.cell(maxRow + i + 1, j + 1).value = rowData[j]
    wb.save(filepath)


if __name__ == '__main__':
    attrs = {'id': 1, 'username': 2, 'email': 3, 'mobile': 4, 'registerTime': 5}
    dataArr = read_excel('E:/test/demo.xlsx', attrs)
    print(dataArr)
    datas = [['123', '張三三', 'zhangsansan@qq.com'], ['124', '李思思', 'lisisi@qq.com']]
    write_excel('E:/test/writedemo.xlsx', datas)



上述代碼執(zhí)行之后,讀取后的數(shù)據(jù)如下:

[{'id': 111, 'username': '張三', 'email': 'zhangshan@abc.com', 'mobile': 13111121113, 'registerTime': datetime.datetime(2019, 3, 15, 12, 15, 12, 4)}, {'id': 112, 'username': '李四', 'email': 'lisi@abc.com', 'mobile': 15912535642, 'registerTime': datetime.datetime(2019, 3, 16, 12, 15, 12, 4)}, {'id': 113, 'username': '王五', 'email': 'wangwu@abc.com', 'mobile': 15841415252, 'registerTime': datetime.datetime(2019, 3, 17, 12, 15, 12, 4)}, {'id': 114, 'username': '趙六', 'email': 'zhaoliu@abc.com', 'mobile': 17712453698, 'registerTime': datetime.datetime(2019, 3, 18, 12, 15, 12, 4)}]

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容