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

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

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

瀏覽:15日期: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久久,三上悠亚国产精品一区二区三区
99久久精品网站| 亚洲中字黄色| 日韩精品一级| 亚洲精品精选| 日韩精选在线| 日韩精品视频网| 日韩欧美精品一区二区综合视频| 蜜臀va亚洲va欧美va天堂| 久色成人在线| 婷婷成人av| 国产日韩中文在线中文字幕| 蜜臀a∨国产成人精品| 天堂av在线一区| 亚洲欧美网站在线观看| 日韩va亚洲va欧美va久久| 亚洲精品在线国产| 国产伦理久久久久久妇女| 欧美精品导航| 国产网站在线| 蜜桃av一区二区三区电影| 日韩一二三区在线观看| 欧美日本三区| 国模精品一区| 久久美女精品| 午夜久久tv| 中文字幕乱码亚洲无线精品一区| 少妇精品久久久一区二区三区| 日韩av不卡在线观看| 免费在线亚洲欧美| 久久精品1区| 亚洲图片久久| 国产日韩欧美一区二区三区在线观看| 成人在线免费观看网站| 午夜视频精品| 欧美日韩亚洲一区三区| 国产高潮在线| 免费在线视频一区| 国产福利一区二区精品秒拍| 日韩大片在线| 蜜臀精品久久久久久蜜臀| 国产欧美亚洲一区| 国产成人精选| 欧美日韩精品一本二本三本| 日韩国产在线不卡视频| 国内自拍视频一区二区三区| 99成人超碰| 综合视频一区| 国产欧洲在线| 日韩免费精品| 亚洲精品一级二级| 亚洲麻豆一区| 97se综合| 日韩精品福利一区二区三区| 麻豆mv在线观看| 蜜桃视频免费观看一区| 国产成人精品一区二区三区视频| 在线亚洲免费| 欧美aaaaaa午夜精品| 欧美~级网站不卡| 国产精品日韩精品在线播放| 欧美91福利在线观看| 久久激情综合网| 亚洲成人三区| 精品美女在线视频| 亚洲毛片一区| 久久天堂精品| 久久不见久久见国语| 亚洲神马久久| 久久久久久网| 日本少妇精品亚洲第一区| 日韩毛片在线| 国产亚洲电影| 国产伦久视频在线观看| 日本91福利区| 日韩一级不卡| 水蜜桃精品av一区二区| 日韩精品高清不卡| 女同性一区二区三区人了人一| 久久精品国产在热久久| 一二三区精品| 国产成人黄色| 国产丝袜一区| 国产手机视频一区二区| 高潮久久久久久久久久久久久久| 蜜桃视频一区二区三区在线观看| 人人香蕉久久| 久久99精品久久久野外观看| 久久福利精品| 999久久久91| 色偷偷色偷偷色偷偷在线视频| 久久精品av麻豆的观看方式| 免费日本视频一区| 色爱综合av| 精品五月天堂| 欧美日韩中出| 亚洲毛片在线免费| 久久www成人_看片免费不卡| 99精品视频精品精品视频| 成人在线免费观看91| 欧美交a欧美精品喷水| 亚洲精品少妇| 免费一级片91| 视频一区中文| 99精品视频在线观看免费播放| 国产成人1区| 精品成人18| 精品国产一区二区三区av片| 国产亚洲欧美日韩精品一区二区三区 | 午夜在线精品偷拍| 丝袜脚交一区二区| 亚洲精品福利电影| 精品视频一区二区三区四区五区| 日本欧美一区| 日韩成人av影视| 日韩激情网站| 午夜久久av| 亚洲久久在线| 最近国产精品视频| 亚洲一区欧美| 久久福利毛片| 男女男精品网站| 99精品国产一区二区三区| 日韩综合精品| 成人羞羞视频播放网站| 久久免费黄色| 欧美91视频| 国产一区导航| 午夜亚洲福利在线老司机| av成人国产| 中文字幕一区二区精品区| 日韩一区二区三区在线看| 日韩av一级片| 国产欧美另类| 久久精品国产成人一区二区三区| 国产精品精品| 久久久久美女| 蜜桃成人av| 丝袜诱惑制服诱惑色一区在线观看| 另类激情亚洲| 少妇精品久久久一区二区| 青青国产精品| 久久不见久久见国语| 中文字幕在线看片| 不卡中文字幕| 在线看片日韩| 青青草国产精品亚洲专区无| 麻豆精品久久| 91精品综合| 蜜桃久久精品一区二区| 久久狠狠亚洲综合| 97视频热人人精品免费| 亚洲性色av| 亚洲综合另类| 欧美三区不卡| 成人日韩在线| 久久国产成人| 国产精品igao视频网网址不卡日韩 | 欧美黄色精品| 日韩中文视频| 日韩中文字幕91| 四虎精品一区二区免费| 国产精品观看| 国产suv精品一区二区四区视频 | 国产精品久久久久毛片大屁完整版| 欧美激情网址| 99久久久国产精品美女| 天堂成人免费av电影一区| 国产美女视频一区二区| 成人片免费看| 视频一区中文字幕| 美女在线视频一区| 欧美中文字幕一区二区| 国产精品色网| 国产麻豆精品| 亚洲高清激情| 97se亚洲| 精品午夜久久| 亚洲一区二区三区四区五区午夜| 国产欧美欧美| 一区久久精品| 欧美精品中文字幕亚洲专区| 蜜桃成人精品| 日本午夜精品一区二区三区电影 | 香蕉久久国产| 蜜桃精品视频| 免费在线看一区| yellow在线观看网址| 蜜臀久久久99精品久久久久久| 福利一区和二区| 日日夜夜免费精品| 99精品综合| 久久av影院| 国产视频久久| 97在线精品| 日韩不卡一区二区| 亚洲成人三区| 激情综合婷婷| 中文字幕av一区二区三区人| 日韩欧美1区| 国产日韩亚洲欧美精品|