xlwings使用教程,讓excel飛起來!----Python讀寫Excel工具

一、xlwings簡介

image

xlwings優(yōu)點

excel已經(jīng)成為必不可少的數(shù)據(jù)處理軟件,幾乎天天在用。python有很多支持操作excel的第三方庫,xlwings是其中一個。

關(guān)于xlwings
xlwings開源免費,能夠非常方便的讀寫Excel文件中的數(shù)據(jù),并且能夠進(jìn)行單元格格式的修改。

xlwings還可以和matplotlib、numpy以及pandas無縫連接,支持讀寫numpy、pandas數(shù)據(jù)類型,將matplotlib可視化圖表導(dǎo)入到excel中。

最重要的是xlwings可以調(diào)用Excel文件中VBA寫好的程序,也可以讓VBA調(diào)用用Python寫的程序。

開源免費,一直在更新

xlwings同類工具

python操作Excel的模塊,網(wǎng)上提到的模塊大致有:xlwings、xlrd、xlwt、openpyxl,pandas等。

xlwings功能總結(jié)

一、用python讀寫Excel文件,實際上就是讀寫有格式的文本文件,操作excel文件和操作text、csv文件沒有區(qū)別,Excel文件只是用來儲存數(shù)據(jù)。

二、除了操作數(shù)據(jù),還可以調(diào)整Excel文件的表格寬度、字體顏色等。

另外需要提到的是用COM調(diào)用Excel的API操作Excel文檔也是可行的,相當(dāng)麻煩基本和VBA沒有區(qū)別

xlwings中文文檔

https://www.kancloud.cn/gnefnuy/xlwings-docs/1127474

xlwings結(jié)構(gòu)圖

image

二、xlwings基本操作

(一)引入庫

import xlwings as xw

(二)打開 excel

# 打開Excel程序,默認(rèn)設(shè)置:程序可見,只打開不新建工作薄,屏幕更新關(guān)閉
app=xw.App(visible=True,add_book=False)
app.display_alerts=False
app.screen_updating=False

# 其他操作:
# 屏幕更新。就是說代碼對于excel的操作你可以看見。關(guān)閉實時更新,可以加快腳本運行。默認(rèn)是True。
# app.screen_updating = False  

# App進(jìn)程pid
# app.pid       

# 返回一個打開的全部workbook的列表。Python打開的和手動打開的是不互通的
# app.books     
                
# 終止進(jìn)程,強(qiáng)制退出。
# app.quit() #不保存的情況下,退出excel程序

(三)工作簿

注意工作簿應(yīng)該首先被打開

1、新建Excel文檔

# 創(chuàng)建新的book
# 方式一
wb = app.books.add()
# 方式二
wk = xw.Book()

很多教程在提到新建App時都說這兩種方式是一樣的,實際上是有區(qū)別的,
方式1是在當(dāng)前App下新建一個Book,
方式2是創(chuàng)建一個新的App,并在新App中新建一個Book

# 方式三,與方式一方法相似
wk = xw.books.add()

2、 打開Excel文檔

# 支持絕對路徑和相對路徑
wb = app.books.open('filepath')
wk = xw.Book('filepath')
wk = xw.books.open('filepath')

# 練習(xí)的時候建議直接用下面這條
# wb = xw.Book('example.xlsx')
# 這樣的話就不會頻繁打開新的Excel

3、打開未儲存或未關(guān)閉的excel實例

wk = xw.Book('Book1')    
wk = xw.books['Book1']  #也可以使用索引

如果在兩個Excel實例中打開了相同的文件,則需要完全限定它并包含應(yīng)用程序?qū)嵗?/p>

您將通過xw.apps.keys()找到您的應(yīng)用實例密鑰(PID):

xw.apps[10559].books['FileName.xlsx']
查看所有的實例進(jìn)程:
xw.apps.keys() #輸出list

kill所有的實例進(jìn)程:
for i in xw.apps.keys():
  i = 'taskkill/pid ' + str(i) + ' -t -f'     
  os.system(i)

4、打開活動的工作簿

wb = xw.books.active

5、保存

# 保存工作簿,若未指定路徑,保存在當(dāng)前工作目錄。
wb.save(path=None)

6、關(guān)閉

#在沒有保存的情況下關(guān)閉。
wk.close()  

7、退出Excel

app.quit()

(四)工作表

1、打開工作表

# 可以用名字也可以用索引
sheet = xw.books['工作簿的名字'].sheets['sheet的名字']
sheet = xw.books['工作簿的名字'].sheets[0]

2、打開活動工作表

sheet = xw.sheets.active

3、返回sheet指定的book

book_name = sheet.book

4、返回一個range對象,表示sheet上所有的單元格

sheet_cells = sheet.cells

5、獲取或設(shè)置Sheet的名稱

sheet.name
# 返回所有的工作表特定名稱。
sheet_names_list = sheet.names

6、獲取sheet中的所有圖表集合

sheet.charts

7、清空表中所有數(shù)據(jù)和格式。

sheet.clear()

8、清除工作表的內(nèi)容,但保留格式

sheet.clear_contents()

9、刪除工作表

sheet.delete()

10、返回表索引(與excel相同)

sheet.index

11、創(chuàng)建一個新的Sheet并使其成為活動工作表

wb.sheets.add(name=None, before=None, after=None) 
#參數(shù):
name(str,default None) - 新工作表的名稱。 如果為None,則默認(rèn)為Excel的name.

before (Sheet, default None) - 一個對象,指定在新工作表添加之前的added.

after (Sheet, default None) - 指定工作表之后的新工作表的對象。

12、在整個工作表上自動調(diào)整列,行或兩者的寬度

sheet.autofit(axis=None) 

# 參數(shù):
axis (string, default None)
要自動調(diào)整行, 使用以下之一: rows 或 r,
要自動調(diào)整列, 使用以下之一: columns h c,
要自動調(diào)整行和列, 不提供參數(shù)

13、獲取excel sheet多少行多少列

app = xw.App(visible=False, add_book=False)
xls = app.books.open(excel_file)
sheet = xls.sheets[0]
last_cell = sheet.used_range.last_cell
nrows = sheet.used_range.last_cell.row
ncols = sheet.used_range.last_cell.colum

(五)單元格

1、引用A1單元格

rng = xw.books['工作簿的名字'].sheets['sheet的名字'].range('A1')
# 或者
sheet=xw.books['工作簿的名字'].sheets['sheet的名字']
rng=sheet.range('A1')

2、引用活動工作表上的單元格

# 注意Range首字母大寫
rng=xw.Range('A1')

其中需要注意的是單元格的完全引用路徑是:
# 第一個Excel程序的第一個工作薄的第一張sheet的第一個單元格
xw.apps[0].books[0].sheets[0].range('A1')

迅速引用單元格的方式是
sht=xw.books['名字'].sheets['名字']

# A1單元格
rng=sht[’A1']
rng=sht['a1']

# A1:B5單元格
rng=sht['A1:B5']

# 第一行的第一列即a1
rng=sht[0,0] 

# B1單元格
rng=sht[0,1]

3、引用區(qū)域單元格

# A1:J10
rng=sht[:10,:10]

# A1:E10
rng=sht[:10,:5]

rng=sht.range('a1:a5')
#rng = sht['a1:a5']
#rng = sht[:5,0]

4、對于單元格也可以用表示行列的tuple進(jìn)行引用

# A1單元格的引用
xw.Range(1,1)

#A1:C3單元格的引用
xw.Range((1,1),(3,3))

(六)寫入數(shù)據(jù)

1、寫入單個值

# 注意".value“
sht.range('A1').value=1

2、寫入列表

默認(rèn)按行插入

# 將列表[1,2,3]儲存在A1:C1中
sht.range('A1').value=[1,2,3]

# 等同于
sht.range('A1:C1').value = [1,2,3]

按列插入

# 將列表[1,2,3]儲存在A1:A3中
sht.range('A1').options(transpose=True).value=[1,2,3]

其他方法

列表
一維列表:
表示Excel中行或列的范圍作為簡單列表返回,
這意味著一旦它們在Python中,您就丟失了有關(guān)方向的信息。
如果這是一個問題,下一點將向您展示如何保留此信息:


######################## 列方向(嵌套列表)################
列表中,每個元素都已列表方式保存,存儲時,是按照列方向保存的
sht = xw.Book().sheets[0]
sht.range('A1').value = [[1],[2],[3],[4],[5]]  # 列方向(嵌套列表)

返回值為
sht.range('A1:A5').value
[1.0, 2.0, 3.0, 4.0, 5.0]


################## 行方向,普通列表 #######################
sht.range('A1').value = [1, 2, 3, 4, 5]
sht.range('A1:E1').value

返回值為
[1.0, 2.0, 3.0, 4.0, 5.0]    


要強(qiáng)制單個單元格作為列表到達(dá),請使用:

sht.range('A1').options(ndim=1).value

返回值為
[1.0]

多行輸入就要用二維列表

重點:

# 將2x2表格,即二維數(shù)組,儲存在A1:B2中,如第一行1,2,第二行3,4

sht.range('A1').options(expand='table').value=[[1,2],[3,4]]

(七)讀取數(shù)據(jù)

1、讀取單個值

# 將A1的值,讀取到a變量中
a=sht.range('A1').value

2、讀取范圍的值

  • 返回的值是列表形式,多行多列為二維列表。
  • 但有一點要注意,返回的數(shù)值默認(rèn)是浮點數(shù)
#將第一行的值,即將A1到A2的值,讀取到a列表中
a=sht.range('A1:A2').value

# 將第一行和第二行的數(shù)據(jù)按二維數(shù)組的方式讀取
a=sht.range('A1:B2').value

3、讀取Excel表格的行、列

  • 讀取excel的第一列,先計算單元格的行數(shù)
  • 通過這種方法統(tǒng)計的工作區(qū)域的行或者列,不能被空值分隔
  • 空值分隔后面的區(qū)域,不在統(tǒng)計范圍內(nèi)。
  • 更好的方式是通過last_cell方式獲取最下邊且最右邊的一個單元格。
  • last_cell = sheet.used_range.last_cell
  • last_row = last_cell.row
  • last_col = last_cell.column
讀取excel的第一列,先計算單元格的行數(shù)
- 讀取excel的第一列,先計算單元格的行數(shù)
- 通過這種方法統(tǒng)計的工作區(qū)域的行或者列,不能被空值分隔
- 空值分隔后面的區(qū)域,不在統(tǒng)計范圍內(nèi)。
- 更好的方式是通過last_cell方式獲取最下邊且最右邊的一個單元格。

# 獲取工作表的活動區(qū)域
rng = sht.range('a1').expand('table')

# 獲取活動區(qū)域的行數(shù)
nrows = rng.rows.count

# 接著就可以按準(zhǔn)確范圍讀取了
a = sht.range(f'a1:a{nrows}').value

同理選取一行的數(shù)據(jù)也一樣
ncols = rng.columns.count

#用切片
fst_col = sht[0,:ncols].value
獲取行數(shù)、列數(shù),更好且更準(zhǔn)確的方法
# 更好的方式是通過last_cell方式獲取最下邊且最右邊的一個單元格。

last_cell = sheet.used_range.last_cell
last_row = last_cell.row
last_col = last_cell.column

(八)常用函數(shù)和方法

1、Book 工作簿常用的api

# 新建工作簿
xw.books.add()

# 引用當(dāng)前活動工作簿
xw.books.active
wb=xw.books[‘工作簿名稱']
wb.activate()激活為當(dāng)前工作簿
wb.fullname 返回工作簿的絕對路徑
wb.name 返回工作簿的名稱
wb.save(path=None) 保存工作簿,默認(rèn)路徑為工作簿原路徑,若未保存則為腳本所在的路徑
wb.close() 關(guān)閉工作簿


代碼例子:
# 引用Excel程序中,當(dāng)前的工作簿
wb=xw.books.acitve

# 返回工作簿的絕對路徑
x=wb.fullname

# 返回工作簿的名稱
x=wb.name

# 保存工作簿,默認(rèn)路徑為工作簿原路徑,若未保存則為腳本所在的路徑
x=wb.save(path=None)

# 關(guān)閉工作簿
x=wb.close()

2、sheet 常用的api

# 新建工作表
xw.sheets.add(name=None,before=None,after=None)

# 引用當(dāng)前活動sheet
xw.sheets.active

# 引用某指定sheet
sht=xw.books['工作簿名稱'].sheets['sheet的名稱']

# 激活sheet為活動工作表
sht.activate()

# 清除sheet的內(nèi)容和格式
sht.clear()

# 清除sheet的內(nèi)容
sht.contents()

# 獲取sheet的名稱
sht.name

# 刪除sheet
sht.delete

3、range常用的api

# 引用當(dāng)前活動工作表的單元格
rng=xw.Range('A1')

# 加入超鏈接
# rng.add_hyperlink(r'www.baidu.com','百度',‘提示:點擊即鏈接到百度')

# 獲得range的超鏈接
rng.hyperlink

# 取得當(dāng)前range的地址
rng.address
rng.get_address()

# 獲得單元格的絕對地址
rng.get_address(row_absolute=True, column_absolute=True,include_sheetname=False, external=False)





# 清除range的內(nèi)容
rng.clear_contents()

# 清除格式和內(nèi)容
rng.clear()




# 取得range的背景色,以元組形式返回RGB值
rng.color

# 設(shè)置range的顏色
rng.color=(255,255,255)

# 清除range的背景色
rng.color=None




# 返回range中單元格的數(shù)量
rng.count

# 返回current_region當(dāng)前區(qū)域
rng.current_region

# 返回ctrl + 方向
rng.end('down')





# 獲取公式或者輸入公式
rng.formula='=SUM(B1:B5)'

# 數(shù)組公式
rng.formula_array



# range平移
rng.offset(row_offset=0,column_offset=0)

#range進(jìn)行resize改變range的大小
rng.resize(row_size=None,column_size=None)



# 獲得range的第一列列標(biāo)
rng.column

# 獲得列寬
rng.column_width

# 返回range的總寬度
rng.width



# range的第一行行標(biāo)
rng.row

# 行的高度,所有行一樣高返回行高,不一樣返回None
rng.row_height

# 返回range的總高度
rng.height



###################################################

# 獲得range中右下角最后一個單元格
rng.last_cell






# 返回range的行數(shù)和列數(shù)
rng.shape

# 返回range所在的sheet
rng.sheet



#返回range的所有行
rng.rows

# range的第一行
rng.rows[0]

# range的總行數(shù)
rng.rows.count



# 返回range的所有列
rng.columns

# 返回range的第一列
rng.columns[0]

# 返回range的列數(shù)
rng.columns.count






# 所有range的大小自適應(yīng)
rng.autofit()

# 所有列寬度自適應(yīng)
rng.columns.autofit()

# 所有行寬度自適應(yīng)
rng.rows.autofit()

三、Python工具類,通過代碼操作Excel表格

以下是我的工具類代碼,轉(zhuǎn)載請注明出處。

#!/usr/bin/python
# -*- coding: UTF-8 -*-

import os
import xlwings


class ToolExcel(object):
    __file_name = "workbook.xlsx"
    __sheet_name = "Sheet1"

    # 新建工作簿
    @staticmethod
    def workbook_new(file_name: str = __file_name):

        # 工作簿文件路徑
        workbook_file_path = os.path.join(os.getcwd(), "workbook", file_name)
        # 工作簿當(dāng)前目錄
        workbook_dir_path = os.path.dirname(workbook_file_path)

        # 如果不存在目錄路徑,就創(chuàng)建
        if not os.path.exists(workbook_dir_path):
            # 創(chuàng)建工作簿路徑,makedirs可以創(chuàng)建級聯(lián)路徑
            os.makedirs(workbook_dir_path)

        # 如果不存在,Excel工作簿文件,就創(chuàng)建工作簿
        if not os.path.exists(workbook_file_path):
            # 打開Excel程序,APP程序(即Excel程序)不可見,只打開不新建工作薄,屏幕更新關(guān)閉
            app = xlwings.App(visible=False, add_book=False)
            # Excel工作簿顯示警告,不顯示
            app.display_alerts = False
            # 工作簿屏幕更新,不更新
            app.screen_updating = False
            # 創(chuàng)建工作簿
            wb = app.books.add()
            # 保存工作簿,若未指定路徑,保存在當(dāng)前工作目錄。
            wb.save(workbook_file_path)
            # 關(guān)閉工作簿
            wb.close()
            # 退出Excel
            app.quit()

    # 讀取工作簿全部內(nèi)容,返回二維列表
    @staticmethod
    def workbook_read(file_name=__file_name, sheet_name=__sheet_name):
        # 工作簿文件路徑
        workbook_file_path = os.path.join(os.getcwd(), "workbook", file_name)
        # 如果文件存在,就執(zhí)行
        if os.path.exists(workbook_file_path):
            # 打開Excel程序,APP程序(即Excel程序)不可見,只打開不新建工作薄,屏幕更新關(guān)閉
            app = xlwings.App(visible=False, add_book=False)
            # Excel工作簿顯示警告,不顯示
            app.display_alerts = False
            # 工作簿屏幕更新,不更新
            app.screen_updating = False
            # 打開工作簿
            wb = app.books.open(workbook_file_path)
            # 獲取活動的工作表
            sheet = wb.sheets[sheet_name]

            # 獲取已編輯的矩形區(qū)域,最底部且最右側(cè)的單元格
            last_cell = sheet.used_range.last_cell
            # 最大行數(shù)
            last_row = last_cell.row
            # 最大列數(shù)
            last_col = last_cell.column

            """
            # 讀取二維列表
            # 注釋:如果含有 .options(expand='table').value 參數(shù),空值隔斷的部分,不會被讀取
            # data = sheet.range((1, 1), (last_row, last_col)).options(expand='table').value
            """

            # 讀取二維列表
            data = sheet.range((1, 1), (last_row, last_col)).value

            # 關(guān)閉工作簿
            wb.close()
            # 退出Excel
            app.quit()
            return data

    # 寫入二維列表,追加模式
    @staticmethod
    def workbook_append(data: list = None, file_name=__file_name, sheet_name=__sheet_name):
        # 工作簿文件路徑
        workbook_file_path = os.path.join(os.getcwd(), "workbook", file_name)

        # 如果工作簿不存在,就創(chuàng)建工作簿
        if not os.path.exists(workbook_file_path):
            ToolExcel.workbook_new()

        # 如果文件存在,就執(zhí)行
        if os.path.exists(workbook_file_path):
            # 打開Excel程序,APP程序(即Excel程序)不可見,只打開不新建工作薄,屏幕更新關(guān)閉
            app = xlwings.App(visible=False, add_book=False)
            # Excel工作簿顯示警告,不顯示
            app.display_alerts = False
            # 工作簿屏幕更新,不更新
            app.screen_updating = False
            # 打開工作簿
            wb = app.books.open(workbook_file_path)
            # 獲取活動的工作表
            sheet = wb.sheets[sheet_name]

            # 獲取已編輯的矩形區(qū)域,最底部且最右側(cè)的單元格
            last_cell = sheet.used_range.last_cell
            # 最大行數(shù)
            last_row = last_cell.row

            # 寫入二維列表,追加模式
            sheet.range((last_row + 1, 1)).options(expand='table').value = data

            # # 保存文件,保存以后重新讀取單元格,重新獲取所有活動區(qū)域的cell.
            # # 是否保存, 有待考證?
            # wb.save()

            # 獲取已編輯的矩形區(qū)域,最底部且最右側(cè)的單元格
            last_cell = sheet.used_range.last_cell
            # 最大行數(shù)
            last_row = last_cell.row
            # 最大列數(shù)
            last_col = last_cell.column
            # 在range中,cell的大小自適應(yīng)
            sheet.range((1, 1), (last_row, last_col)).columns.autofit()

            # 保存文件
            wb.save()
            # 關(guān)閉工作簿
            wb.close()
            # 退出Excel
            app.quit()

    # 寫入二維列表,重寫模式
    @staticmethod
    def workbook_rewrite(data: list = None, file_name=__file_name, sheet_name=__sheet_name):
        # 工作簿文件路徑
        workbook_file_path = os.path.join(os.getcwd(), "workbook", file_name)

        # 如果工作簿不存在,就創(chuàng)建工作簿
        if not os.path.exists(workbook_file_path):
            ToolExcel.workbook_new()

        # 如果文件存在,就執(zhí)行
        if os.path.exists(workbook_file_path):
            # 打開Excel程序,APP程序(即Excel程序)不可見,只打開不新建工作薄,屏幕更新關(guān)閉
            app = xlwings.App(visible=False, add_book=False)
            # Excel工作簿顯示警告,不顯示
            app.display_alerts = False
            # 工作簿屏幕更新,不更新
            app.screen_updating = False
            # 打開工作簿
            wb = app.books.open(workbook_file_path)
            # 獲取活動的工作表
            sheet = wb.sheets[sheet_name]

            # 清除sheet的內(nèi)容和格式
            sheet.clear()

            # 寫入二維列表,重寫模式
            sheet.range("A1").options(expand='table').value = data

            # 獲取已編輯的矩形區(qū)域,最底部且最右側(cè)的單元格
            last_cell = sheet.used_range.last_cell
            # 最大行數(shù)
            last_row = last_cell.row
            # 最大列數(shù)
            last_col = last_cell.column
            # 所有range的大小自適應(yīng)
            sheet.range((1, 1), (last_row, last_col)).columns.autofit()

            # 保存文件
            wb.save()
            # 關(guān)閉工作簿
            wb.close()
            # 退出Excel
            app.quit()


四、參考文獻(xiàn):

xlwings使用教程
https://blog.csdn.net/qq_37289115/article/details/106666073

xlwings 中文文檔
https://www.kancloud.cn/gnefnuy/xlwings-docs/1127450

辦公自動化系列(3)| 全網(wǎng)最詳細(xì)的xlwings庫解析-上篇 http://www.itdecent.cn/p/5b1cbb0637bb

徹底搞懂Python切片操作
http://www.itdecent.cn/p/15715d6f4dad

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

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