1. 应用场景 2. 功能事项 3. 主要实现 概览 主要方法 4. 使用示例 5. 总结

1. 应用场景

最近经常需要手工从后台数据库导出某些数据表到Excel文件,而且源数据表的数据量大小不一,导致在导出到本地文件这个过程中需要根据情况来调整每个批次的写入数据量。为了避免反复的手工操作、高效率到多份离线数据,便做了这个小工具来一键完成任务。

2. 功能事项
  • 支持一次性导出多个数据源表、自动获取各表的字段名。

  • 支持控制批次的写入速率。例如:每5000行一个批次写入到excel。

  • 支持结构相同的表导入到同一个Excel文件。可适用于经过水平切分后的分布式表。

3. 主要实现
A[创建类] -->|方法1| B(创建数据库连接)A[创建类] -->|方法2| C(取查询结果集)A[创建类] -->|方法3| D(利用句柄写入Excel)A[创建类] -->|方法4| E(读取多个源表)B(创建数据库连接) -->U(调用示例)C(取查询结果集) -->U(调用示例)D(利用句柄写入Excel) -->U(调用示例)E(读取多个源表) -->U(调用示例)
  • 首先需要安装第三方库pymssql实现对SQLServer的连接访问,自定义方法__getConn()需要指定如下五个参数: 服务器host、登录用户名user、登录密码pwd、指定的数据库db、字符编码charset。 连接成功后,通过cursor()获取游标对象,它将用来执行数据库脚本,并得到返回结果集和数据总量。

  • 附上创建数据库连接和执行SQL的源码:

    def __init__(self,host,user,pwd,db):        self.host = host        self.user = user        self.pwd = pwd        self.db = db    def __getConn(self):        if not self.db:            raise(NameError,'没有设置数据库信息')        self.conn = pymssql.connect(host=self.host, user=self.user, password=self.pwd, database=self.db, charset='utf8')        cur = self.conn.cursor()        if not cur:            raise(NameError,'连接数据库失败')        else:            return cur
  • 方法3中写入Excel时,注意一定要用到Pandas中的公共句柄ExcelWriter对象writer。当数据被分批多次写入同一个文件时,如果直接使用to_excel()方法,则前面批次的结果集将会被后续结果覆盖。增加了这个公共句柄限制后,后面的写入会累加到前面写入的数据尾部行,而不是全部覆盖。

writer = pd.ExcelWriter(file)df_fetch_data[rs_startrow:i*N].to_excel(writer, header=isHeader, index=False, startrow=startRow)
  • 分批次写入到目标Excel时的另一个要注意的参数是写入行startrow的设置。 每次写入完成后需要重新指下一批次数据的初始位置值。 每个批次的数据会记录各自的所属批次信息。

  • 利用关键字参数 **args 指定多个数据源表和数据库连接。

def exportToExcel(self, **args):    for sourceTB in args['sourceTB']:               arc_dict = dict(            sourceTB = sourceTB,            path=args['path'],            startRow=args['startRow'],            isHeader=args['isHeader'],            batch=args['batch']        )        print('\n当前导出的数据表为:%s' %(sourceTB))        self.writeToExcel(**arc_dict)    return 'success'
4. 使用示例

如下是调用样例。 先用类MSSQL创建对象,再定义关键字参数args,最终调用方法导出到文件即完成数据导出。

import pandas as pdms = MSSQL(host="localhost",user="test",pwd="test",db="db_jun")args = dict(sourceTB = ['tb2', 'tb1'],# 待导出的表path='D:\\myPC\\Python\\',# 导出到指定路径startRow=1,#设定写入文件的首行,第2行为数据首行isHeader=False,# 是否包含源数据的标题batch=5)# 导出到文件ms.exportToExcel(**args)
5. 总结

本篇主要介绍完成多表(相同表结构)导出数据、分批次写入到同一Excel的实现过程,需要注意使用文件公共句柄、写入行初始化、关键字参数配置等。后续也可以继续扩展,将指定数据源表导出到指定目标文件。

长按扫描关注下方公众号后回复“ excel ”,获取本文全部源码

▼ 点击成为 社区注册会员 「在看」 一下,一起PY!

这里写自定义目录标题欢迎使用Markdown编辑器新的改变功能快捷键合理的创建标题,有助于目录的生成如何改变文本的样式插入链接与图片如何插入一段漂亮的代码片生成一个适合你的列表创建一个表格设定内容居 、居左、居右SmartyPants创建一个自定义列表如何创建一个注脚注释也是必不可少的KaTeX数学公式新的甘特图功能,丰富你的文章UML 图表FLowchart流程图 导出 与导入 导出 导入 欢迎使用Markdown编辑器 你好! 这是你第一次使用 Markdown编辑器 所展示的欢迎页。如果你想学习如何使用Mar
在java web系统应用 我们经常会用到大批量数据的 导出 ,动辄就上几十万几百万的数据让我们的程序感觉压力很大,甚至都出现无法 导出 的情况,如内存溢出等。 java 使用poi 导出 Excel 大批量数据到客户端 存在两个 导出 方法:存在一个 批量 导出 ZIP文件,一个 导出 exel文件
FileInputStream inputStream = null; StringBuilder xlsFileContent = new StringBuilder(); try { inputStream = new... * @param $mpid * @throws \think\db\exception\DataNotFoundException * @throws \think\db\exception\ModelNotFoundException * @throws \think\exception\DbException public function ...
如果你的电脑内存较小那么想在本地做一些事情是很有局限性的(哭丧脸),比如想拿一个kaggle上面的竞赛来练练手,你会发现多数训练数据集都是大几G或者几十G的,自己那小破电脑根本跑不起来。行,你有8000w条样本你牛逼,我就取400w条出来跑跑总行了吧(狡滑脸)。 下图是2015年kaggle上一个CTR预估比赛的数据集: 看到train了吧,原始数据集6个G,特征工程后得多大?那我就取40...
可以使用 Python 的pandas库将 数据库 的数据 导出 Excel 文件 。首先需要连接 数据库 并将数据读入到pandas的DataFrame对象 ,然后使用to_ excel ()方法将DataFrame对象 导出 Excel 文件 。以下是一个示例代码: import pandas as pd import pymysql # 连接 数据库 conn = pymysql.connect(host="localhost", user="root", password="password", database="mydb") # 读取数据 到DataFrame对象 df = pd.read_sql("SELECT * FROM mytable", conn) # 导出 Excel 文件 df.to_ excel ("output.xlsx", index=False) 在上面的示例代码 ,需要根据实际情况修改 数据库 连接参数和SQL查询语句。to_ excel ()方法的第一个参数是 导出 的文件名,第二个参数index=False表示不 导出 索引列。