日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Python操作Excel工作簿的示例代碼(*.xlsx)

瀏覽:21日期:2022-08-01 14:33:09

前言

Excel 作為流行的個人計算機數據處理軟件,混跡于各個領域,在程序員這里也是常常被處理的對象,可以處理 Excel 格式文件的 Python 庫還是挺多的,比如 xlrd、xlwt、xlutils、openpyxl、xlwings 等等,但是每個庫處理 Excel 的方式不同,有些庫在處理時還會有一些局限性。

接下來對比一下幾個庫的不同,然后主要記錄一下 xlwings 這個庫的使用,目前這是個人感覺使用起來比較方便的一個庫了,其他的幾個庫在使用過程中總是有這樣或那樣的問題,不過在特定情況下使用也是挺不錯的。

EXCEL文件

Excel 被稱為電子表格,其實際可以保存的格式分為很多種,但是“Excel 工作簿(*.xlsx)”和“Excel 97-2003 工作簿(*.xls)”是其中比較常用的兩種,可以認為 .xls 格式的表格是 03版Excel 之前常用的格式,而 .xlsx 是 03版之后,一般指 07版Excel 之后常用的格式。

一般的 Excel 程序對于上述的兩種格式都可以打開編輯,也可以相互轉化存儲,不過還是建議在沒有特殊要求的情況下使用新版本的格式,一方面新的穩定版本可能會修復之前的一些BUG,同時也會帶來進行一些優化。

我也是在寫這篇總結之前才發現,一個空的 .xlsx 格式的文件大小有 7KB,而一個空的 .xls 格式的文件大小有 24KB,當我分別寫入一個相同的漢字后,兩個文件大小變成了 10KB 和 30KB,差距還是不小的,還有一個問題就是在將 .xlsx 格式的文件另存為 .xls 格式時還會有兼容性提示,提醒用戶有些設置可能會丟失,所以能選新版本還是盡量用新版本吧。

測試環境

因為很多應用程序是不斷迭代的,相對應的 Python 庫也是不斷迭代的,這里盡可能的給出版本號,不同的版本可能會有不同的問題:

操作系統: Windows 10 隨意版 Python: 3.75 xlrd: 1.2.0 xlwt: 1.3.0 xlutils: 2.0.0 openpyxl: 3.0.3 xlwings: 0.18.0

以上各個程序庫使用之前自行安裝就行,安裝方法就不贅述了,不過可以提供一個可以快速安裝鏡像源,使用 pip install -i https://pypi.doubanio.com/simple 庫名 可以盡可能解決下載安裝緩慢的問題。

Excel具體操作

關于使用 Python 具體操作 Excel 的方法可以分為三組,配合使用 xlrd、xlwt、xlutils 操作作為第一組,使用庫 openpyxl 作為第二組,而 xlwings 作為第三組,這篇總結重點總結 xlwings 的使用,其他兩組簡單了解。

xlrd、xlwt、xlutils

這一組操作 Excel 的庫名字很形象,一個讀、一個寫、一個小工具,湊到一起就可以對 Excel 肆意妄為了,下面做個小練習,打開一個 Excel 文件然后修改第一個單元格的值,再另存為一個新文件,代碼如下:

import xlrdimport xlwtimport xlutils.copydef save_as_new_file(file_name, new_file_name): # 打開Excel文件 rb = xlrd.open_workbook(file_name) # 創建一個可寫入的副本 wb = xlutils.copy.copy(rb) # 獲得第一個sheet頁簽 ws = wb.get_sheet(0) # 第一個單元格寫入測試值 ws.write(0, 0, ’test value’) # 另存為一個新文件 wb.save(new_file_name)

上述代碼無論是操作 .xlsx 文件還是操作 .xls 文件都不會報錯,但是另存為的 .xlsx 格式的文件會打不開,同時你會發現正常存儲的 .xls 文件打開后格式全都沒了,怎么辦,改個參數試試,將打開文件的代碼修改如下:

rb = xlrd.open_workbook(file_name, formatting_info=True)

其中參數 formatting_info=True 就表示打開Excel時保留原有的格式,但是這是相對于 .xls 格式的文件,對于 .xlsx 格式的文件直接跑出異常 raise NotImplementedError('formatting_info=True not yet implemented'),就因為處理不了 .xlsx 格式的文件,我暫時沒有使用這幾個庫操作 Excel。

還有一點,這幾個庫操作單元格時,行和列的索引是從0開始的。

openpyxl

首先說這個庫主要用來操作 .xlsx 格式的文件,對于 .xls 格式的文件無法打開,會報 openpyxl does not support the old .xls file format 這樣的錯誤,但是可以存儲成這樣的格式,再次打開時會有格式不匹配的警告,但是基礎的數據還在,所以還是優先用來操作 .xls 格式的文件吧。

寫一個新文件的常見用法:

from openpyxl import Workbookfrom openpyxl import load_workbookfrom openpyxl.styles import Font, Fill, Alignment, PatternFilldef write_new_excel(file_name): # 創建一個excel文檔 wb = Workbook() # 獲得當前激活的sheet對象 ws = wb.active # 給A2單元格賦值 ws[’A2’] = ’This is A2 cell’ # 一行添加多列數據 ws.append([1, 2, ’hello’]) # 添加新的sheet ws = wb.create_sheet(title=’NewInfo’,index=0) # 設置單元格的值 ws[’A1’] = ’This is new sheet’ # 保存excel wb.save(file_name)

讀取和改寫一個原有文件的常見用法:

def read_update_excel(file_name): # 加載Excel表 wb = load_workbook(file_name) # 打印sheet數量 print(’sheet count:’, len(wb.sheetnames)) # 打印所有sheet名字 print(’sheet name list:’, wb.sheetnames) # 獲取第一個sheet對象 ws = wb[wb.sheetnames[0]] # 打印sheet表行數和列數 print(’rows count:’, ws.max_row, ’cols count:’, ws.max_column) # 更新單元格A1的內容 ws[’A1’] = ’this is A1’ # 在第二行位置插入一行 ws.insert_rows(2) # 刪除第五行 ws.delete_rows(5) # 獲取單元格對象,對應B2單元格 cell = ws.cell(2,2) # 設置單元格內容 cell.value = ’this is B2’ # 修改字體格式為粗體 cell.font = Font(bold=True) # 修改單元格格式 cell.fill = PatternFill('solid', fgColor='F0CDCD') # 保存原文件或另存一個文件 wb.save(file_name)

使用這個庫遇到的情況,存儲帶有樣式的數據沒有發現問題,但是當加入一個計算公式后,另存為一個文件時明顯文件尺寸變小了,但是數據和公式沒有發現有問題。

有資料說處理速度真的很慢,因為我處理的文件比較小,但是沒有發現這方面的問題,還有一個問題就是說Excel中的宏全部丟失,這個測試的時候確實是丟了,只不過這個好像和文件格式有關,要想保存宏需要存儲為 .xlsm 格式,但是 openpyxl 使用來操作 .xlsx 文件的,存儲時會導致宏丟失,強行存儲為 .xlsm 格式會導致最終的文件打不開。

還有一點,這個庫操作單元格時,行和列的索引是從1開始的。

xlwings

這個庫在操作的首先要創建一個 App,通過這個創建出來的 App 對象來操作 Excel,非常像把 Excel 的各種操作 api 封裝到一起,然后通過這個 App 對象來調用,如果在創建 App 的時候不設置隱藏參數,是會正常打開 Excel 程序的。

使用 xlwings 的基本方式:

import xlwings as xw# 設置Excel程序不可見app = xw.App(visible=False, add_book=False)# 通過 app 操作 Excel文件# app.bala bala bala .....# app.bala bala bala .....# 優雅的退出app.quit()

創建一個新的 Excel 文件并寫入數據:

def write_new_excel(app, file_name): # 創建新的 Excel 表 wb = app.books.add() # 獲取當前活動的sheet ws = wb.sheets.active # 初始化二維區域的值 arr_data = [[1, 2, 3], [4, 5, 6], [7, 8, ’end’]] # 設置到新建的Excel中 ws.range(’A1:B3’).value=arr_data # 設置單獨一個單元格的值 ws.range(’A4’).value=’this is A4’ # 設置單獨一個單元格的值 ws[3,1].value=’this is B4’ # 保存Excel文件 wb.save(file_name) wb.close()

需要注意的是通過行索引和列索引修改單元格時,起始索引是0。

讀入已有 Excel 表格并修改

def read_update_excel(app, file_name): # 加載已有的表格 load_wb = app.books.open(file_name) # 獲取Excel表中第一個sheet load_ws = load_wb.sheets[0] # 打印sheet的名字 print(load_ws.name) # 根據sheet名字獲取sheet對象 load_ws = load_wb.sheets[load_ws.name] # 獲取當前活動的sheet load_ws = load_wb.sheets.active # 獲取存在數據的行數和列數 rows = load_ws.api.UsedRange.Rows.count cols = load_ws.api.UsedRange.Columns.count print(’rows count:’, rows, ’cols count:’, cols) # 修改指定單元格數據(A1單元格) load_ws[0,0].value=’this is A1’ # 有空行或空列時獲取準確的行列數量 print(load_ws.used_range.shape) # 從A1單元格開始擴展到非空行空列,最后的行數和列數 print((load_ws.range(’A1’).expand().last_cell.row, load_ws.range(’A1’).expand().last_cell.column)) # 從A1單元格開始擴展到非空行空列,最后的行數和列數 print((load_ws.range(’A1’).expand().last_cell.row, load_ws.range(’A1’).expand().last_cell.column)) # 從A1單元格開始擴展到非空行空列,最后形狀 print(load_ws.range(1,1).expand().shape) # 從A1單元格開始擴展到非空行空列,最后的行數和列數 print((load_ws.range(’A1’).expand(’table’).rows.count, load_ws.range(’A1’).expand(’table’).columns.count)) # 保存修改后的Excel load_wb.save(file_name) load_wb.close()

Excel 增加刪除行和列

def insert_delete_rowscols(app, file_name): # 加載已有的表格 load_wb = app.books.open(file_name) # 獲取當前活動的sheet load_ws = load_wb.sheets.active # 從第2行開始插入4行,也就是說2-5行變成新插入的空行 load_ws.api.rows(’2:5’).insert # 刪除第6行和第7行 load_ws.api.rows(’6:7’).delete # 插入一個單元格,實際測試效果是B列從B2開始向下移動,B2為新添加的單元格 load_ws.range(’B2’).api.insert # 插入新的一列 load_ws.api.columns(’B’).insert # 刪除一列 load_ws.api.columns(’C’).delete # 保存修改后的Excel load_wb.save(file_name) load_wb.close()

單元格寬高查詢設置與合并

def cell_operation(app, file_name): # 加載已有的表格 load_wb = app.books.open(FILE_PATH_ROOT + file_name) # 獲取當前活動的sheet load_ws = load_wb.sheets.active # 合并單元格 load_ws.range(’A2:A3’).api.merge #獲取單元格 cell = xw.Range(’B2’) # 打印單元格所在的行和列 print('row is:', cell.row, 'col is:', cell.column) # 打印當前格子的高度和寬度 print('cell.width:', cell.width, 'cell.height:', cell.height) # 設置當前格子的高度和寬度 cell.row_height = 32 cell.column_width = 64 # 指定單元格的高度和寬度自適應 cell.columns.autofit() cell.rows.autofit() # 再次打印當前格子的高度和寬度 print('cell.width:', cell.width, 'cell.height:', cell.height) # 保存修改后的Excel load_wb.save(file_name) load_wb.close()

幾個庫支持情況對比

雖然前面寫了這么多方法,但是遇到一個實際的問題時還是會猶豫,到底用哪種方式呢?下面做一個簡單的對比,只是根據我做的實驗來簡單對比,如果有不準確甚至是錯誤的地方,歡迎大家指出來,我會盡快改正的。

情景/庫 xlrd、xlwt、xlutils openpyxl xlwings 讀取.xls 可以帶有樣式讀取 不支持 可以讀取 保存.xls 可以帶有樣式保存 可以保存,但是提示文件擴展名不匹配,可以看到原始數據 可以保存,但是提示文件擴展名不匹配,可以看到原始數據 讀取.xlsx 可以讀取,但沒有樣式 可以帶有樣式讀取 可以帶有樣式讀取 保存.xlsx 保存后打不開 可以帶有樣式保存 可以帶有樣式保存 讀取.xlsm 可以讀取,但沒有樣式和宏 可以讀取,但沒有宏 可以讀取包含宏的表格 保存.xlsm 保存后打不開,存成 .xls 格式宏丟失 保存后打不開,存成 .xls想 格式宏丟失 存儲后宏還在 增刪行和列 沒有直接方法 支持 支持 另存后大小 .xls 文件沒有變化 .xlsx 文件會變小 .xls、.xlsx 文件沒有變化 使用建議 只操作.xls文件可以考慮 只操作.xlsx文件可以考慮,不能帶有宏 一個比較好的選擇,使用時感覺速度稍微有點慢

總結

Excel 表格程序經過版本的更替發生了很大的變化,出現了相同內容時 .xls 比 .xlsx 格式的文件大很多的情況 基于上一點考慮,如果能使用的新版的表格,那么就放棄舊的格式的吧 還有一個神奇的情況,一個帶有少量數據的 .xlsx 格式的表格要比一個空表格還要小,這是什么情況,暫時沒弄明白怎么回事,求知道的大神告知一二

到此這篇關于Python操作Excel工作簿的示例代碼(*.xlsx)的文章就介紹到這了,更多相關Python操作Excel工作簿內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: python
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
国产日本精品| 日韩av在线免费观看不卡| 日韩精品免费一区二区夜夜嗨| 黄色av日韩| 蜜桃一区二区三区在线观看| 亚洲理论在线| 中文字幕亚洲影视| 日韩黄色av| 国产精品自在| 欧美日韩视频免费观看| 久久高清精品| 亚洲资源网站| 麻豆精品在线视频| 伊人久久大香线蕉av不卡| 蜜臀av在线播放一区二区三区| 国产精品中文| 欧美午夜精品一区二区三区电影| 视频一区中文字幕| 精品久久网站| 羞羞答答国产精品www一本| 日韩超碰人人爽人人做人人添| 国产精品香蕉| 国产综合精品一区| 国产毛片一区二区三区| 人在线成免费视频| 久久国产精品99国产| 精品视频免费| 日韩 欧美一区二区三区| 国内不卡的一区二区三区中文字幕| 激情中国色综合| 久久伊人国产| 免费成人在线视频观看| 麻豆久久久久久久| 狠狠干成人综合网| 激情综合五月| 视频精品一区| 国产+成+人+亚洲欧洲在线| 尹人成人综合网| 精品国产18久久久久久二百| 亚洲资源在线| 在线亚洲国产精品网站| 91嫩草亚洲精品| 欧美一区在线观看视频| 99在线|亚洲一区二区| 日韩成人综合| 国产91欧美| 美女精品视频在线| 国产女优一区| 午夜精品影院| 日韩欧美午夜| 欧美好骚综合网| 国产精品毛片aⅴ一区二区三区| 夜夜精品视频| 亚洲一区二区三区高清不卡| 日韩在线观看不卡| 中文av在线全新| 国产精品成久久久久| 国产成人精品三级高清久久91| 国产欧美日韩综合一区在线播放| 91精品麻豆| 欧美午夜三级| 国产精品久久久久久模特| 国产亚洲精品美女久久| 国产九九精品| 国产精品2区| 国产成人免费| 成人日韩在线观看| 三级小说欧洲区亚洲区| 五月婷婷六月综合| 人人精品人人爱| 日韩欧美激情电影| 麻豆91精品视频| av资源新版天堂在线| 日韩av免费| 国产精品老牛| 日韩高清三区| 超碰在线99| 欧美aa国产视频| 亚洲一区成人| 欧美日韩va| 久久精品免费一区二区三区| 美女少妇全过程你懂的久久| 中文精品视频| 国产精品一区二区三区av| 国产成人精品一区二区三区免费| av亚洲一区二区三区| 亚洲精品影视| 国产麻豆久久| 久久国产日韩欧美精品| 久久91导航| 日本久久一区| 老司机久久99久久精品播放免费| 视频一区视频二区中文| 日韩美女精品| 欧美xxxx性| 日韩精品一二三四| 精品一区二区三区的国产在线观看| 国产福利91精品一区二区| 午夜在线播放视频欧美| 精品72久久久久中文字幕| 亚洲免费毛片| 亚洲高清二区| 综合日韩av| 亚洲精品一级二级三级| 午夜精品一区二区三区国产| 国产欧美日韩一区二区三区四区| 国产精品字幕| 日本午夜大片a在线观看| 91福利精品在线观看| 在线亚洲国产精品网站| 1000部精品久久久久久久久| 国产另类在线| 久久99国产精品视频| 国产亚洲一区二区手机在线观看| 久久精品日韩欧美| 国产免费av国片精品草莓男男| 免费一级片91| 日韩一区欧美二区| 香蕉久久精品| 亚洲婷婷免费| 欧美日韩国产一区二区三区不卡| 精品国产18久久久久久二百| 久久中文字幕一区二区| 国产激情综合| 国产极品模特精品一二| 欧美日韩精品一区二区三区视频| 日韩专区一卡二卡| 99热精品久久| 久久久夜夜夜| 久久国产免费| 亚洲成人免费| 99视频+国产日韩欧美| 在线综合视频| 中文字幕一区二区三区四区久久| 欧美日韩国产传媒| 免费在线观看精品| 日韩中文字幕91| 亚洲字幕久久| 日韩精品国产欧美| 国产一区二区色噜噜| 国产精品最新| 欧美日韩免费观看一区=区三区 | 日韩中文字幕区一区有砖一区 | 视频一区在线播放| 麻豆9191精品国产| 在线观看视频免费一区二区三区| 亚洲少妇在线| 日韩成人一级| 日韩不卡一区二区三区| 国产精品九九| 色爱av综合网| 亚洲毛片视频| 久久超碰99| 九色精品91| 国产精品88久久久久久| 亚洲一区日本| 欧美中文一区| 在线手机中文字幕| 国产综合色产| 日本午夜精品| 日韩中文在线电影| 免费国产亚洲视频| 欧美国产不卡| 久久九九电影| 老牛影视精品| 天堂va在线高清一区| 久久久久久夜| 亚洲一区欧美| 日韩综合一区| 亚洲精品影院在线观看| 日韩欧美不卡| 欧美亚洲福利| 99视频在线精品国自产拍免费观看| 国产精品xvideos88| 日韩午夜电影| 黄在线观看免费网站ktv| 亚洲日本在线观看视频| 成人羞羞在线观看网站| 视频精品一区二区| 久久视频一区| 欧美成人精品午夜一区二区| 视频一区二区三区在线| 亚洲欧美日韩高清在线| 国产不卡精品| 国产激情久久| 涩涩av在线| 国产精品欧美三级在线观看| 欧美一区二区三区激情视频| 日本视频在线一区| 日韩一级网站| 久久久久国产| 牛牛精品成人免费视频| 91久久中文| 国产一区二区视频在线看| 激情偷拍久久| 成人久久久久| 999精品色在线播放| 手机在线电影一区| 美女高潮久久久| 电影91久久久|