一、代码截图:





二、测试截图:

1、测试数据

(1)一个excel表格为一张表。

(2)第一行的元素为列名。

(3)数据中为空的地方会用空字符串补齐。

2、代码运行

(1)运行参数介绍

#数据库用户名
dm_user_name = ‘SYSDBA’

#数据库用户密码
dm_user_password = ‘SYSDBA’

#数据库IP地址
db_ip = ‘localhost’

#数据库端口号
db_port = 5236

#数据入库的表名
db_table_name = “TEST_EXCEL”

#EXCEL文件的路径
para_excel_file_path = r’C:\Users\22631\Desktop’

#EXCEL文件的名字
para_excel_file_name = “test.xlsx”

#dmpython接口批量插入的数据条数
insert_data_num = 10

#表中列的定义长度
type_len = 20

三、方法介绍

1、类DmSqlFunction(object)

对dmpython进行了简单封装。

(1)构造方法

__init__(self,user,password,server,port,autoCommit=True,local_code=dmPython.PG_UTF8)
参数介绍:
User                               #数据库用户名
Password                           #数据库用户密码
Server                             #数据库IP
Port                               #数据库端口号
autoCommit=True                    #是否自动提交,默认提交
local_code=dmPython.PG_UTF8        #字符集编码,默认UTF8

(2)__connect_db

参数介绍:
私有方法,连接数据库。
成功提示:connect database successful
错误提示:返回连接错误提示

(3)execute_sql

参数介绍:
Sql                                 #传入的SQL语句
args=()                             #传入的参数,可以是列表或元组,默认传入空元组
fetch=True                          #是否是查询操作,True是,False否,默认是查询
executemany = False                 #是否批量执行,可以适当提升效率,默认是否

(4)Commit

数据提交。

(5)close_db

关闭游标和数据库连接。

2、函数excel_insert_data_to_db

(1)传入参数介绍

dm_user_name                            #数据库用户名   dm_user_password                        #数据库用户密码dm_ip                                   #数据库IPdm_port                                 #数据库端口号db_table_name                           #数据入库表名 para_excel_file_path                    #EXCEL文件的路径para_excel_file_name                    #EXCEL文件的名字insert_db_data_num                      #dmpython接口批量插入的数据条数type_len                                #表中列的定义长度

(2)实现思路简述

通过xlrd模块的内置方法获取EXCEL中数据的总列数,进行insert语句拼接,再获取EXCEL中数据的总行数,循环获取每一行数据,第一行的数据作为表中的各个列名,拼接出CREATE语句,后续数据为实际入库数据,每一行数数据作为一个LIST加入到一个总的LIST中,形成一个二维数组,进行批量插入,运行中如果数据入库报错,会自动把错误以追加的方式写入到py_error_当前日期.txt文件中。

在这里插入代码片
#encoding:utf-8
import xlrd
import os
import dmPython
import timeclass DmSqlFunction(object):def __init__(self,user,password,server,port,autoCommit=True,local_code=dmPython.PG_UTF8):self.__user = userself.__password = passwordself.__server = serverself.__port = portself.__autoCommit = autoCommitself.__local_code = local_codeself.__conn = Noneself.__cur = Noneself.__connect_db()def __connect_db(self):try:self.__conn = dmPython.connect(user=self.__user,password=self.__password,\server=self.__server,port=self.__port,\autoCommit=self.__autoCommit,local_code=self.__local_code,\connection_timeout=60,login_timeout=60)self.__cur = self.__conn.cursor()print('\nconnect database successful\n')except BaseException as e:print('__connect_db:\n')print(e)def execute_sql(self,sql,args=(),fetch=True,executemany = False):_rt_list = []if self.__cur:if fetch:self.__cur.execute(sql,args)_rt_list = self.__cur.fetchall()else:if executemany:self.__cur.executemany(sql,args)else:self.__cur.execute(sql,args)else:print('重连:%s'%self.__conn)self.__connect_db()if fetch:self.__cur.execute(sql,args)_rt_list = self.__cur.fetchall()else:if executemany:self.__cur.executemany(sql,args)else:self.__cur.execute(sql,args)return _rt_listdef commit(self):if self.__conn:self.__conn.commit()else:print('重连:%s'%self.__conn)self.__connect_db()self.__conn.commit()def close_db(self):self.commit()if self.__cur:self.__cur.close()self.__cur = Noneif self.__conn:self.__conn.close()self.__conn = Nonedef excel_insert_data_to_db(dm_user_name,dm_user_password,dm_ip,dm_port,db_table_name,para_excel_file_path,para_excel_file_name,insert_db_data_num,type_len):table_name = '\"'+ db_table_name +  '\"'insert_data_num = insert_db_data_numinsert_data_num_flag = 0data_list = []sql_drop = 'drop table {table_name}'.format(table_name=table_name)Dm_Conn_y = DmSqlFunction(dm_user_name,dm_user_password,dm_ip,dm_port)try:Dm_Conn_y.execute_sql(sql_drop,fetch=False)except BaseException as e :print("执行sql_drop语句报错无影响:")print("%s\n"%e)excel_file_path = para_excel_file_pathprint("当前目录:%s\n"%os.getcwd())    #获取当前目录os.chdir(excel_file_path)     #更换目录print("更换当前目录:%s\n"%os.getcwd())     #获取当前目录# 操作excelexcel = xlrd.open_workbook(para_excel_file_name)excel.sheet_names() # 获取excel里的工作表sheet名称数组sheet = excel.sheet_by_index(0) #根据下标获取对应的sheet表print("总共的行数:%s\n"%sheet.nrows)print("总共的列数:%s\n"%sheet.ncols)print("一次性插入条数:%s\n"%insert_data_num)table_column_index = 0       #表头索引下标insert_sql = 'insert into {table_name} values('.format(table_name=table_name)for x in range(sheet.ncols):if x == sheet.ncols - 1:insert_sql = insert_sql + '?)'else:insert_sql = insert_sql + '?,'print("insert_sql:%s\n"%insert_sql)for i in range(sheet.nrows):   #sheet.nrow获取总共的行数if i == 0:                 #这一层主要目的是根据excel表头去创建表print("表头:%s\n"%sheet.row_values(i))sql_create = 'create table {table_name} ('.format(table_name=table_name)for j in sheet.row_values(i):table_column_index += 1if j  == sheet.row_values(i)[-1] :   #获取总共的列数sheet.ncolsif len(j) == 0:sql_create = sql_create + '"'+ 'empty_column' +str(table_column_index)+ '"' + r' varchar2(%s) )'%type_lenelse:sql_create = sql_create + '"'+ j + '"'+ r' varchar2(%s) )'%type_lenelse:if len(j) == 0:sql_create = sql_create + '"'+ 'empty_column' + str(table_column_index) + '"'+ r' varchar2(%s),'%type_lenelse:sql_create = sql_create + '"'+ j + '"'+ r' varchar2(%s),'%type_lenprint("sql_create:%s\n"%sql_create)try:Dm_Conn_y.execute_sql(sql_create,fetch=False)print("执行sql_create语句成功\n")print("=============================\n")except BaseException as e :print("执行sql_create语句报错:")print("%s\n"%e)dm = open('py_error_{sysdate}.txt'.format(sysdate=time.strftime("%Y-%m-%d", time.localtime()) ),'a')dm.write("第%s条执行sql_create语句:%s  出现错误\n错误为:%s\n\n"%(i,sql_create,e))dm.close()print("=============================\n")else:                    #这一层主要目的是根据excel表数据进行数据插入try:print("第%s条数据:%s\n"%(i,sheet.row_values(i)))data_list.append(sheet.row_values(i))print("data_list:%s\n"%data_list)insert_data_num_flag += 1print("insert_data_num_flag:%s  insert_data_num:%s\n"%(insert_data_num_flag,insert_data_num))if insert_data_num_flag == insert_data_num or i == sheet.nrows - 1:Dm_Conn_y.execute_sql(insert_sql,data_list,fetch=False,executemany = True)Dm_Conn_y.commit()print("执行insert_sql语句成功\n")print("=============================\n")data_list = []insert_data_num_flag = 0except BaseException as e :print("执行insert_sql语句报错:")print("%s\n"%e)dm = open('py_error_{sysdate}.txt'.format(sysdate=time.strftime("%Y-%m-%d", time.localtime()) ),'a')dm.write("插入行数:%s\n执行到第%s条数据:\n%s\n出现错误\n执行sql为:%s\n错误为:%s\n\n"%(insert_data_num,i,data_list,insert_sql,e))dm.close()print("=============================\n")Dm_Conn_y.commit()Dm_Conn_y.close_db()if __name__=='__main__':dm_user_name = 'SYSDBA'dm_user_password = 'SYSDBA'db_ip = '192.168.1.34'db_port = 5236db_table_name =  "TEST_EXCEL"para_excel_file_path = r'C:\\Users\\22631\\Desktop'para_excel_file_name = "test.xlsx"insert_data_num = 10type_len = 20time1 = time.time()excel_insert_data_to_db(dm_user_name,dm_user_password,db_ip,db_port,db_table_name,para_excel_file_path,para_excel_file_name,insert_data_num,type_len)time2 = time.time()result_value = int(round(time2 * 1000)) - int(round(time1 * 1000))print("耗时为:%s ms"%result_value)

达梦数据库-Dmpython+xlrd实现excel表数据一键入库代码分享相关推荐

  1. 达梦数据库查询模式名,表名,字段名

    达梦数据库查询模式名,表名,字段名 查询所有的模式名 SELECT DISTINCT object_name FROM ALL_OBJECTS WHERE OBJECT_TYPE = 'SCH' 根据 ...

  2. 0基础学挨踢-国产达梦数据库dmPython安装和避坑(Windows/Linux,离线状态)

    题主还在苦逼的实习生涯中,由于是中国电信,所以处于安全和可控性,目前正在逐步转向国产数据库,例如金蝶,武汉达梦,人大金仓等国产数据库,但是国产数据库比较有趣(折磨),比如达梦家的dmPython就给我 ...

  3. 达梦数据库物理备份恢复_表空间级备份还原

    参考文档<DM8备份恢复手册> 1.表空间级备份还原 联机备份,脱机还原 表空间备份还原的先决条件以及限制条件参考<DM8备份恢复手册>. 1.1 备份 BACKUP V1.0 ...

  4. 达梦数据库实验三:DMDBMS表查询操作

    目录标题 实验三 DMDBMS表查询操作 一.实验目的: 二.实验要求: 三.实验重点和难点: 四.实验内容: 五.实验步骤与结果: 1. 表创建 2. 数据填充 3. 数据查询 3.1查出选修了20 ...

  5. 达梦数据库统计模式下所有表记录数

    /* 统计每个表的数据量到表数据记录表 */ --创建一张表记录统计信息 create table test(tab_name varchar(30),row_num int) --统计每个表的数据量 ...

  6. 基于Enterprise Library的Winform开发框架实现支持国产达梦数据库的扩展操作

    由于一个客户朋友的需求,需要我的Winform开发框架支持国产达梦数据库的操作,这个数据库很早就听过,但是真正一般项目用的很少,一般在一些特殊的项目可能需要用到.由于我的Winform开发框架,是基于 ...

  7. 达梦数据库导入oracle数据_达梦数据库和oracle数据的一些区别

    近期我在考达梦的dca发现有一些和oracle不同的地方,由于我是oracleDBA在维护达梦数据库的时候有需要注意的地方,现在分享一下2个数据库的一些区别. 1.登陆的区别 oracle:如果sys ...

  8. 达梦数据库安装学习总结--DCA上篇

    达梦数据库DCA概述 达梦数据库是一款完全自主原创的国产数据库,国产的操作系统及国产的数据库在国内使用不断扩大,升级及发展也日新月异,其中达梦数据库在政府及事业单位就得到广泛应用. DCA课程学习使用 ...

  9. 达梦数据库(达梦8)DCA认证考试

    ##达梦数据库(DM8)DCA认证## DCA考试环境一般都是符合安装的环境,网上要求的检查环境方面的工作可以不用做,珍惜时间,vnc远程登录后先打开桌面上的试卷,按照试卷上的命令在终端上输入,然后就 ...

  10. DM8达梦数据库数据文件整体迁移方式

    目录 一.前要 二.模拟环境准备: 三.名词定义 3.1 表空间和数据文件 3.2 重做日志(redo) 3.3 控制文件(dm.ctl) 3.4 参数文件(dm.ini) 3.5 dminit工具 ...

最新文章

  1. 计算机网络协议分层体系结构
  2. 微信小程序开发之选项卡
  3. 设计模式——开发常用的设计模式梳理
  4. conda切换环境_Python多环境管理,你需要知道的几种方法
  5. 监控摄像头服务器维护要多久,监控摄像机怎么维护和保养?
  6. C语言switch怎么算,超级新手,用switch写了个计算器程序,求指导
  7. sql数据导入错误代码: 0x80004005_PL/SQL 非预定义异常、自定义异常处理、RAISE_APPLICATION_ERROR...
  8. SpringCloud学习笔记024---SpringBoot中使用大部分公用的配置记录
  9. VC字符处理(二)转换(修改)
  10. 【干货】前端开发VUE实例
  11. Flutter 城市/通讯录列表字母索引联动效果实现
  12. 幸运彩票 分数 15作者 陈越单位 浙江大学
  13. FPGA分频电路实现(奇数,偶数,小数半分频,任意分频)
  14. imovie导入媒体没有声音的解决办法
  15. HIT-哈工大数据结构-作业1(C++)
  16. html 取消settimeout,JavaScript中停止执行setInterval和setTimeout事件的方法
  17. ch1_2 二分查找 C++
  18. 齐聚绿城 | 锦江都城酒店聚焦中高端酒店投资新方向
  19. 小程序实战—答题类小程序
  20. 使用git控制word版本

热门文章

  1. 哈夫曼编码的理解(Huffman Coding)
  2. 网络编程(三):网络中的端口号
  3. 为什么不要随便点击下载链接:过时的远程病毒灰鸽子木马示范
  4. python 拼音排序_Python实现针对中文排序的方法
  5. Photoshop CS6详细安装图文教程
  6. 电脑telnet失败的解决方法
  7. 基于Django框架的物联网空气质量监测系统的实现
  8. 关于XML 编辑工具
  9. geektool 天气_如何使用Geektool自定义Mac桌面
  10. Windows创建用户定义的服务(srvany.exe和instsrv.exe )