用python读取xlsx文件并生成SQL Server数据表

在学习或是工作时,数据源是xlsx文件,需要将数据导入到数据库中的表里,这是一个繁锁的过程,中途某处错误时,前面所有做的工作都得白费。所以要省事,还得是编写程序来做这个事情。

但我这里并不是在python中直接通过pymssql运行SQL语句来创建,而只是将xlsx中的内容拼接成SQL语句,然后将语句复制到相应的数据库管理软件中去运行,生成以后的SQL语句如下: 

IF OBJECT_ID('快递量区间分布','U') IS NOT NULL DROP TABLE 快递量区间分布;
CREATE TABLE 快递量区间分布(
	ID    INT    NOT NULL    IDENTITY,
	运单号    NVARCHAR(20)    NOT NULL,
	客户id    NVARCHAR(20)    NOT NULL,
	创建日期    DATE    NOT NULL,
PRIMARY KEY(ID)
);
INSERT INTO 快递量区间分布(运单号,客户id,创建日期) VALUES
('PNO0011','CC001','2020-05-01 00:00:00'),
('PNO0012','CC002','2020-05-02 00:00:00'),
...
...
...
('PNO0013','CC003','2020-05-03 00:00:00')

具体代码如下,由于只是拼接工作,所以也就不进行解释了:

# coding = gbk
import openpyxl
import os

class ExtractFromXlsx:
    def __init__(self,params):
        self.fileName = params['fileName']
        self.sheetName = params['sheetName']
        self.type = params['type']
        self.tableName = params['tableName']
        self.typeDic = {
            's':'NVARCHAR(20)',
            'i':'INT',
            'd':'DATE'
        }

    def readToString(self):
        # 从xlsx文件中读取相关工作表并输出SQL语句
        # 检查文件是否存在
        if not os.path.exists(self.fileName):
            print(f"{self.fileName}不存在!")
            return
        # 取得工作簿
        wb = openpyxl.load_workbook(self.fileName)
        # 取得工作表
        sh = wb[self.sheetName]
        # 列数
        cols = sh.max_column
        if cols != len(self.type):
            print("type参数中给定的列类型数据与工作表中的列数不同!")
            return
        # 行数
        rows = sh.max_row
        if rows < 2:
            print("没有数据!")
            return
        # 组织创建表的SQL语句
        SQL = f"IF OBJECT_ID('{self.tableName}','U') IS NOT NULL DROP TABLE {self.tableName};\n"
        SQL = SQL + f"CREATE TABLE {self.tableName}(\n"
        SQL = SQL + f"\tID    INT    NOT NULL    IDENTITY,\n"

        for i in range(len(self.type)):
            SQL = SQL + f"\t{sh.cell(row=1,column=i+1).value}    {self.typeDic[self.type[i]]}    NOT NULL,\n"
        SQL = SQL + f"PRIMARY KEY(ID)\n"
        SQL = SQL + ");\n"

        SQL = SQL + f"INSERT INTO {self.tableName}("
        for i in range(len(self.type)):
            SQL = SQL + f"{sh.cell(row=1,column=i+1).value},"
        SQL = SQL[:-1]
        SQL = SQL + ") VALUES\n"

        # 插入数据
        for j in range(2,rows):
            SQL = SQL + f"("
            for i in range(len(self.type)):
                if self.type[i] == 's' or self.type[i] == 'd':
                    SQL = SQL + f"'{sh.cell(row=j,column=i+1).value}',"
                else:
                    SQL = SQL + f"{sh.cell(row=j, column=i + 1).value},"
            SQL = SQL[0:-1] + "),\n"
        SQL = SQL[0:-2]
        print(SQL)
        wb.close()


if __name__ == '__main__':
    params = {
        'fileName':'./xlsx/第4章/6快递量区间分布.xlsx',
        'sheetName':'快递量区间分布',      # 工作表名称
        'type':'ssd',                   # 工作表中的各类的类型
        'tableName':'快递量区间分布',      # 要创建的数据库中的表名
    }
    obj = ExtractFromXlsx(params)
    obj.readToString()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

伍德春

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值