python 實現excel轉Sqlite數據庫

目錄

一、結果展示

1.excel展示

2.python執行結果展示

2.1 日誌

2.1 數據庫

二、python命令


一、結果展示

1.excel展示

2.python執行結果展示

2.1 日誌

2.1 數據庫

二、python命令

import sqlite3
import xlrd


# @Author  : amarao
# @File    : ExcelToDbUtils.py
# @Date    : 2019-07-16 10:36
# @Desc    : Excel 轉sqlite工具
# 參考鏈接
# [Python初接觸:SQLite和Excel操作](https://blog.csdn.net/chlk118/article/details/52702396)
# [PYTHON 連接和創建SQLite數據庫](https://blog.csdn.net/ANXIN997483092/article/details/79774158)
# [Python的可變長參數](https://www.cnblogs.com/QLeelulu/archive/2009/09/09/1563148.html)
# [python獲取Excel數據](https://www.cnblogs.com/mxhmxh/p/9367680.html)
# [python讀取excel中單元格的內容返回的5種類型](https://www.bbsmax.com/A/Ae5RD8jNzQ/)
# [python中判斷輸入是否爲數字(包括浮點數)](https://www.cnblogs.com/zxmbky/p/9160822.html)

class ExcelToSqlite(object):
    exe = "     執行: "
    output = "     輸出: "
    sheetDataStartIndex = 1  # 數據開始計算的行數,如第0行是表頭,第1行及之後是數據

    def __init__(self, dbName):
        print("初始化數據庫實例")
        super(ExcelToSqlite, self).__init__()
        self.conn = sqlite3.connect(dbName)
        self.cursor = self.conn.cursor()

    def __del__(self):
        print("釋放數據庫實例")
        self.cursor.close()
        self.conn.close()

    def ExcelToDb(self, excelName, sheetIndex, tableName):
        """
        excel轉化爲sqlite數據庫表
        :param excelName:excel名
        :param sheetIndex:excel中sheet位置
        :param tableName:數據庫表名
        """
        print("Excel文件 轉 db")
        self.tableName = tableName
        excel = xlrd.open_workbook(excelName)
        sheet = excel.sheets()[sheetIndex]  # sheets 索引
        self.sheetRows = sheet.nrows  # excel 行數
        self.sheetCols = sheet.ncols  # excle 列數
        fieldNames = sheet.row_values(0)  # 得到表頭字段名
        # 創建表
        fieldTypes = ""
        for index in range(fieldNames.__len__()):
            if (index != fieldNames.__len__() - 1):
                fieldTypes += fieldNames[index] + " text,"
            else:
                fieldTypes += fieldNames[index] + " text"
        self.__CreateTable(tableName, fieldTypes)
        # 插入數據
        for rowId in range(self.sheetDataStartIndex, self.sheetRows):
            fieldValues = sheet.row_values(rowId)
            self.__Insert(fieldNames, fieldValues)

    def __CreateTable(self, tableName, field):
        """
        創建表
        :param tableName: 表名
        :param field: 字段名及類型
        :return:
        """
        print("創建表 " + tableName)
        sql = 'create table if not exists %s(%s)' % (self.tableName, field)  # primary key not null
        print(self.exe + sql)
        self.cursor.execute(sql)
        self.conn.commit()

    def __Insert(self, fieldNames, fieldValues):
        """
        插入數據
        :param fieldNames: 字段list
        :param fieldValues: 值list
        """
        # 通過fieldNames解析出字段名
        names = ""  # 字段名,用於插入數據
        nameTypes = ""  # 字段名及字段類型,用於創建表
        for index in range(fieldNames.__len__()):
            if (index != fieldNames.__len__() - 1):
                names += fieldNames[index] + ","
                nameTypes += fieldNames[index] + " text,"
            else:
                names += fieldNames[index]
                nameTypes += fieldNames[index] + " text"
        # 通過fieldValues解析出字段對應的值
        values = ""
        for index in range(fieldValues.__len__()):
            cell_value = str((fieldValues[index]))
            if (isinstance(fieldValues[index], float)):
                cell_value = str((int)(fieldValues[index]))  # 讀取的excel數據會自動變爲浮點型,這裏轉化爲文本
            if (index != fieldValues.__len__() - 1):
                values += "\'" + cell_value + "\',"
            else:
                values += "\'" + cell_value + "\'"
        # 將fieldValues解析出的值插入數據庫
        sql = 'insert into %s(%s) values(%s)' % (self.tableName, names, values)
        print(self.exe + sql)
        self.cursor.execute(sql)
        self.conn.commit()

    def Query(self, tableName):
        """
        查詢數據庫表中的數據
        :param tableName:表名
        """
        print("查詢表 " + tableName)
        sql = 'select * from %s' % (tableName)
        print(self.exe + sql)
        self.cursor.execute(sql)
        results = self.cursor.fetchall()  # 獲取所有記錄列表
        index = 0
        for row in results:
            print(self.output + "index=" + index.__str__() + " detail=" + str(row))  # 打印結果
            index += 1
        print(self.output + "共計" + results.__len__().__str__() + "條數據")

    def executeSqlCommand(self, sqlCommand):
        """
        執行輸入的sql命令
        :param sqlCommand: sql命令
        """
        print("執行自定義sql " + tableName)
        print(self.exe + sqlCommand)
        self.cursor.execute(sqlCommand)
        results = self.cursor.fetchall()
        print(self.output + str(results))
        for index in range(0, results.__len__()):
            print(self.output + str(results[index]))
        self.conn.commit()


dbName = "/Users/amarao/Public/workspace/db workspace/mydb"  # 數據庫名,數據庫不存在會自動創建,路徑不存在會執行失敗
tableName = "student1"  # 數據庫表名,表存不存在都可以
excelName = "student.xlsx"  # excel名(可加路徑)

es = ExcelToSqlite(dbName)
es.ExcelToDb(excelName, 0, tableName)
es.Query(tableName)
es.executeSqlCommand("select * from " + tableName)

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章