python建立简单的人事管理系统(六)下

sql->excel:pandas,openpyxl                               excel->sql:xlrd,openpyxl

导入数据库时,每执行完一行excel就执行一次sql语句 [xlrd]

sql2 = "insert rs values('{0}','{1}','{2}','{3}','{4}')".format(gh, xm, xb, cs, zw)

未导入前,数据库中只有0004号员工,excel表中是ayy数据

导入前 :                                                                     导入后:

import pyodbc
import xlrd
path = 'D:\\A\\test-xlwt.xlsx'#【该表是xlwt创建的】
dr=xlrd.open_workbook(path)
sheetName=dr.sheets()[0]#获取指定表名【将此表作为要操作的表】
rows=sheetName.nrows#获取总行数
cols=sheetName.ncols#获取总列数
#连接数据库
co = pyodbc.connect('DRIVER={sql server};SERVER=127.0.0.1;DATABASE=rsgldb')
yb=co.cursor()
for i in range(1,rows):
    values=[]
    for j in range(cols):
        # print(sheetName.cell_value(i,j),end='\t')
        values.append(sheetName.cell_value(i,j))
    # print(values)
    sql= "insert rs values('{}','{}','{}','{}','{}')".format(values[0],values[1], values[2], values[3], values[4])
    # print(sql)
    yb.execute(sql)
    co.commit()#一定要提交,保证数据库数据同步,少了此句,数据库不会加入数据
yb.close()
co.close()
print('excel->sql完成')

从数据库导出数据[pandas]

  • 将获取的数据转为一维列表【数据库按行返回 类型是<class 'pyodbc.Row'>,提取之后是<class 'str'>】
  • 将一维列表组合成二维表
  • 设置clounms【列表签】
  • 设置是否打印序号
import pyodbc
import pandas as pd
path = 'D:\\A\\sqltoexcel.xlsx'
list_info=[]

co = pyodbc.connect('DRIVER={sql server};SERVER=127.0.0.1;DATABASE=rsgldb')
yb=co.cursor()
sql = "select * from rs"
yb.execute(sql)
arr=yb.fetchone()
while arr:
    value = (arr[0], arr[1], arr[2], arr[3], arr[4])
    list_info.append(value)
    arr=yb.fetchone()
yb.close()
co.close()

title=['工号','姓名','性别','出生','部门']
df=pd.DataFrame(list_info,columns=title)
print(df)
df.to_excel(path,index=False)
print('sql->excel完成')

        

添加进系统[openpyxl]

不管那个模块,先想办法转换成list 然后就简单多了,利用前面的导入导出,再加上数据库,导入导出就做成了

from tkinter import filedialog
path=filedialog.askopenfilename(title='请选择一个文件')#生成选择目录,只能选择文件
path2=filedialog.asksaveasfilename(title='输入保存路径')#需要手动输入文件名和后缀,或者在程序中设置要生成的格式

  • 主窗口创建的按钮点击进去出现两个按钮一个是导入系统excel->sql,另一个是到出系统sql->excel,点击按钮执行相对于的操作
from tkinter import *
r6 = Tk()
r6.title('导入导出')
r6.geometry('300x200+100+100')
f6 = Frame(r6, bg='#52d362')  # 建立背景区域设置大小
f6.place(x=0, y=0, width=300, height=200)
b1 = Button(r6, text="导入系统", width=37, height=3)#, command=lambda: In())
b1.place(x=10, y=10)
b2 = Button(r6, text="导出系统", width=37, height=3)#, command=lambda: Out())
b2.place(x=10, y=90)
b3 = Button(r6, text="返回", width=37, height=1, command=r6.destroy)
b3.place(x=10, y=160)
r6.mainloop()
  •  sql->excel【注意openpyxl的excel单元格是从1开始】
import openpyxl
import pyodbc
from tkinter import filedialog
def Out():  # sql->excel
    path = filedialog.asksaveasfilename(title='选择保存位置')
    co = pyodbc.connect('DRIVER={sql server};SERVER=127.0.0.1;DATABASE=rsgldb')  # 连接数据库
    yb = co.cursor()
    sql = "select * from rs"
    yb.execute(sql)
    arr = yb.fetchone()
    wb = openpyxl.Workbook()
    work = wb.active
    work.cell(1, 1).value = '工号'
    work.cell(1, 2).value = '姓名'
    work.cell(1, 3).value = '性别'
    work.cell(1, 4).value = '出生日期'
    work.cell(1, 5).value = '所属部门'
    n = 2  # excel的行
    while arr:
        # print(arr[0], arr[1], arr[2], arr[3], arr[4])
        work.title = "入职人员"
        for i in range(0, 5):  # excel的列
            work.cell(n, i + 1).value = arr[i]
        n += 1
        arr = yb.fetchone()
    wb.save(path + '.xlsx')
    yb.close()
    co.close()

  • 导入到系统

这里用pandas生成了一个xlsx表,也可以自己创建一个有信息的表,这里呢并没有涉及到检测信息这些操作,所以要保证自己的数据是完成符合要求的,且工号不能重复【'0001','1'是两个工号,信息均是字符串】,生成的数据如下

info=[
    ['0102','一号','男','19980712','HQ'],
    ['6016','二号','女','19990417','CW'],
    ['0729','三号','男','18980418','IS']
]
import pandas as pd
df=pd.DataFrame(info,columns=['工号','姓名','性别','出生','职位'])
print(df)
topath = filedialog.asksaveasfilename(title='请选择要保存在位置,A目录下')#需要手写后缀
df.to_excel(topath,index=False)
print('文件生成完成')

 

 打开数据库->新建查询->访问rs表【use rsgldb;go;select * from rs;不同行我用分号隔开】执行

会展示已经有的数据

import openpyxl
import pyodbc
from tkinter import filedialog
def In():  # excel->sql
    path = filedialog.askopenfilename(title='请选择一个文件')#为选中文件的路径包含文件名
    print(path)
    path=path.replace('/','//')#将单斜杠转化为双斜杠
    wb = openpyxl.load_workbook(path)
    ws = wb.worksheets[0]
    rows = ws.max_row
    cols = ws.max_column
    # 连接数据库
    co = pyodbc.connect('DRIVER={sql server};SERVER=127.0.0.1;DATABASE=rsgldb')
    yb = co.cursor()
    for i in range(1, rows):
        values = []
        for j in range(cols):
            values.append(ws.cell(i+1, j+1).value)
        # print(values)
        sql = "insert rs values('{}','{}','{}','{}','{}')".format(values[0],values[1],values[2],values[3],values[4])
        # print(sql)
        yb.execute(sql)
        co.commit()  # 一定要提交,保证数据库数据同步,少了此句,数据库不会加入数据
    yb.close()
    co.close()
    print('excel->sql完成')

In()

如果报OSError: File contains no valid workbook part,【是说你用的是从xls表转化为xlsx表的,另启用一张xlsx表就解决了】【表在打开情况下也能执行】

其他模块的导入导出就不写了,参照前面的步骤,基本就八九不离十了

可以加上检测数据的函数,将检测数据拎出来写一个def,用来返回Ture OR False ,遇到不合规的数据,将数据放进list中并越过该行数据的导入

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值