第17天---python办公自动化---读写Excel文件
Posted 巨优秀不优秀
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第17天---python办公自动化---读写Excel文件相关的知识,希望对你有一定的参考价值。
第17天—python办公自动化—读写Excel文件
Python操作Excel
python读写excel的方式有很多,不同的模块在读写的方法上稍有区别:
-
用xlrd和xlwt进行excel读写;
-
用openpyxl进行excel读写;
Python操作Excel需要三方库的支持,如果要兼容Excel 2007以前的版本,也就是xls
格式的Excel文件,可
以使用三方库xlrd
和xlwt
,前者用于读Excel文件,后者用于写Excel文件。如果使用较新版本的Excel,即
操作xlsx
格式的Excel文件,也可以使用openpyxl
库。
进入中断输入下面的命令,安装所需三方库
pip install xlwt xlrd openpyxl
使用xlrd读取Excel文件
import xlrd
# 工作簿 ---> 一个Excel文件 ---> Book
wb = xlrd.open_workbook('resources/阿里巴巴2020年股票数据.xls')
# 获取工作表名字
print(wb.sheet_names())
# 获取指定工作表 ---> Worksheet
# sheet = wb.sheet_by_name('sheet1')
sheet = wb.sheet_by_index(0)
# 获取工作表的行数和列数
print(sheet.nrows, sheet.ncols)
# 获取指定行 ---> Row
print(sheet.row(0))
print(sheet.row_slice(0, start_colx=0, end_colx=3))
# 获取指定列 ---> Column
# print(sheet.row(4))
print(sheet.col_slice(4, start_rowx=1, end_rowx=11))
# 获取单元格的数据
# print(sheet.row(0)[0].value)
print(sheet.cell(2, 2).value)
# 遍历整个表单
print(f'交易日期\\t\\t\\t最高价\\t\\t最低价\\t\\t开盘价\\t\\t收盘价\\t\\t成交量\\t\\t调整收盘价')
for row in range(1, sheet.nrows):
for col in range(sheet.ncols):
value = sheet.cell(row, col).value
if col == 0:
curr_date = xlrd.xldate_as_datetime(value, 0)
print(curr_date.strftime('%Y年%m月%d日'), end='\\t')
elif col == 5:
print(f'{int(value):<10d}', end='\\t')
else:
print(f'{value:.4f}', end='\\t')
print()
想知道更多关于xlrd
模块的知识,可以阅读它的xlrd官方文档。
Python中的时间日期类型
from datetime import datetime
date1 = datetime(1990, 5, 3)
print(date1)
date2 = datetime(1999, 12, 9, 1, 1, 1)
print(date2)
date3 = datetime.now()
print(date3)
delta = date3 - date1
print(delta.days, delta.seconds)
print(date2.strftime('%Y年%m月%d日 %H时%M分%S秒'))
print(date2.strftime('%Y-%m-%d %H:%M:%S:'))
使用openpyxl读取Excel文件
import datetime
import openpyxl
# 加载一个工作簿 ---> Workbook
wb = openpyxl.load_workbook('resources/阿里巴巴2020年股票数据.xlsx')
# 获取工作表名字
print(wb.sheetnames)
# 获取指定工作表
sheet = wb.worksheets[0]
print(type(sheet))
# 获取工作表的行数和列数
print(sheet.dimensions)
print(sheet.max_row, sheet.max_column)
print(sheet.cell(3, 3).value)
print(sheet['C3'].value)
# 循环遍历所有的单元格
for row_ch in range(1, 255):
for col_ch in 'ABCDEFG':
value = sheet[f'{col_ch}{row_ch}'].value
if type(value) == datetime.datetime:
print(value.strftime('%Y年%m月%d日'), end='\\t')
elif type(value) == int:
print(f'{value:<10d}', end='\\t')
elif type(value) == float:
print(f'{value:.4f}', end='\\t')
else:
print(value, end='\\t\\t')
print()
# 循环遍历所有的单元格方法二:
for row in range(2, sheet.max_row + 1):
for col in range(1, sheet.max_column + 1):
# cell方法的行和列索引都是从1开始的,注意! !!
value = sheet.cell(row, col).value
if col == 1:
print(value.strftime('%Y年%m月%d日'), end='\\t')
elif col == 6:
print(f'{value:<10d}', end='\\t')
else:
print(f'{value:.4f}', end='\\t')
print()
# 循环遍历所有的单元格方法三:
for row in sheet.iter_rows(min_row=2):
for cell in row:
value = cell.value
if type(value) == datetime.datetime:
print(value.strftime('%Y年%m月%d日'), end='\\t')
elif type(value) == int:
print(f'{value:<10d}', end='\\t')
else:
print(f'{value:.4f}', end='\\t')
print()
使用xlwt写Excel文件
import random
import xlwt
# 第一步:创建工作簿(Workbook)
wb = xlwt.Workbook()
# 第二步:添加工作表(Worksheet)
sheet = wb.add_sheet('期末成绩') # type: xlwt.Worksheet
# 第三步:向单元格写入数据()
header_style = xlwt.XFStyle()
header_pattern = xlwt.Pattern()
header_pattern.pattern = xlwt.Pattern.SOLID_PATTERN
# 0 - 黑色、1 - 白色、2 - 红色、3 - 绿色、4 - 蓝色、5 - 黄色、6 - 粉色、7 - 青色
# pattern.pattern_fore_colour = 5
header_pattern.pattern_fore_colour = xlwt.Style.colour_map['aqua']
header_style.pattern = header_pattern
header_font = xlwt.Font()
# 设置字体大小(20是基准单位,18表示18px)
header_font.height = 20 * 18
# 是否使用粗体
header_font.bold = True
# 是否使用斜体
# font.italic = False
header_style.font = header_font
header_alignment = xlwt.Alignment()
# 垂直方向的对齐方式
header_alignment.vert = xlwt.Alignment.VERT_CENTER
# 水平方向的对齐方式
header_alignment.horz = xlwt.Alignment.HORZ_CENTER
header_style.alignment = header_alignment
titles = ['姓名', '语文', '数学', '英语']
for col_index, item in enumerate(titles):
# 设置单元格的数据和样式
sheet.write(0, col_index, item, header_style)
# Todo:写入5个学生3门课程的成绩,成绩用40-108的随机数表示
names = ['A', 'B', 'C', 'D', 'E']
for row_index, name in enumerate(names):
sheet.write(row_index + 1, 0, name)
for col in range(1, 4):
sheet.write(row_index + 1, col, random.randrange(50, 101))
# 第四步:保存工作簿
wb.save('resources/成绩表.xls')
给excel表添加其他数据
import xlrd
import xlwt
# 使用三方库xlutils
from xlutils.copy import copy
wb1 = xlrd.open_workbook('resources/成绩表.xls')
wb2 = copy(wb1) # type: xlwt.Workbook
sheet = wb2.get_sheet(0)
sheet.write(0, 4, '平均分')
for row_index in range(1, 6):
sheet.write(row_index, 4, xlwt.Formula(f'average(B{row_index + 1}:D{row_index + 1})'))
wb2.save('resources/成绩表.xls')
想知道更多关于xlwtt
模块的知识,可以阅读它的xlwt官方文档。
使用openpyxl写Excel文件
import random
import openpyxl
# 第一步:创建工作簿(Workbook)
wb = openpyxl.Workbook()
# 第二步:添加工作表(Worksheet)
# sheet = wb.create_sheet('期末成绩')
sheet = wb.active
sheet.title = '期末成绩'
# 第三步:向单元格写入数据
titles = ['姓名', '语文', '数学', '英语']
for col_index, item in enumerate(titles):
sheet.cell(1, col_index + 1, item)
# Todo:写入5个学生3门课程的成绩,成绩用40-108的随机数表示
names = ['A', 'B', 'C', 'D', 'E']
for row_index, name in enumerate(names):
sheet.cell(row_index + 2, 1, name)
for col in range(2, 5):
sheet.cell(row_index + 2, col, random.randrange(50, 101))
# 第四步:保存工作簿
wb.save('resources/成绩表.xlsx')
给excel表添加其他数据
import openpyxl
from openpyxl.styles import Font, Alignment
# 居中
alignment = Alignment(horizontal='center', vertical='center')
wb = openpyxl.load_workbook('resources/成绩表.xlsx')
sheet = wb.worksheets[0]
sheet['E1'] = '平均分'
for i in range(2, 7):
sheet[f'E{i}'] = f'=average(B{i}:D{i})'
sheet.cell(i, 5).font = Font(size=12, bold=True, color='ff1493')
sheet.cell(i, 5).font = alignment
wb.save('resources/成绩表.xlsx')
想了解更多openpyxl
模块的知识,可以阅读它的openpyxl官方文档。
excel文件汇总
将三个表的数据内容合并到一个Excel文件中
其中一个表数据如下:
import openpyxl
summary_wb = openpyxl.Workbook()
summary_sheet = summary_wb.active
summary_sheet.title = '汇总'
summary_sheet.append(('购药时间', '社保卡号', '商品编码', '商品名称', '销售数量', '应收金额', '实收金额'))
names = ('高新', '新津', '犀浦')
for name in names:
workbook = openpyxl.load_workbook(f'resources/小宝剑大药房({name}店)2018年销售数据.xlsx')
sheet = workbook.worksheets[0]
# 通过指定单元格区域获取到对应的行(嵌套元组)
rows = sheet[f'A3:G{sheet.max_row}']
data = [[cell.value for cell in row]
for row in rows if row[0].value]
# 筛选非空格单元格
for row in data:
summary_sheet.append(row)
summary_wb.save('resources/小宝剑大药房2018年销售数据汇总.xlsx')
以上是关于第17天---python办公自动化---读写Excel文件的主要内容,如果未能解决你的问题,请参考以下文章
100天精通Python(数据分析篇)——第57天:Pandas读写Excel(read_excelto_excel)
100天精通Python(数据分析篇)——第56天:Pandas读写txt和csv文件(read_csvto_csv)
100天精通Python(数据分析篇)——第58天:Pandas读写数据库(read_sqlto_sql)