Python必学模块之xlrd、xlwt模块 (Excel文件处理)


一、介绍

python操作excel主要用到xlrd和xlwt两个库,即xlrd是读excel,xlwt是写excel库

xlrd模块:可读取.xls、.xlsx表格

xlwt模块:可写入.xls表格(不可写入.xlsx文件!!!

二、安装方法

xlrd模块和xlwt模块不是内置模块需要手动安装

pip install xlrd
pip install xlwt

三、 excel表格描述

两个模块对excel表格的结构定义都非常直观,和平时使用excel表格的习惯基本一致。

总体分为三个级别:工作簿——工作表——单元格

  • 一个工作簿就是一个以.xls/.xlsx结尾的文件
  • 一个工作簿有多个工作表(sheet),可以通过索引或者名字访问
  • 一个工作表包含多行、多列,行列交叉位置的基本单元就是单元格(cell),内容都写入在单元格中。单元格可通过行、列索引访问。

在python中将 工作簿——工作表——单元格,视为对象

  • WorkBook:工作簿对象
  • Sheet:表单对象
  • Cell:表格对象

在这里插入图片描述

四、xlrd读取excel文件

4.1 获取WorkBook对象

workbook = xlrd.open_workbook(filename=None)

参数:filename为要打开的电子表格文件的路径。

返回值: 是xlrd.book.Book对象

4.1 xlrd操作sheet对象

一个Excel中可能有多个Sheet,那么可以通过以下方法来获取想要的Sheet信息

方法 功能
workbook.sheet_names() 获取所有的sheet的名字,以列表形式存储
workbook.sheet_by_index(1) 根据索引获取sheet对象
workbook.sheets() 获取所有的sheet对象
sheet.nrows 获取指定sheet的所有行数
sheet.ncols 获取指定sheet的所有列数
workbook.sheet_by_name(‘sheet’) 根据sheet名字获取sheet对象

操作文件(成绩表.xlsx):

在这里插入图片描述

代码实例:

import xlrd

workbook = xlrd.open_workbook("成绩表.xlsx")

# ================= sheet相关操作 =================
print(type(workbook))

# 获取所有的sheet的名字
print(workbook.sheet_names())

# 根据索引获取sheet对象
sheet1 = workbook.sheet_by_index(1)
print(type(sheet1))  # <class 'xlrd.sheet.Sheet'>
print(sheet1.name)  # 可以调用sheet对象的name属性得到sheet名称

# 获取所有的sheet对象
sheet2 = workbook.sheets()
print(type(sheet2))  # <class 'list'>
for i in sheet2:
    print(i.name)

# 获取指定sheet的行数和列数
sheet = workbook.sheet_by_index(0)
print({"总行数":sheet.nrows,"总列数":sheet.ncols})

4.2 xlrd操作cell对象

edu.csdn.net获取Cell及其属性:每个Cell代表的是表格中的一格。以下方法可以方便获取想要的cell

方法 功能
sheet.cell(row,col) 获取指定行和列的cell对象
sheet.row_slice(row,start_col,end_col) 获取指定行的某几列的cell对象。
sheet.col_slice(col,start_row,end_row) 获取指定列的某几行的cell对象。
sheet.cell_value(row,col) 获取指定行和列的值。
sheet.row_values(row,start_col,end_col) 获取指定行的某几列的值,是sheet.row_slice的高级用法。
sheet.col_values(col,start_row,end_row) 获取指定列的某几行的值,是sheet.col_slice的高级用法。

代码实例:


# ================= cell相关操作 =================
from xlrd.sheet import Cell

sheet = workbook.sheet_by_index(0)  # 获取sheet

# 获取指定行和列的cell对象
cell = sheet.cell(0,1)
print(type(cell))  # <class 'xlrd.sheet.Cell'>
print(cell)  # text:'语文' 得到的是一个键值对,可以通过value属性获取值


# 获取指定行的某几列的cell对象
cells = sheet.row_slice(1, 1, 4)
for cell in cells:
    print(cell.value)


# 获取指定行的某几列的值
print(sheet.row_values(1, 1, sheet.nrows))


# 获取指定列的某几行cell对象
cells = sheet.col_slice(0, 1, 5)
print(cells)  # [text:'李思聪', text:'李健林', text:'马风', text:'张小某']
print(type(cells))
for cell in cells:
    print(cell.value)

# 获取指定列的某几行的值
cells = sheet.col_values(0, 1, 5)
print(cells)  # ['李思聪', '李健林', '马风', '张小某']

# 获取指定行和列的值。
print(sheet.cell_value(1,2))

Cell的数据类型

方法 描述 返回值
xlrd.XL_CELL_TEXT(Text) 文本类型 1
xlrd.XL_CELL_NUMBER(Number) 数值类型 2
xlrd.XL_CELL_DATE(Date) 日期时间类型 3
xlrd.XL_CELL_BOOLEAN(Bool) 布尔类型 4
xlrd.XL_CELL_EMPTY 空白数据类型 0

代码实例:

# ================= cell数值类型 =================

sheet = workbook.sheet_by_index(0)  # 获取sheet

# 文本类型
cell = sheet.cell(0, 0)  # 对应1A
print(cell.ctype)   # ctype是Python的外部函数库。它提供了C兼容的数据类型
print(xlrd.XL_CELL_TEXT)  # 返回值为 1 


# 数值类型
cell = sheet.cell(1, 2)  # 对应2C
print(cell.ctype)   
print(xlrd.XL_CELL_NUMBER)  # 返回值为2


# 日期时间类型
cell = sheet.cell(9, 1)  # 对应10B
print(cell.ctype)   
print(xlrd.XL_CELL_DATE)  # 3


# 布尔值类型
cell = sheet.cell(8, 1)  # 对应9B
print(cell.ctype)   
print(xlrd.XL_CELL_BOOLEAN)  # 4


# 空白数据类型
cell = sheet.cell(1, 1)  # 对应2B
print(cell.ctype)
print(xlrd.XL_CELL_EMPTY)  #返回值为 0

五、xlwt写入excel文件

5.1 简单操作步骤

  1. 导入xlwt模块。

    import xlwt
    
  2. 创建一个Workbook对象。

    workbook = xlwt.Workbook(encoding='utf-8') #创建workbook 对象
    
  3. 创建一个Sheet对象。

    mySheet = myWorkbook.add_sheet("班级1")
    
  4. 把数据写入到Sheet下指定行和列中。如果想要在原来workbook对象上添加新的cell,那么需 要调用put_cell来添加。

    worksheet.write(0, 0, 'hello') #往表中写内容,第一各参数 行,第二个参数列,第三个参数内容
    
  5. 保存成Excel文件

    myWorkbook.save("成绩表1.xls") # 将其命名并保存到本地
    

5.2 常用API参考

Workbook对象

xlwt.Workbook(encoding=‘ascii’, style_compression=0)

  • encoding:设置字符编码,默认为 ascii,替换成utf-8, excel中输出中文 。
  • style_compression: 表示是否压缩,不常用 。

Workbook对象常用方法

方法 参数 返回值 功能
add_sheet(sheetname,cell_overwrite_ok = False ) sheetname –用于此工作表的名称cell_overwrite_ok 表示是否可以覆盖单元格,默认为False 添加到Worksheet对象中 在工作簿中创建工作表
save(filename_or_stream ) filename_or_stream –是包含文件名的字符串,将使用提供的名称将excel文件保存(写入)到磁盘。 将工作簿保存为本地Excel格式的文件

Workbook属性

属性 功能
Owner 设置文档所有者
country_code 国家码
wnd_protect 窗口保护
backup_on_save 保存时备份
tabs_visible tab是否可见
dates_1904 是否使用1904日期系统
use_cell_values 单元格的值
default_style 默认样式
colour_RGB 颜色
vscroll_visible 纵向滚动条是否可见
hscroll_visible 横向滚动条是否可见
wnd_mini 窗口最小化
wnd_visible 窗口是否可见
tab_width tab宽度
active_sheet 活动sheet
Height 高度
Width 宽度
Hpos 横坐标
Vpos 纵坐标
Protect 保护
obj_protect 对象保护

简单实例:

'''
设置国家码
'''
import xlwt
myWorkbook = xlwt.Workbook(encoding='utf-8')

myWorkbook.country_code = 86
ws = myWorkbook.add_sheet('CN')
myWorkbook.save('country.xls')

关于国家代码查看 :国家代号(CountryCode)

5.3 代码实例

#导入模块
import xlwt

# 创建excel工作薄
myWorkbook = xlwt.Workbook()

# 添加Excel工作表
mySheet = myWorkbook.add_sheet("班级1")

# 写入字段名
headers = ['学生','语文','英语','数学']
student_scores = [
    ('王五',98,78,67),
    ('张三',56,76,32),
    ('李四',78,34,98)
]

# 通过列写入内容
for cols, header in enumerate(headers):
    mySheet.write(0, cols, header)

# 通过行写入内容
for row, scores in enumerate(student_scores):
    for cols, score in enumerate(scores):
        mySheet.write(row+1, cols, score)

myWorkbook.save("成绩表1.xls")

5.4 给excel设置样式

1. 创建一个表,得到一个worksheet对象

import xlwt

myWorkbook = xlwt.Workbook(encoding='utf-8')
myWorksheet = myWorkbook.add_sheet('sheet1')
print(type(myWorksheet))  # <class 'xlwt.Worksheet.Worksheet'>

2. 设置列宽,cols_num是列的数目

# 设置列宽,cols_num是列的数目,可以通过修改10这个值,修改列的宽度
# width = 256 * 10    256为衡量单位,20表示20个字符宽度
cols_num = 10
for c in range(cols_num):  # 10为cols_num长度
    myWorksheet.col(c).width = 256 * 10

3. 设置行高

# 设置行高
myWorksheet.row(0).height_mismatch = True   # 设置为True,修改行高才生效
myWorksheet.row(0).height = 500  # 设置行高

4. 设置excel单元格风格

 # 设置excel单元格风格
def body_style(pattern=None):

    style = xlwt.XFStyle()  # Create Style

    # 设置字体样式
    font = xlwt.Font()  # Create Font
    font.name = "SimSun"  # 宋体
    font.height = 20 * 12  # 字体大小

    # 设置单元格样式
    style.alignment.vert = style.alignment.VERT_BOTTOM  # 垂直居中
    style.alignment.horz = style.alignment.HORZ_CENTER  # 水平居中
    style.alignment.wrap = style.alignment.WRAP_AT_RIGHT  # 自动换行

    # 设置单元格背景
    if pattern:
        pattern = xlwt.Pattern()  # Create Pattern
        pattern.pattern = pattern.SOLID_PATTERN  # 设置背景颜色
        pattern.pattern_fore_colour = 5  # May be: 8 through 63. 0 = Black, 1 = White, 2 = Red, 3 = Green, 4 = Blue, 5 = Yellow, 6 = Magenta, 7 = Cyan, 16 = Maroon, 17 = Dark Green, 18 = Dark Blue, 19 = Dark Yellow , almost brown), 20 = Dark Magenta, 21 = Teal, 22 = Light Gray, 23 = Dark Gray, the list goes on...
        pattern.pattern_back_colour = 4
        style.pattern = pattern

    # 设置边框样式
    borders = xlwt.Borders()  # Pattern Borders

    borders.right = borders.NO_LINE  # 默认没有边框,NO_LINE
    borders.top = borders.THIN   # 薄边框
    borders.bottom = borders.MEDIUM  # 虚线边框
    borders.left = borders.THICK  # 厚边框

    borders.left_colour = 0x90  # 边框上色
    borders.right_colour = 0x90
    borders.top_colour = 0x90
    borders.bottom_colour = 0x90

    style.font = font  # 样式赋值
    style.borders = borders
    return style

cell_styles = body_style()

5. 往单元格内写入数据

headers = ['学生','语文','英语','数学']

for cols, header in enumerate(headers):
    myWorksheet.write(0, cols, header, style=cell_styles)

wwb.save('有样式的excel.xls') # 将wSheet内容保存到本地

在这里插入图片描述

6. 补充

# coding=utf-8
import xlwt

workbook = xlwt.Workbook(encoding='utf-8')
worksheet = workbook.add_sheet('sheet1')

for i in range(0, 128):
        stylei = xlwt.XFStyle()
        patterni = xlwt.Pattern()
        patterni.pattern = 1
        # 设置底纹的图案索引,1为实心,2为50%灰色,对应为excel文件单元格格式中填充中的图案样式
        patterni.pattern_fore_colour = i    # 设置底纹的前景色,对应为excel文件单元格格式中填充中的背景色
        patterni.pattern_back_colour = 35   # 设置底纹的背景色,对应为excel文件单元格格式中填充中的图案颜色
        stylei.pattern = patterni           # 为样式设置图案
        worksheet.write(i, 0, i, stylei)

workbook.save('file.xls')

在设置字体颜色或者单元格背景颜色的时候,可以使用源码中0x0D参数来代表不同的颜色,也可以用0-127来表示不同的颜色。

六、修改excel文件

6.1 简单操作步骤

  1. 读取源excel文件
  2. 在读取的sheet中通过put_cell()进行修改
  3. 重新创建一个excel文件,把读取到的数据写入到新文件中

6.2 代码实例

在这里插入图片描述

''''

目的:
1、获取学生成绩总分
2、获取科目成绩平均分

'''

import xlrd
import xlwt


myWorkbook = xlrd.open_workbook("成绩表.xlsx")
rsheet = myWorkbook.sheet_by_name('1班')

#  获得同学的总分
# 通过put_cell修改单元格,往标题栏增加 总分 字段

r_nrows = rsheet.nrows  # 总行数
r_ncols = rsheet.ncols  # 总列数

rsheet.put_cell(0, r_ncols,xlrd.XL_CELL_TEXT,'总分',None)

for row in range(1, r_nrows):
    grades = rsheet.row_values(row, 1, r_ncols)
    total = sum(grades)  # 得到同学总分
    rsheet.put_cell(row, 4, xlrd.XL_CELL_NUMBER,total,None)  # 写入成绩到内存


# 得到科目平均分
rsheet.put_cell(rsheet.nrows, 0, xlrd.XL_CELL_TEXT,'平均分',None)

for col in range(1, r_ncols+1):
    grades = rsheet.col_values(col, 1, r_nrows)
    avg = sum(grades) / len(grades)  # 得到平均分
    rsheet.put_cell(r_nrows, col, xlrd.XL_CELL_NUMBER, avg, None)  # 写入成绩到内存




# 创建excel工作薄,并将修改内容写入到新文件中
#
wwb = xlwt.Workbook()
wSheet = wwb.add_sheet("班级1",)

w_nrows = rsheet.nrows
w_ncols = rsheet.ncols

for row in range(0,w_nrows):
    for cols in range(0,w_ncols):
        wSheet.write(row, cols, rsheet.cell_value(row,cols))  # 从内存中获取成绩并写入wSheet中

wwb.save('abc.xls') # 将wSheet内容保存到本地

在这里插入图片描述

发布了84 篇原创文章 · 获赞 116 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/weixin_42444693/article/details/105766337