我们需要的数据都在excel中,一般时候通过excel的一些自带函数就能满足我们绝大多数要求.但是很难完成一些复杂的逻辑计算.对于一些定制化的复杂需求,或者是简单的但是需要我们重复手工完成的我们都可以利用用代码操作.
1.xlrd库:从excel中读取数据,支持xls、xlsx
2.xlwt库:对excel进行修改操作,不支持对xlsx格式的修改
3.xlutils库:在xlw和xlrd中,对一个已存在的文件进行修改。
4.openpyxl:主要针对xlsx格式的excel进行读取和编辑。
简单的例如合并多个excel到一起
复杂的逻辑可以根据单元格内容的判断进行精准的逻辑计算等
基本环境:python 3.8
然后安装相应的插件库 ,例如 要用xlrd
pip install xlrd
如果是window系统提示:
'pip' 不是内部或外部命令,也不是可运行的程序
或批处理文件。
请使用如下命令:
D:\python\python38\Scripts\pip3 install xlrd
上面命令结构D:\python\python38 python的安装目录
Scripts python 下的Scripts文件夹
pip3 pip.exe的程序名称
import xlrd
def main():
# 从文件中获取excel对象
# 打开excel
# rd_book = xlrd.open_workbook("D:\\lesson\\python\\操作文件\\工作入职表.xlsx")
rd_book = xlrd.open_workbook(".\\工作入职表.xlsx")
# 从excel中获取所有sheet
# 获取所有sheet的名称
sheet_names = rd_book.sheet_names()
print('sheetNames:', sheet_names)
# 获取所有sheet对象的一个集合
sheets = rd_book.sheets()
print('sheets:', sheets)
# 获取一个单独的sheet ,[0] 代表第一页 以此类推
sheet = rd_book.sheets()[0]
print('sheet', sheet)
# 根据名称获取
print('sheet_by_name:', rd_book.sheet_by_name(sheet_names[0]))
# 根据坐标序号获取
print('sheet_by_index:', rd_book.sheet_by_index(0))
# 从sheet中获取单元格数据
# 先获取sheet
sheet_by_name = rd_book.sheet_by_name(sheet_names[0])
# 从sheet一行数据,或一列数据,参数:行/列 数组中序号
print('一行所有的值的数组:', sheet_by_name.row_values(1))
print('一列所有的值的数组:', sheet_by_name.col_values(2))
# 对一列数据进行求和,array[1:] 返回array中从1-n的数组 (1是数组的下标 从0开始,n是数组的结束下标 =数组的长度-1)
print('列:[1:]', sheet_by_name.col_values(2)[1:])
print('列:', sum(sheet_by_name.col_values(2)[1:]))
# 从sheet中获取指定单元格的数据,参数 1:行号-1 2:列数-1
print('tab01', sheet_by_name.cell_value(0, 1))
print('tab51', sheet_by_name.cell_value(5, 1))
main()
运行结果
sheetNames: ['目录', '高祥', '张三', '李四', '王五', '赵六']
sheets: [, , , , , ]
sheet
sheet_by_name:
sheet_by_index:
一行所有的值的数组: ['高祥', '男', 18.0]
一列所有的值的数组: ['年龄(当前)', 18.0, 11.0, 21.0, 17.0, 30.0]
列:[1:] [18.0, 11.0, 21.0, 17.0, 30.0]
列: 97.0
tab01 性别
tab51 男
import xlwt
import random
def main():
# 写入excel文件
# 内存中新建一个excel
wr_book = xlwt.Workbook()
# 在excel中添加一个sheet param:sheet_name 文件名称
student_names = ["李福俊", "聂保骏", "刘桐", "马明磊", "高傲", "王茗轩", "侯凯峰"]
class_names = ["python", "Java", "c++"]
head = ["姓名", "成绩"]
# 模拟读excel的结果
excl_data = {
}
# 循环课程名称数组
for sheet_name in class_names:
# 将class名称分别写入sheet页的名字中
w_sheet = wr_book.add_sheet(sheet_name)
# 循环表格头,i 为下标
# write( 行号,列号, 值)
for i, val in enumerate(head):
w_sheet.write(0, i, val)
# 循环学生姓名
excl_data[sheet_name] = []
for i, student_name in enumerate(student_names):
# 第一列为表头,从第二列开始,第二列下标为1
i = i + 1
# 第一列写入姓名
w_sheet.write(i, 0, student_name)
# 第二列写成绩
grades = random.randint(90, 100)
w_sheet.write(i, 1, grades)
# 行
excl_data[sheet_name].append([student_name, grades])
# 循环课程名称数组
# 将class名称分别写入sheet页的名字中
w_sheet_all = wr_book.add_sheet("汇总")
# 表头
w_sheet_all.write(0, 0, "姓名")
# 各个课程表头
for cl_i, class_name in enumerate(class_names):
cl_i = cl_i + 1
w_sheet_all.write(0, cl_i, class_name)
for st_i, st_val in enumerate(student_names):
st_i = st_i + 1
# w_sheet_all.write(st_i, cl_i, st_val)
w_sheet_all.write(st_i, cl_i, 1)
# 从book中获取所有sheet_name
print(excl_data)
students = {
}
for class_name, my_sheet in excl_data.items():
# print(class_name, my_sheet)
for i, row_data in enumerate(my_sheet):
# 姓名
st_name = row_data[0]
# 成绩
grades = row_data[1]
# print('课程:', class_name, '姓名:', st_name, '成绩:', grades)
# 先获通过课程姓名,获取学生成绩集合
student_g = students.get(st_name)
# 如果没有就直接放入数组中,并赋值给学生成绩集合
if student_g is None:
students[st_name] = [grades]
elif isinstance(student_g, list):
# 如果有值并且是集合类型就直接追加成绩
student_g.append(grades)
print(st_name, '成绩', students[st_name])
print(class_name)
excel_ = ".\\成绩单wt.xls"
print(excel_)
# 保存excel 到
wr_book.save(excel_)
main()
输出结果
李福俊 成绩 [91]
聂保骏 成绩 [92]
刘桐 成绩 [90]
马明磊 成绩 [90]
高傲 成绩 [92]
王茗轩 成绩 [96]
侯凯峰 成绩 [92]
python
李福俊 成绩 [91, 98]
聂保骏 成绩 [92, 94]
刘桐 成绩 [90, 94]
马明磊 成绩 [90, 92]
高傲 成绩 [92, 95]
王茗轩 成绩 [96, 100]
侯凯峰 成绩 [92, 95]
Java
李福俊 成绩 [91, 98, 96]
聂保骏 成绩 [92, 94, 95]
刘桐 成绩 [90, 94, 91]
马明磊 成绩 [90, 92, 96]
高傲 成绩 [92, 95, 91]
王茗轩 成绩 [96, 100, 97]
侯凯峰 成绩 [92, 95, 100]
c++
.\成绩单wt.xls