Python 導入 Excel 到數據庫
Python作為簡單易學的腳本語言,在處理系統運維工作時,也有很大幫助。要知道CentOS的包管理工具就是通過Python編寫的。
在實際工作過程中,用戶提供的基礎數據往往是基於Excel整理的,將Excel數據導入數據庫是一個十分常見的需求。本文將介紹如何基於Python3實現讀取Excel數據,並導入到數據庫。
本程序中會應用到兩個包,可以通過pip安裝
pip install openpyxl pyodbc
程序結構如下圖所示

入口模塊通過Run來執行。它依賴SqlHelper以及ExcelHelper。SqlHelper負責數據庫讀取的操作,ExcelHelper負責Excel讀取操作。ExcelHelper通過讀取Excel文件,解析為一個Model類型的數組。SqlHelper通過讀取這個Model數組,來進行數據庫操作。
run.py 入口模塊代碼如下:
#通過from ... import引入其他模塊
from excelHelper import ExcelHelper
from sqlHelper import SqlHelper
def run():
importxls('xls/xxx.xlsx')
def importxls(path):
# 讀取excel文件,獲取model列表
excelHelper = ExcelHelper(path,'Sheet1')
modellist = excelHelper.readExcelForModels()
# 通過sqlHelper傳入讀取到的model列表插入數據庫
sqlHelper = SqlHelper()
sqlHelper.insertModels(modellist)
#執行
run()
model.py Model是我們讀取excel數據后需要得到的數據模型定義。定義自己需要的字段就行:
class Model:
def __init__(self,code,name):
self.code = code
self.name = name
#通過定義str,幫助在調試時,通過print()函數打印數據
def __str__(self):
str = "code:%s name:%s tenantId:%s targetRemark1:%s" % (self.code, self.name)
return str
excelHelper.py 讀取excel幫助類:
#引入openpyxl以讀取excel文件
import openpyxl
#引入模型定義
from model import Model
class ExcelHelper:
def __init__(self, path, sheetname):
#列數定義,Index從1開始計算
self.codeIndex = 2
self.nameIndex = 3
#讀取workbook。data_only=True,以避免Excel公式值讀取的問題
wb = openpyxl.load_workbook(path, data_only=True)
#讀取標簽
self.sheet = wb[sheetname]
#讀取excel中的行數
self.max_row = self.sheet.max_row
def readExcelForModels(self):
list = []
#循環讀取excel,行數從1開始計算
for rowIndex in range(2, self.max_row):
cellCode = self.sheet.cell(row=rowIndex, column=self.codeIndex).value
if(cellCode == None):
continue
#讀取所需數據
code = self.sheet.cell(row=rowIndex, column=self.codeIndex).value
name = self.sheet.cell(row=rowIndex, column=self.nameIndex).value
#設置model
data = Model(code, name)
#插入數組
list.append(data)
return list
appsettings.json 定義數據庫odbc連接串
{
"ConnectionStrings": {
"Default": "DRIVER={SQL SERVER};Server=xx; Database=xx; UID=xx;PWD=xx;"
}
}
configReader.py 讀取數據庫連接串:
import json
def getConnectString(name):
config = open("appsettings.json")
setting = json.load(config)
connectstring = setting['ConnectionStrings'][name]
return connectstring
sqlHelper.py 數據庫操作幫助類:
#sqlHelper.py
#pyodbc通過odbc讀取數據庫
import pyodbc
#configReader來讀取appsettings.json
import configReader
#textwrap用於處理sql字符串
import textwrap
class SqlHelper:
def __init__(self):
#獲取數據庫連接字符串
conn_info = configReader.getConnectString('Default')
#連接數據庫
self.mssql_conn = pyodbc.connect(conn_info)
#獲取游標
self.mssql_cur = self.mssql_conn.cursor()
#校驗字段是否為空
def isEmpty(self, v):
if(v == None or v.isspace()):
return True
else:
return False
#插入數據
def insertModels(self, modelList):
for model in modelList:
if(self.isEmpty(item.code) or self.isEmpty(item.name)):
continue
#通過textwrap構建sql字符串,?代表預留參數位
sql = textwrap.dedent("""
INSERT INTO [dbo].[Model]
([Code]
,[Name]
)
VALUES
(?
,?
)
""")
#循環插入數據
self.mssql_cur.execute(sql, model.code, model.name)
#數據庫事務提交
self.mssql_conn.commit()
#展示如何進行數據庫查詢,假設存在一個可能為null的字段tennantId
def getIdByCode(self, code, tennantId):
#由於tennantId可能為null,因此查詢語句會有is null的差別
if(tennantId == None):
#通過fetchval()來讀取數據
return self.mssql_cur.execute("select Id from Model where TenantId is null and Code = ?", code).fetchval()
else:
return self.mssql_cur.execute("select Id from Model where TenantId = ? and Code = ?", tennantId, code).fetchval()
Python進行excel導入數據庫操作,總體而言還是很簡單的。尤其是pyodbc對於數據庫的操作有了較好的封裝,對於修改操作,默認提供了事務提交。並支持通過參數替換的方式來輸入參數。python不愧是一個易於使用的語言,其他語言做類似的事,編程效率要弱不少。
希望本文對你有幫助。
