Python+JavaScript實現(xiàn)瀏覽器讀取本地excel數(shù)據(jù)
一、背景
一般來說,為了網(wǎng)絡訪問安全,瀏覽器是不能直接加載本地文件的,IE內(nèi)核的瀏覽器提供了AX控件實現(xiàn)本地文件的讀取,Chrome 86 版本后也提供了相應的API,但都存在使用限制和兼容性問題。有時開發(fā)者只是想利用瀏覽器編制一些簡單的腳本完成一些任務,不想學習C、C++、Python生成exe這么大動作,例如使用JavaScript腳本讀取本地一個excel文件進行統(tǒng)計分析。但由于瀏覽器無法使用本地文件這個限制,只好放棄。本文討論研究一種非IE內(nèi)核瀏覽器讀取本地excel數(shù)據(jù)的方法,繞開這個限制。
為了實現(xiàn)這個目標這里使用到了Python、JavaScript、json、HTML等知識,同時博主也是通過學習其他文章找了這種解決方案。
二、解決思路

問題的解決思路如下:
- 使用python讀取本地文件并轉(zhuǎn)換為json格式的.js文件;
- 在HTML文件頭使用
<script>標簽引入轉(zhuǎn)換后的.js數(shù)據(jù)文件; - 使用python打開瀏覽器加載對應的HTML文件。
三、具體實現(xiàn)
使用python讀取本地文件并轉(zhuǎn)換為json格式的.js文件
這里參考了網(wǎng)上的python讀取本地文件代碼,已讀取excel為例子,使用了json庫、xlrd2庫編寫了讀取單個excel文件轉(zhuǎn)換為json數(shù)據(jù)格式的.js文件。其中參數(shù)path為待讀取的excel文件路徑,參數(shù)name為轉(zhuǎn)換后保存的.js文件名。主要代碼如下:
import os
import json
import xlrd2
import excel2json
import webbrowser
fileTypeArray = [".xlsx", ".xls"]
def readExecl(path, name):
print(path)
workbook = xlrd2.open_workbook(path)
sheet2_name = workbook.sheet_names()[0]
sheet = workbook.sheet_by_name(sheet2_name)
# sheet索引從0開始
# sheet的名稱,行數(shù),列數(shù)
# print sheet.name,sheet.nrows,sheet.ncols
adict = {}
for i in range(1, sheet.nrows):
data = {}
for j in range(0, sheet.ncols):
value = TransformationType(sheet.cell_value(i, j))
if isinstance(value, str):
if isJsonString(value):
data[TransformationType(sheet.cell_value(0, j))] = eval(value)
else:
data[TransformationType(sheet.cell_value(0, j))] = value
else:
data[TransformationType(sheet.cell_value(0, j))] = value
adict[TransformationType(sheet.cell_value(i, 0))] = data
data = json.dumps(adict, indent=1, ensure_ascii=False)
excel_data = "data = " + data
_json_save_path = os.getcwd() + "/" + name + '.js'
f = open(_json_save_path, 'w', encoding='utf-8')
f.write(excel_data)
f.close()
print("already create json:" + path)
return data, _json_save_path
def isJsonString(str):
try:
eval(str)
except Exception as e:
return False
return True
def TransformationType(var):
if isinstance(var, float): # type(var) == 'float':
str1 = int(var)
elif isinstance(var, str): # type(var) == 'unicode':
str1 = var
else:
raise Exception("type is not deal")
str1 = var
return str1
然后編制run函數(shù)測試上面的代碼,讀取當前目前下的題庫.xls文件,輸出excel_data.js文件,run函數(shù)代碼如下:
def run():
_file_path = os.getcwd() + "/" + "題庫.xls"
_filename = os.path.basename(_file_path)
_json_data = excel2json.readExecl(_file_path, "excel_data")
if __name__ == '__main__':
run()
運行結(jié)果如下,題庫.xls轉(zhuǎn)換成了excel_data.js。

打開題庫.xls和excel_data.js,可以看到excel里面的每一行轉(zhuǎn)換為json的對象數(shù)據(jù)。

在HTML文件頭使用<script>標簽引入轉(zhuǎn)換后的.js數(shù)據(jù)文件
有了.js文件,就可以在HTML文件頭使用<script>標簽引入轉(zhuǎn)換后的.js數(shù)據(jù)文件,這里通過使用src="excel_data.js"實現(xiàn)。具體代碼如下:
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>讀取excel</title>
<script type="text/javascript" src="excel_data.js"></script>
</head>
<body>
<script type="text/javascript">
let data_list = Object.values(data)
data_len = data_list.length
console.log(data_list)
console.log(data_len)
</script>
</body>
</html>
瀏覽器輸出結(jié)果如下,把excel的數(shù)據(jù)都打印到控制臺了,證明讀取本地excel文件成功了,后續(xù)可以根據(jù)需求統(tǒng)計和展示excel的數(shù)據(jù)。

使用python打開瀏覽器加載對應的HTML文件
最后就是剛才兩個步驟的自動化,使用python自動把excel轉(zhuǎn)為.js文件,調(diào)用本地瀏覽器打開對應的HTML,實現(xiàn)整個流程自動化。具體代碼如下:
def run():
_file_path = os.getcwd() + "/" + "題庫.xls"
_filename = os.path.basename(_file_path)
_json_data = excel2json.readExecl(_file_path, "excel_data")
_url = os.getcwd() + "/" + "index.html"
webbrowser.open(_url)
if __name__ == '__main__':
run()
四、小結(jié)
使用瀏覽器讀取本地文件其實有很多實現(xiàn)方式,包括使用Node.js和Electron框架等技術,但這些都使用起來多少有點難度和技術門檻,本文使用簡單的Python+JavaScript+HTML技術實現(xiàn),滿足一些小場景的需求。
到此這篇關于Python+JavaScript實現(xiàn)瀏覽器讀取本地excel數(shù)據(jù)的文章就介紹到這了,更多相關Python瀏覽器讀取本地文件內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!
相關文章
Python中def()函數(shù)的實戰(zhàn)練習題
def是define的縮寫,用來自定義函數(shù),下面這篇文章主要給大家介紹了關于Python中def()函數(shù)的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2022-07-07
如何利用python多線程爬取天氣網(wǎng)站圖片并保存
最近做個天 氣方面的APP需要用到一些天氣數(shù)據(jù),所以下面這篇文章主要給大家介紹了關于如何利用python多線程爬取天氣網(wǎng)站圖片并保存的相關資料,文中通過示例代碼介紹的非常詳細,需要的朋友可以參考下2021-11-11
Python中利用all()來優(yōu)化減少判斷的實例分析
在本篇文章里小編給大家整理的是一篇關于Python中利用all()來優(yōu)化減少判斷的實例分析內(nèi)容,有需要的朋友們可以學習下。2021-06-06
python 將日期戳(五位數(shù)時間)轉(zhuǎn)換為標準時間
這篇文章主要介紹了python 將日期戳(五位數(shù)時間)轉(zhuǎn)換為標準時間的實現(xiàn)方法,本文圖文并茂給大家介紹的非常詳細,具有一定的參考借鑒價值 ,需要的朋友可以參考下2019-07-07

