第17天---python办公自动化---读写Excel文件

第17天—python办公自动化—读写Excel文件

Python操作Excel

python读写excel的方式有很多,不同的模块在读写的方法上稍有区别:

  • 用xlrd和xlwt进行excel读写;

  • 用openpyxl进行excel读写;

Python操作Excel需要三方库的支持,如果要兼容Excel 2007以前的版本,也就是xls格式的Excel文件,可

以使用三方库xlrdxlwt,前者用于读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')
  • 7
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值