使用?Python?將?Excel?數(shù)據(jù)批量導(dǎo)入到SQLite數(shù)據(jù)庫中
在日常數(shù)據(jù)處理工作中,將 Excel 文件內(nèi)容導(dǎo)入數(shù)據(jù)庫是一個(gè)常見需求。Python 生態(tài)中雖然有 pandas、openpyxl 等成熟方案,但當(dāng)遇到超大型 Excel 文件或需要精細(xì)控制單元格格式時(shí),借助專用組件往往能提升開發(fā)效率。
本文基于輕量級(jí) Excel 處理庫完成 Excel 文件解析,結(jié)合 Python 內(nèi)置的 SQLite 數(shù)據(jù)庫(無需獨(dú)立部署),實(shí)現(xiàn)多工作表自動(dòng)識(shí)別、動(dòng)態(tài)創(chuàng)建表結(jié)構(gòu)、批量數(shù)據(jù)入庫的完整方案。
一、應(yīng)用場景與方案優(yōu)勢
適用場景
- 企業(yè) Excel 報(bào)表數(shù)據(jù)遷移至數(shù)據(jù)庫持久化存儲(chǔ);
- 自動(dòng)化辦公:定期將 Excel 導(dǎo)出數(shù)據(jù)同步到數(shù)據(jù)庫;
- 輕量級(jí)數(shù)據(jù)中臺(tái):多 Excel 文件整合入庫,方便后續(xù)查詢分析;
4.測試數(shù)據(jù)構(gòu)造:快速將 Excel 測試數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫。
方案核心優(yōu)勢
- 無環(huán)境依賴:無需安裝 Microsoft Office/WPS,純 Python 庫解析 Excel;
- 多工作表適配:自動(dòng)遍歷 Excel 所有 sheet,無需手動(dòng)指定;
- 動(dòng)態(tài)建表:根據(jù) Excel 表頭自動(dòng)生成數(shù)據(jù)庫表結(jié)構(gòu);
- 安全穩(wěn)定:參數(shù)化 SQL 防注入,事務(wù)管理保證數(shù)據(jù)一致性;
- 輕量免費(fèi):適用于中小型 Excel 文件處理,無額外成本。
二、環(huán)境準(zhǔn)備
僅需安裝 Excel 解析庫(Free Spire.XLS for Python),SQLite 為 Python 內(nèi)置庫,無需額外安裝:
pip install FreeSpire.XLS
三、核心執(zhí)行流程
整個(gè)程序分為 5 個(gè)核心步驟,數(shù)據(jù)流轉(zhuǎn)清晰無冗余:
加載Excel文件 → 連接數(shù)據(jù)庫 → 遍歷工作表 → 讀取表頭+動(dòng)態(tài)建表 → 逐行數(shù)據(jù)插入 → 提交事務(wù)+釋放資源
3.1 完整代碼
from spire.xls import Workbook
import sqlite3
def excel_to_sqlite(excel_path, db_path):
# 1. 加載 Excel 文件
workbook = Workbook()
workbook.LoadFromFile(excel_path)
# 2. 連接數(shù)據(jù)庫
conn = sqlite3.connect(db_path)
cursor = conn.cursor()
# 3. 遍歷每個(gè)工作表
for sheet_index in range(workbook.Worksheets.Count):
sheet = workbook.Worksheets.get_Item(sheet_index)
sheet_name = sheet.Name.replace(" ", "") # 表名中去掉空格
# 4. 讀取表頭(第一行)
header = []
for col in range(sheet.AllocatedRange.ColumnCount):
raw_value = sheet.Range[1, col + 1].Value
# 字段名中去掉空格,并避免空字段
field_name = raw_value.replace(" ", "") if raw_value else f"col_{col}"
header.append(field_name)
# 5. 創(chuàng)建數(shù)據(jù)庫表(所有字段暫定為 TEXT 類型)
create_sql = f"""
CREATE TABLE IF NOT EXISTS {sheet_name} (
{', '.join([f'[{h}] TEXT' for h in header])}
)
"""
cursor.execute(create_sql)
# 6. 逐行插入數(shù)據(jù)(跳過表頭行)
for row in range(1, sheet.AllocatedRange.RowCount): # row=1 對(duì)應(yīng) Excel 第二行
row_data = []
for col in range(sheet.AllocatedRange.ColumnCount):
cell_value = sheet.Range[row + 1, col + 1].Value
row_data.append(cell_value)
# 使用參數(shù)化查詢防止 SQL 注入
placeholders = ','.join(['?' for _ in row_data])
insert_sql = f"INSERT INTO {sheet_name} ({','.join(header)}) VALUES ({placeholders})"
cursor.execute(insert_sql, row_data)
# 7. 提交并清理
conn.commit()
conn.close()
workbook.Dispose()
if __name__ == "__main__":
excel_to_sqlite("Sample.xlsx", "output/Report.db")3.2 關(guān)鍵點(diǎn)解析
1. 工作表遍歷與表名清洗workbook.Worksheets.Count 獲取工作表總數(shù),get_Item(s) 按索引獲取。工作表名稱可能包含空格、特殊字符,直接用作 SQLite 表名會(huì)導(dǎo)致語法錯(cuò)誤,因此使用 .replace(" ", "") 去除空格。更嚴(yán)謹(jǐn)?shù)淖龇稍黾诱齽t過濾,只保留字母數(shù)字和下劃線。
2. 動(dòng)態(tài)建表與字段類型
示例將所有字段定義為 TEXT 類型,適配 Excel 中字符串、數(shù)字、日期等通用格式(可根據(jù)業(yè)務(wù)修改數(shù)據(jù)類型)。
3. 數(shù)據(jù)讀取的范圍sheet.AllocatedRange 返回已使用的單元格區(qū)域(包含數(shù)據(jù)的最大矩形),比直接遍歷全部行列更高效。注意 RowCount 和 ColumnCount 是基于 1 的計(jì)數(shù)。
4. 參數(shù)化插入
使用 ? 占位符配合 cursor.execute(insert_sql, row_data) 能自動(dòng)處理字符串轉(zhuǎn)義,避免因 Excel 單元格內(nèi)容包含單引號(hào)導(dǎo)致的 SQL 錯(cuò)誤,同時(shí)防范注入風(fēng)險(xiǎn)。
四、擴(kuò)展:適配其他數(shù)據(jù)庫
只需修改數(shù)據(jù)庫連接部分,即可遷移到 MySQL、PostgreSQL 等。注意不同數(shù)據(jù)庫的標(biāo)識(shí)符引用符不同(MySQL 用反引號(hào) `,PostgreSQL 用雙引號(hào) "),以及字段類型映射的差異。例如連接 MySQL:
import pymysql conn = pymysql.connect(host='localhost', user='root', password='123456', db='test') cursor = conn.cursor() # 建表時(shí)將 [field] 改為 `field`
結(jié)語
本文實(shí)現(xiàn)了一套輕量化、高可用的 Excel 數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫方案,核心優(yōu)勢為多工作表自動(dòng)適配、動(dòng)態(tài)表結(jié)構(gòu)生成、安全的數(shù)據(jù)插入,代碼簡潔且易于二次開發(fā)。方案適用于日常數(shù)據(jù)遷移、報(bào)表導(dǎo)入等輕量級(jí)場景,無需復(fù)雜配置即可快速落地使用。
如何將數(shù)據(jù)導(dǎo)入SQLite數(shù)據(jù)庫
以下內(nèi)容為擴(kuò)展知識(shí),關(guān)于如何將數(shù)據(jù)導(dǎo)入SQLite數(shù)據(jù)庫中。
我注意到您的消息似乎不完整。如何將數(shù)據(jù)導(dǎo)入SQLite數(shù)據(jù)庫?
請(qǐng)?zhí)峁└嘈畔?,例如?/p>
- 您要導(dǎo)入什么格式的數(shù)據(jù)(CSV、JSON、SQL文件等)?
- 您使用的操作系統(tǒng)和編程環(huán)境(Python、命令行等)?
- 具體的導(dǎo)入需求或遇到的問題
同時(shí),我可以先提供幾種常見的導(dǎo)入SQLite數(shù)據(jù)庫的方法:
1. 命令行導(dǎo)入CSV文件
sqlite3 database.db .mode csv .import data.csv table_name
2. 使用Python導(dǎo)入
import sqlite3
import pandas as pd
# 讀取CSV并導(dǎo)入
df = pd.read_csv('data.csv')
conn = sqlite3.connect('database.db')
df.to_sql('table_name', conn, if_exists='replace', index=False)3. 導(dǎo)入SQL文件
sqlite3 database.db < dump.sql
請(qǐng)補(bǔ)充您的具體需求,我會(huì)提供更精確的幫助!
到此這篇關(guān)于使用 Python 將 Excel 數(shù)據(jù)批量導(dǎo)入到SQLite數(shù)據(jù)庫中的文章就介紹到這了,更多相關(guān)Python Excel 數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
pycharm 使用心得(八)如何調(diào)用另一文件中的函數(shù)
事件環(huán)境: pycharm 編寫了函數(shù)do() 保存在make.py 如何在另一個(gè)file里調(diào)用do函數(shù)?2014-06-06
python自動(dòng)發(fā)郵件庫yagmail的示例代碼
本篇文章主要介紹了python自動(dòng)發(fā)郵件庫yagmail的示例代碼,小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過來看看吧2018-02-02
python3中bytes數(shù)據(jù)類型的具體使用
bytes類型是python3引入的,本文就來介紹一下python3中bytes數(shù)據(jù)類型的具體使用,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-12-12
開源軟件包和環(huán)境管理系統(tǒng)Anaconda的安裝使用
Anaconda是一個(gè)用于科學(xué)計(jì)算的Python發(fā)行版,支持 Linux, Mac, Windows系統(tǒng),提供了包管理與環(huán)境管理的功能,可以很方便地解決多版本python并存、切換以及各種第三方包安裝問題。2017-09-09
python自動(dòng)重試第三方包retrying模塊的方法
retrying是一個(gè)python的重試包,可以用來自動(dòng)重試一些可能運(yùn)行失敗的程序段。這篇文章主要介紹了python自動(dòng)重試第三方包retrying的方法,需要的朋友參考下吧2018-04-04
Caffe數(shù)據(jù)可視化環(huán)境python接口配置教程示例
這篇文章主要為大家介紹了Caffe數(shù)據(jù)可視化環(huán)境python接口配置教程示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2022-06-06
Python內(nèi)置函數(shù)property()如何使用
這篇文章主要介紹了Python內(nèi)置函數(shù)property()如何使用,幫助大家更好的理解和學(xué)習(xí)python,感興趣的朋友可以了解下2020-09-09
基于Python+Matplotlib繪制漸變色扇形圖與等高線圖
這篇文章主要為大家介紹了如何利用Python中的Matplotlib繪制漸變色扇形圖與等高線圖,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下方法2022-04-04

