python實(shí)現(xiàn)讀取Excel內(nèi)容并展示成json
還是先來(lái)介紹一下我的背景:昨天突然接到了這樣的活,需要用python解析Excel中多個(gè)sheet文件的內(nèi)容,并最終展示成格式化的json。一想,這個(gè)我拿手啊,記得shigen
之前有一篇這樣的文章:如何在終端查看excel內(nèi)容,豈不是可以直接派上場(chǎng)了。然而事實(shí)是我大意了,我沒(méi)有考慮到excel中存在的部分單元格是函數(shù)計(jì)算出來(lái)的情況。為了更好的說(shuō)明問(wèn)題,我先來(lái)模擬一個(gè)表格看看:
表格中的數(shù)據(jù)全都是我用程序生成的,可參考文章:一個(gè)腳本,實(shí)現(xiàn)隨機(jī)數(shù)據(jù)生成自由
那我們依舊用之前的程序讀取會(huì)怎么樣子呢?
發(fā)現(xiàn)很正常,但昨天就是不行,是我多疑了?我一看,昨天的文件是xlsm
格式的,意思也就是現(xiàn)在的文件是帶有宏
的。那到時(shí)候繼續(xù)用那個(gè)文件試試吧。
現(xiàn)在,我們來(lái)實(shí)現(xiàn)讀取文件并選取指定的范圍展示成json
的格式。先來(lái)看看實(shí)現(xiàn)的效果吧:
發(fā)現(xiàn)基本是符合預(yù)期的,那現(xiàn)在看看代碼吧,主要的依賴(lài)庫(kù)可以直接先安裝:
pip3 install numpy xlwings
直接執(zhí)行一下的代碼即可,具體的代碼、函數(shù)調(diào)用可參考代碼中的注釋和文檔:
# -*- encoding: utf-8 -*- __date__ = '2023/12/23 12:04:32' ? import json import numpy as np import xlwings as xw ? ? def get_sheet_matrix(file_path: str, sheet_name: str, start_cell: str, end_cell: str) ->np.ndarray: """ 從指定的 Excel 文件中獲取指定工作表、區(qū)域的數(shù)據(jù),并返回一個(gè) NumPy 矩陣。 ? Args: file_path (str): Excel 文件的路徑。 sheet_name (str): 要讀取數(shù)據(jù)的工作表名稱(chēng)。 start_cell (str): 起始單元格的位置,例如 'A1'。 end_cell (str): 結(jié)束單元格的位置,例如 'C3'。 ? Returns: numpy.ndarray: 包含指定區(qū)域數(shù)據(jù)的二維數(shù)組矩陣。 ? Raises: FileNotFoundError: 如果文件路徑不存在或無(wú)法訪問(wèn)。 ValueError: 如果起始單元格或結(jié)束單元格的位置格式不正確。 ? Example: # 示例用法 file_path = 'path/to/file.xlsx' sheet_name = 'Sheet1' start_cell = 'A1' end_cell = 'C3' matrix = get_sheet_matrix(file_path, sheet_name, start_cell, end_cell) print(matrix) """ app = xw.App(visible=False) workbook = app.books.open(file_path) sheet = workbook.sheets[sheet_name] # 獲取指定區(qū)域的值并構(gòu)建二維列表 values = sheet.range(start_cell, end_cell).value # 將二維列表轉(zhuǎn)換為 NumPy 矩陣 matrix = np.array(values) workbook.close() app.quit() ? return matrix ? def matrix_to_json(matrix: np.ndarray) -> str: """ 將矩陣數(shù)據(jù)轉(zhuǎn)換為 JSON 格式。 ? Args: matrix: 二維 NumPy 數(shù)組,包含表頭和數(shù)據(jù)。 ? Returns: JSON 格式的字符串。 """ headers = matrix[0] data = matrix[1:] ? json_data = [] for row in data: item = {} for i in range(len(headers)): item[headers[i]] = row[i] json_data.append(item) ? json_str = json.dumps(json_data, indent=2, ensure_ascii=False) return json_str ? if __name__ == '__main__': # 此處必須寫(xiě)絕對(duì)路徑 file_path = '/Users/zzzz/Downloads/demo.xlsm' sheet_name = 'Sheet1' start_cell = 'A1' end_cell = 'D11' matrix = get_sheet_matrix(file_path, sheet_name, start_cell, end_cell) print(matrix) print(matrix_to_json(matrix))
到此這篇關(guān)于python實(shí)現(xiàn)讀取Excel內(nèi)容并展示成json的文章就介紹到這了,更多相關(guān)python讀取Excel內(nèi)容內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
python 標(biāo)準(zhǔn)庫(kù)原理與用法詳解之os.path篇
os.path模塊主要用于文件的屬性獲取,在編程中經(jīng)常用到,本文將帶你熟悉這個(gè)模塊并掌握它的用法,感興趣的朋友跟小編來(lái)看看吧2021-10-10python linecache讀取行更新的實(shí)現(xiàn)
本文主要介紹了python linecache讀取行更新的實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-03-03Python常見(jiàn)庫(kù)matplotlib學(xué)習(xí)筆記之畫(huà)圖文字的中文顯示
在Python中使用matplotlib或者plotnine模塊繪圖時(shí),常常出現(xiàn)圖表中無(wú)法正常顯示中文的問(wèn)題,下面這篇文章主要給大家介紹了關(guān)于Python常見(jiàn)庫(kù)matplotlib學(xué)習(xí)筆記之畫(huà)圖文字的中文顯示的相關(guān)資料,需要的朋友可以參考下2023-05-05Python使用Pandas生成日?qǐng)?bào)的實(shí)現(xiàn)代碼
Pandas是Python中一個(gè)強(qiáng)大的數(shù)據(jù)處理庫(kù),它提供了許多功能強(qiáng)大的數(shù)據(jù)結(jié)構(gòu)和數(shù)據(jù)分析工具,在本文中,我們將介紹Pandas的基本概念和如何使用它生成一個(gè)包含今天到未來(lái)20個(gè)工作日的日期列表的Excel文件,需要的朋友可以參考下2023-11-11使用 Python ssh 遠(yuǎn)程登陸服務(wù)器的最佳方案
這篇文章主要介紹了使用 Python ssh 遠(yuǎn)程登陸服務(wù)器的最佳方案,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-03-03Python 使用os.remove刪除文件夾時(shí)報(bào)錯(cuò)的解決方法
下面小編就為大家?guī)?lái)一篇Python 使用os.remove刪除文件夾時(shí)報(bào)錯(cuò)的解決方法。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-01-01selenium使用chrome瀏覽器測(cè)試(附chromedriver與chrome的對(duì)應(yīng)關(guān)系表)
這篇文章主要介紹了selenium使用chrome瀏覽器測(cè)試(附chromedriver與chrome的對(duì)應(yīng)關(guān)系表),小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2018-11-11