OracleToExcel大数据批量导出

  • 作者:ykk
  • 分类: python
  • 发表时间:2020-09-29 13:35:24
  • 阅读量:(225)

由于公司业务系统采用PB工具开发,近年来业务量增加明显,CMS自带的导出工具对于各业务部门的数据需求满足不是很到位。因此采用python编写了一个导出工具,对于百万级别业务数据来毫无压力,编写好sql后可以一键导出。对比从业务系统取数,效率大大增加。

一、工具特点。

1.采用视图的方式导出,写好取数sql建立视图。可以直接导出视图里的数据。

2.自定义数据库url。

3.支持多个视图同时导出。

4.支持自定义每个文档内的明细条目数,方便拆分文档进行数据分析。

5.可以自定义文档名称。

6.记录程序导出所用的时间。


#完整代码
import cx_Oracle
import xlsxwriter
import math
import os
import time

#配置数据库环境变量
def setenvpath():
    path = os.getcwd() + r'\instantclient_11_2'
    os.environ['PATH'] = r'%s' % (path)
    os.environ['NLS_LANG'] = 'SIMPLIFIED CHINESE_CHINA.ZHS16GBK'
    os.environ['LANG'] = 'ZH_CN'
    print('临时环境变量为:%s' % (path))

#连接数据库
def conn(url):
    global conn
    conn=cx_Oracle.connect(url)
    global cur
    cur = conn.cursor()
    print("数据库信息:"+str(conn)+'数据库已连接')

#通过SQL获取数据
def getdata(cursor,sql):
    cursor.execute(sql)
    global res
    res = cursor.fetchall()
    print("打印前5条数据")
    print(res[:5])
    print("总共记录条数:" + str(len(res)))


def worksheet_write_title(worksheet):
    # 读取表字段值
    SqlDomain = cur.description
    DomainNum = len(SqlDomain)
    print('此文档表头字段数:%s' %(DomainNum))
    SqlDomainName = [None] * DomainNum
    # 遍历表字段值
    for i in range(DomainNum):
        SqlDomainName[i] = SqlDomain[i][0]
        worksheet.write(0,i,SqlDomainName[i])


def worksheet_write_data(worksheet,pagenum,sheetnum,numbers):

    if sheetnum == 1:
        rowNum = 1
        maxnum = len(res)
        rowcount = len(res)
    else:
        rowNum = (pagenum - 1) * int(numbers) + 1
        maxnum = pagenum * int(numbers)
        rowcount = int(numbers)

    if maxnum > len(res) + 1:
        rowNum = (pagenum - 1) * int(numbers) + 1
        rowcount = len(res) + 1 - rowNum


    row = 1
    # 读取数据到excel
    while row <= rowcount:
        for i in range(len(cur.description)):
            worksheet.write(row, i, res[rowNum - 1][i])
        row += 1
        rowNum += 1





if __name__ == '__main__':
    print("url格式:'username/password@ip:port/service_name'")
    url=input('请输入连接数据库的url:')
    view=input('请输入所要导出数据的视图名称:')
    numbers=input('请输入每个文档内所生成的明细数目(用来计算生成多少个文档):')
    filename = input('请输入生成的文档名称:')
    setenvpath()
    conn(url)
    sql = ''' select * from %s ''' %view
    starttime = time.time()
    print('正在查询:'+sql+'请耐心等待')
    getdata(cur,sql)
    sheetnum = math.ceil(len(res) / int(numbers))
    print("总共会生成"+str(sheetnum)+"个xlsx文档")

    for pagenum in range(1,sheetnum + 1):
        #创建文档
        titlename = '数据'
        wb = xlsxwriter.Workbook(filename +"_" +str(pagenum) + ".xlsx")
        worksheet = wb.add_worksheet(titlename)
        print('==============================================================')
        print("开始创建第" +'(' +str(pagenum)+'/'+ str(sheetnum) +')'+ "个文档:"+filename + "_" + str(pagenum) + ".xlsx")
        #创建sheet并写标题
        print("开始写入文档表头,请耐心等待完成")
        worksheet_write_title(worksheet)
        print("写入文档表头已完成")
        #写入数据
        print('开始写入表单数据,请耐心等待完成')
        worksheet_write_data(worksheet, pagenum,sheetnum,numbers)
        print("对写入表单数据已完成")
        #关闭文档
        wb.close()
        print("关闭文档:"+"'"+filename  +"_" + str(pagenum) +".xlsx" +"'")

    cur.close()
    conn.close()
    print('==============================================================')
    print('导出已完成')
    print("共" + str(sheetnum) + "个xlsx文档")
    endtime = time.time()
    dtime = endtime - starttime
    print("程序运行时间:%.8s s" % dtime)
    a=input()

 

 

 

上一篇: Superset 数据可视化

下一篇: ClickHouse实例

评论 列表: