文章由来:
需求1:
DataWorks版本升级之后,如果不采购独享集成资源组,将无法从odps将数据导入本地自建数据库,所以需要以下载文件的形式[这种方式是解决此问题之一的方法],那么下载后的文件转换为sql语句比较方便
需求2:
实际环境中数据分析需要将其他部门提供的excel,进行插入,更新等操作
代码实现:
import win32ui
import xlrd
import time
now = time.strftime("%Y%m%d", time.localtime(time.time()))
class ExcelToSql():
def __init__(self, file_name, sheet_name, table_name):
self.file_name = file_name
self.sheet_name = sheet_name
self.table_name = table_name
self.excel_title = None
self.excel_data = []
def read_excel(self):
# 打开excel文件
work_book = xlrd.open_workbook(self.file_name)
# 读取sheet文件
content = work_book.sheet_by_name(self.sheet_name)
# 读取第一行数据
self.excel_title = content.row_values(0)
for row in range(content.nrows - 1):
# 从第二行开始读数据
self.excel_data.append(list(str(val) for val in content.row_values(row + 1)))
def to_sql(self):
sql1 = "INSERT INTO %s (%s)" % (self.table_name, ",".join(self.excel_title)) # 可写死
f = open(now + '-' + self.table_name + '.txt', 'a') # 文件名自己调整
for row in self.excel_data:
print(sql1 + " VALUES ('%s');" % ("','".join(row)), file=f)
def read_write(self): # 文件内容末尾添加COMMIT;
with open(now + '-' + self.table_name + '.txt', "a") as x: # 文件名自己调整#
x.write("")
def run(self):
self.read_excel()
self.to_sql()
self.read_write()
dlg = win32ui.CreateFileDialog(1) # 1表示打开文件对话框
dlg.DoModal()
excel_file_name = dlg.GetPathName() # 获取选择的文件名称
print(excel_file_name) # print(2)
excel_sheet_name = "Sheet1" # excel工作薄名,注意大小写,可修改
sql_table_name = input("输入表名: ")
ExcelToSql(excel_file_name, excel_sheet_name, sql_table_name).run()
print("执行成功,请检查")
运行细节:
选择你要操作的excel
这里的表名填写为你要导入数据库中的表名
导入成功,转换成功的sql文件默认存储在这个python项目下,也可以从左侧的地方查看文件的路径
总结:这里转换的还是txt文件,需要改为sql文件看下一章
操作过程中的问题解决:
报以下错误,代表导入的xlrd包版本过高 或者 缺失xlrd-1.2.0包
解决方法:
检查是否存在xlrd-1.2.0包 执行pip list命令
1.1.不存在xlrd包,执行pip install xlrd==1.2.0
此时安装成功,如果执行还是报错,执行步骤2
1.2 存在xlrd包,那就需要执行步骤2
将高版本xlrd包降为1.2.0
我们发现即使安装了1.2.0版本这里还是2.0.1,这就是报错的原因,所以接下来降版本
然后再执行run就不会有问题