Python 導入 Excel 到數據庫


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不愧是一個易於使用的語言,其他語言做類似的事,編程效率要弱不少。

希望本文對你有幫助。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM