在学习或是工作时,数据源是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()