【Python编程】通过xlwings库操作excel实现简单通讯录管理功能

最近帮一个小伙伴写了一个python操作excel的代码,需求是通过python操作excel,用excel作为数据库存储信息,实现增删改查功能,没有用户界面。

一、使用库选择

能够操作excel的库也比较多,最后按下表对比使用了对excel支持比较好的xlwings库,基本支持两种格式和各种操作,速度较快,如下表:
图来源于网络

二、代码

import os
import xlwings as xw

filePath = "Contact.xlsx"  # 文件默认保存名字


def initialization():
    """初始化,检测是否存在excel文件"""
    if os.path.isfile(filePath):
        pass
    else:
        app = xw.App(visible=False, add_book=False)  # 启动应用
        wb = app.books.add()  # 新建excel文件
        wb.save(filePath)  # 以设置的文件名保存
        sht = xw.books[filePath].sheets['sheet1']  # 选定第一个工作表
        sht.range('A1').value = '学号'  # 设置表头
        sht.range('B1').value = '姓名'
        sht.range('C1').value = '性别'
        sht.range('D1').value = '年龄'
        sht.range('E1').value = '电话'
        sht.range('F1').value = '班级'
        sht.range('G1').value = '寝室号'
        wb.save()  # 保存文件
        wb.close()  # 关闭工作簿
        app.quit()  # 退出应用


def print_message():
    """显示命令"""
    print("**************************************")
    print("     **1.添加学生信息")
    print("     **2.删除学生信息")
    print("     **3.修改学生信息")
    print("     **4.查找学生信息")
    print("     **5.查看所有信息")
    print("     **6.查看操作菜单")


def add():
    """添加信息"""
    print("请输入需要添加的学号、姓名、性别、年龄、电话、班级、寝室号,以/隔开,没有的信息为空格:")
    input_info = input().split("/")  # 按/分割为列表
    for i in range(0, len(input_info)):
        if input_info[i].isdigit():
            input_info[i] = '\'' + input_info[i]  # 如果有输入纯数字,在数字前加入单引号,以文本形式存储数字,否则在后续读取时纯数字会被excel加一位小数
    app = xw.App(visible=False, add_book=False)
    wb = app.books.open(filePath)
    sht = xw.books[filePath].sheets['sheet1']
    last_row = sht.used_range.rows.count  # 获取最后一行的行序号
    sht.range('A' + str(last_row + 1)).value = input_info  # 在最后一行输入输入数据
    print("添加成功!")
    wb.save()
    wb.close()
    app.quit()


def delete():
    """删除信息"""
    flag = 0
    print("请输入需要删除的学号:")
    no = input()
    app = xw.App(visible=False, add_book=False)
    wb = app.books.open(filePath)
    sht = xw.books[filePath].sheets['sheet1']
    row = sht.used_range.last_cell.row
    for i in range(row, 1, -1):  # 从后往前遍历每一行学号比较
        if sht.range('A' + str(i) + ':G' + str(i)).value[0] == no:
            flag = 1
            print("成功删除第" + no + "的信息")
            sht.range('A' + str(i)).api.EntireRow.Delete()  # 删除整行数据
            break
    if flag == 0:
        print("未查找到相关信息,删除失败!")
    wb.save()
    wb.close()
    app.quit()


def search():
    """查询信息"""
    flag = 0
    print("请输入需要查询的学号:")
    no = input()
    app = xw.App(visible=False, add_book=False)
    wb = app.books.open(filePath)
    sht = xw.books[filePath].sheets['sheet1']
    row = sht.used_range.last_cell.row  # 获取最后一行行序号
    for i in range(row, 1, -1):
        if str(sht.range('A' + str(i)).value) == no:
            flag = 1
            print(sht.range('A' + str(i) + ':G' + str(i)).value)
            break
    if flag == 0:
        print("未查询到相关信息!")
    wb.save()
    wb.close()
    app.quit()


def change_file():
    """更改文件信息"""
    flag = 0
    print("请输入需要修改的学号:")
    no = input()
    app = xw.App(visible=False, add_book=False)
    wb = app.books.open(filePath)
    sht = xw.books[filePath].sheets['sheet1']
    row = sht.used_range.last_cell.row
    for i in range(row, 1, -1):
        if sht.range('A' + str(i)).value == no:
            flag = 1
            print("请输入需要修改的信息,学号、姓名、性别、年龄、电话、班级、寝室号,以/隔开:")
            input_info = input().split("/")  # 按/分割为列表
            for j in range(0, len(input_info)):
                if input_info[j].isdigit():
                    input_info[j] = '\'' + input_info[j]
            sht.range('A' + str(i)).value = input_info
            print("修改成功")
            wb.save()
            print(sht.range('A' + str(i) + ':G' + str(i)).value)
            break
    if flag == 0:
        print("未查询到相关信息!")
    wb.save()
    wb.close()
    app.quit()


def printf():
    """显示信息"""
    app = xw.App(visible=False, add_book=False)
    wb = app.books.open(filePath)
    sht = xw.books[filePath].sheets['sheet1']
    row = sht.used_range.last_cell.row
    print("共有" + str(row - 1) + "条通讯录信息,如下:")
    for i in range(2, row + 1):
        print(sht.range('A' + str(i) + ':G' + str(i)).value)
    wb.save()
    wb.close()
    app.quit()


initialization()  # 初始化检查
print("**************************************")
print("      欢迎来到通讯录管理系统")
print_message()  # 打印命令指令
print("**************************************")

while True:

    print("请输入需要执行的操作(输入\"q\"退出程序):")
    choice = input()
    if choice == '1':
        add()  # 增
    if choice == '2':
        delete()  # 删
    if choice == '3':
        change_file()  # 改
    if choice == '4':
        search()  # 查
    if choice == '5':
        printf()  # 打印
    if choice == '6':
        print_message()  # 打印命令指令
    if choice == 'q':
        print("退出!")
        break

三、遇到的主要问题

输入纯数字时excel会默认在最后添加一位小数

在通过代码输入纯数字数据时,保存在excel后,再进行读取时,excel会默认在末尾添加一位小数,之后在进行读取和比较操作时,就会导致数据不一致,例如,输入时为123,保存再读取后内容变为123.0,尝试了在代码里设置为文本格式还是不行,也没有找到其他方法,但是发现如果输入时在数字前加一个单引号,保存在excel后就成了以文本方式存储的数字,读取时就正常了,因为这个程序内容中涉及的数字不会有小数,因此在输入功能里添加了输入内容是否为纯数字的判断,如果为纯数字,则在通过文本处理代码在内容前添加了单引号,来保证读取时数据不产生偏差。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

昕zqx

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值