Python(xlrd、xlwt模塊)操作Excel實例(一)


一、前言

關於Python的xlrd、xlwt模塊的使用,推介另一位博客主的博文:https://www.cnblogs.com/zhoujie/p/python18.html

這篇里面有詳細介紹這兩個模塊的基本用法。

以下是關於我運用xlrd、xlwt模塊的一個實例。需求如下:

 

需求是用宏去做的,但是因為時間比較緊急,我用了1天去“研究”怎么用宏去寫,發現作為一個VBA入門者,比較難短時間學習並解決這個問題,因為VBA的可讀性比較差的緣故吧。

於是我選擇用Python去實現。


 

二、主體

這個需求還算比較簡單,主要是分為“讀”和“寫”兩部分。

(一)讀取部分

 從Excel文件“測試題.xls”里面的“表格數據1”,“表格數據2”,“數據透視表”三個sheet中提取區域和各區域的店鋪,並要求同一區域內的店鋪名稱不重復。

需求也很簡單,就是“區域”和“店鋪名稱”兩個元素進行去重和讀取。

1.讀取思路

1.1讀取范圍

讀取范圍主要是從“表格數據1”,“表格數據2”,“數據透視表”三個sheet中提取區域和各區域的店鋪,如下:

三個表都是從A1,B1或者A2,B2開始,但是表的末尾有些其他文字注釋,於是我用的判斷條件設為是否中文和是否為空值。

#構造一個函數判斷是否中文
def is_Chinese(word):
    for ch in word:
        if '\u4e00' <= ch <= '\u9fff':
            return True
    return False

 

 

1.2去重判斷

讀取到的數據需要一個臨時的“容器”,打算利用單個區域和店鋪放到一個元組里面,然后把所有的元組放到一個列表里面。

然后將每個新元組和列表里面的元組對比,看是否已經存在於列表中,從而達到去重的目的。

def read_excel():
    # 打開文件
    workbook = xlrd.open_workbook(r'D:\安裝包\測試題.xls')

    #寫一個循環體,篩選出不重復的區域和店鋪
    #將涉及到區域和店鋪的三個sheet中,不重復的區域和店鋪名稱寫入元組內並存於一個列表內
    sheet_name = ['表格數據1','表格數據2','數據透視表']
    tup1 = []
    for j in range(3):
        sheet_source = workbook.sheet_by_name(sheet_name[j])
        nrows = sheet_source.nrows
        for i in range(nrows):
            if is_Chinese(sheet_source.cell(i,0).value) == False and sheet_source.cell(i,0).value != "":
                a = (sheet_source.cell(i,0).value,sheet_source.cell(i,1).value)
                if a not in tup1 :
                    tup1.append(a)
                else:
                    pass
            else:
                 pass

 

 讀取完數據,按照它的需求,是要彈出一個提示框的

#python彈出窗口,提示“讀取完成!”
    msg.showinfo("Excel_Reading","讀取已經完成!")

 

1.3統計店鋪數量

“容器”tup1列表里面,放的是原始的數據,需要寫個循環,去統計不同區域內的店鋪數量。

    #利用將元組轉為字典,並統計各個區域的店鋪數量
    dict1 = {}
    for i in tup1:
        if i[0] not in dict1.keys():
            dict1[i[0]] = 1
        else:
            dict1[i[0]] += 1

 

 讀取部分完成。完整代碼如下:

import xlrd
import xlwt
import tkinter.messagebox as msg

def is_Chinese(word):
    for ch in word:
        if '\u4e00' <= ch <= '\u9fff':
            return True
    return False

#讀取數據
def read_excel():
    # 打開文件
    workbook = xlrd.open_workbook(r'D:\安裝包\測試題.xls')

    #寫一個循環體,篩選出不重復的區域和店鋪
    #將涉及到區域和店鋪的三個sheet中,不重復的區域和店鋪名稱寫入元組內並存於一個列表內
    sheet_name = ['表格數據1','表格數據2','數據透視表']
    tup1 = []
    for j in range(3):
        sheet_source = workbook.sheet_by_name(sheet_name[j])
        nrows = sheet_source.nrows
        for i in range(nrows):
            if is_Chinese(sheet_source.cell(i,0).value) == False and sheet_source.cell(i,0).value != "":
                a = (sheet_source.cell(i,0).value,sheet_source.cell(i,1).value)
                if a not in tup1 :
                    tup1.append(a)
                else:
                    pass
            else:
                 pass

    #python彈出窗口,提示“讀取完成!”
    msg.showinfo("Excel_Reading","讀取已經完成!")

    #利用將元組轉為字典,並統計各個區域的店鋪數量
    dict1 = {}
    for i in tup1:
        if i[0] not in dict1.keys():
            dict1[i[0]] = 1
        else:
            dict1[i[0]] += 1
    return (dict1)

 


 

 

 (二)寫入部分

需要新建一個Excel,創建一個叫“總表”的sheet,寫入標題、表頭,以及根據上述的read_excel函數返回的字典,寫入內容。

1、樣式部分

因為寫入函數.write()里面有多個參數是用來設定你寫入內容的樣式的,所以這里做一個函數,把需要設定的參數做一個封包。

def set_style(height,bold=False):
    style = xlwt.XFStyle()  # 初始化樣式
    
    font = xlwt.Font()  # 為樣式創建字體
    font.name = 'Times New Roman' 
    font.bold = bold
    font.color_index = 4
    font.height = height
    style.font = font

    alignment = xlwt.Alignment()# 為樣式創建居中方式
    alignment.horz = xlwt.Alignment.HORZ_CENTER
    style.alignment = alignment

    
    borders = xlwt.Borders()  # 為樣式創建邊框
    borders.left = xlwt.Borders.MEDIUM  
    borders.right = xlwt.Borders.MEDIUM  
    borders.top = xlwt.Borders.MEDIUM  
    borders.bottom = xlwt.Borders.MEDIUM  

    borders.left_colour = 0x40 # 邊框上色
    borders.right_colour = 0x40
    borders.top_colour = 0x40
    borders.bottom_colour = 0x40
    style.borders = borders

    return style

 

2、寫入excel

def write_excel(**dd): #兩個**代表輸入一個字典作為參數
    f = xlwt.Workbook() #創建工作簿

    '''
    創建第一個sheet:
        sheet1
    '''
    sheet1 = f.add_sheet(u'總表',cell_overwrite_ok=True) #創建sheet

    sheet1.col(1).width = 256 * 20 #調整列寬,256是一個固定的單位

    row1 = [u'區域',u'店鋪數量(家)']

    #生成標題
    sheet1.write_merge(0,0,0,1,u'總表',set_style(300,True))

    #生成第二行表頭
    for i in range(0,len(row1)):
        sheet1.write(1,i,row1[i],set_style(220,True))

    #寫入數據
    i = 2
    for a,b in dd.items():
        if b>=10: #將店鋪數量大於10的數據,寫入Excel
            sheet1.write(i,0,a,set_style(220))
            sheet1.write(i,1,b,set_style(220))
            i +=1
        else:
            pass

    f.save('總表.xlsx') #保存文件,文件會保存在此Python腳本所在的文件夾內。

 

最后執行:

write_excel(**read_excel())

 

效果圖:

 


總結

應該說Python的xlrd、xlwt模塊對於Excel的數據讀取和寫入非常簡易方便。但是在使用xlwt時,存在一個問題,就是它無法直接對現有的Excel工作表進行寫入,只能新開一個Excel。或者將現有Excel復制一個副本,另存為。


免責聲明!

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



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