从pg数据导出到xlsx,从xlsx导入到pg

一、从pg数据导出到xlsx代码实现

python处理表格小试牛刀 附上代码(基于flask_sqlalchemy)

from io import BytesIO
from app import db
from app.models import User
import openpyxl
from app import db
#模型类
class User(db.Model):
    __tablename__ = 'tb_user'
    id = db.Column(db.Integer, autoincrement=True, primary_key=True)
    name = db.Column(db.String(64), unique=True, name='name', doc='名字')
    email = db.Column(db.String(128), name='email', doc='邮箱')
    age = db.Column(db.Integer, name='age', doc='年龄')
    # birth_day = db.Column(db.DateTime,name='birthday',doc = '生日')
    def __repr__(self):
        return '({},{},{},{})'.format(self.id, self.name, self.email, self.age)

if __name__ == '__main__':
    db.create_all()

## 代码实现
def export_data():
	#从数据库中查出数据
    records = db.session.query(User).all()
    print(records)
    title=['序号','姓名','邮箱','年龄']
    sheet_records=[]
    #取出每一行数据
    for record in records:
        sheet_records.append([
            record.id,record.name,record.email,record.age
        ])
    wb=openpyxl.Workbook()
    wb.encoding='gbk'
    sheet = wb.active
    sheet.title = "个人信息"
    #填写表格的字段
    for col in range(len(title)):
        c = col +1
        sheet.cell(row=1,column=c).value=title[col]
      #取出每一条记录 放在列表中
    for row in range(len(sheet_records)):
        sheet.append(sheet_records[row])
   #方式一:保存本地直接输出xlsx
    wb.save("./personal.xlsx")
    wb.save("./data/data.xlsx")
    #方式二:保存成字节流
    sio = BytesIO()
    wb.save(sio)
    print(sio.getvalue())
    sio.close()

if __name__ == '__main__':
    export_data()

执行效果

1.数据库的数据截图

在这里插入图片描述

2.导出后的数据截图

在这里插入图片描述

二、从xlsx导入到pg代码实现

将上一步的数据导出的表格重新导入到pg中,重新建立模型类和数据表

from openpyxl import load_workbook
from app import db
# 模型类
class Message(db.Model):
    __tablename__ = 'tb_messqge'
    id = db.Column(db.Integer, autoincrement=True, primary_key=True)
    order = db.Column(db.Integer, name='order', doc='序号')
    email = db.Column(db.String(128), name='email', doc='邮箱')
    name = db.Column(db.String(128), name='name', doc='年龄')
    age = db.Column(db.Integer, name='age', doc='年龄')

    def __repr__(self):
        return '({},{},{},{})'.format(self.id, self.name, self.email, self.age)


# if __name__ == '__main__':
#     db.create_all()
# 具体代码实现
def xlsx_to_pg(localpath):
    wb = load_workbook(localpath)  # 打开已存在的execl文件,格式xlsx
    ws = wb[wb.sheetnames[0]]  # 选择第一张sheet表
    rows = ws.max_row  # 获取表的最大行数
    columns = ws.max_column  # 获取表的最大列数
    column_heading = [ws.cell(row=1, column=x).value for x in range(1, columns + 1)]  # 读取excel第一行的值,写入list
    column_name = ['序号', '姓名', '邮箱', '年龄']  # 数据库必需字段
    print(column_heading)  # 文件第一行title

    if len([name for name in column_name if name in column_heading]) == len(column_name):  # 对比数据库中column_name 和表格中column_heading 如果长度字段相等 则说明表格中含有数据库的必须字段
        # 取出Excel表格中各字段所在列号当做后面data列表的索引方便取和存
        order = column_heading.index(column_name[0])
        name = column_heading.index(column_name[1])
        email = column_heading.index(column_name[2])
        age = column_heading.index(column_name[3])
        print(order,name,email,age)

        #判断第二行开始是不是空的有效插入行
        if ws.cell(row=2, column=1).value == None:
            table_start_line = 3
        else:
            table_start_line = 2
        data = []
        MessageList = []
        for row in range(table_start_line, rows + 1):
            for column in range(1, columns + 1):  # 因为从第1列开始,所以此处从1开始
                data.append(ws.cell(row=row, column=column).value)  # 保存数据到列表中
            print(data)
            print(data[order], data[name], data[email], data[age])
            MessageList.append(Message(order=data[order], name=data[name], email=data[email], age=data[age]))
            data = []
        try:
            db.session.add_all(MessageList)
            db.session.commit()
            msg = '导入成功'
            return msg
        except Exception as e:
            print('导入出错{}'.format(e))
            msg = '导入失败'
            return msg
    	finally:
        	wb.close()  # 关闭excel
    return "Success"
if __name__ == '__main__':
    xlsx_to_pg("./data.xlsx")

执行效果

1.数据库中的数据截图

在这里插入图片描述

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值