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