前言

在python中有许多中操作excel的方式,pandas无疑是最好用的,但是在平时写一些小工具时用其他小型包也够了。本篇介绍一下xlutis、xlrd、xlwt的一些基本操作。

正文

xlrd

单元格中的数据类型

empty、string、number、date、boolean、error、blank

常用函数

import xlrd
import datetime

data = xlrd.open_workbook('excel.xlsx')
#读取路径,指向该路径上excel表格

#sheet的操作
table=data.sheets()[0]
#通过索引获取
table=data.sheet_by_index(0)
#通过索引获取
table=data.sheet_by_name('sheet1')
#通过名字获取
#以上三个函数返回一个xlrd.sheet.Sheet()对象

names=data.sheet_names()
#返回book中所有工作表的名字
data.sheet_loaded(name or index)
#检查工作簿是否已经导入,已导入返回true,未导入报错 xlrd.biffh.XLRDError

#对行、列的操作
table.nrows
#返回工作簿的有效行数(有数据的行就会被计入)
table.row(rowx)
#返回由该行中所有的单元格对象组成的列表 列表每个值的内容为: 单元类型:单元数据
table.row_slice(rowx,start_colx,end_colx)
#返回该列中从第[start_colx]到[end_colx]的单元格对象组成的列表
table.row_len(rows)
#返回该行的有效单元格长度(包括empty)
table.row_types(rows,start_colx,end_colx)
#返回该行单元类型组成的列表 0:empty 1:string 2:number 3:data 4:boolean 5:error
table.row_values(rows,start_colx,end_colx)
#返回该行的数据所组成的列表

#对单元格的操作
table.cell(rowx, colx)
#返回 [rowx,colx]的单元对象
table.cell_value(rowx, colx)
#返回 [rowx,colx]的值
table.cell_type(rowx, colx)
#返回[rowx,colx]的类型

#读取单元格内容为日期/时间的方式
date_tuple=xlrd.xldate_as_tuple(cell_value,data.datemode)
#若cell_value为时间,则将其转化为适用于datetime的元组
date_value=datetime.date(*date_tuple[:3])
#转化为2019-02-07
date_value.strftime('%Y%m%d')
#转化为2019/02/07格式

#对合并单元格的操作
table.merged_cells
#列出合并单元格和的信息,返回值为元组(包含坐标信息)的列表,无合并单元格返回空列表
table.cell_value(rowx_start,col_start)
#读取合并单元格的数据

xlutis

xlutis是为了解决xlwt不能向已有数据的excel表格写入数据的局限性。主要使用的是xlutis.copy.copy方法,但是也有弊端,比如表格内的图片等内容不能复制。

file_path = os.path.dirname(os.path.realpath(sys.executable))+'\\'+book
book = xlrd.open_workbook(file_path,formatting_info=True) # 读取Excel
# 复制表
copy_book = xlutils.copy.copy(book) #复制为xlwt可用的表
copy_sheet = copy_book.get_sheet(sheetname)

xlwt

xlwt是一个比较简便的操作Excel表格的工具包,处理一些日常表格需求完全足够了。

创建新表格

import xlwt

workbook=xlwt.Workbook()
sheet = workbook.add_sheet('sheet', cell_overwrite_ok=True)
#cell_overwrite_ok 默认为false,改为true将支持多次重写
sheet.col(0).width = 256 * 15
# 设置第一列的宽度为15,宽度的基本单位为256.所以设置的时候一般用256 × 需要的列宽。

sheet.row(0).height_mismatch = True
sheet.row(0).height = 20 * 40
# 设置行高为可以修改,并修改为 40,行高的基本单位为20,设置同行高。
workbook.save('Excel.xls')

设置字体样式

style=xlwt.XFStyle()
#初始化一个样式对象

font=xlwt.Font()
#创建字体样式
font.name="Simsun"
#使用什么字体
font.height=20*11
#Excel中字体大小对应的是11
font.bold=False
#字体是否加粗
font.underline=True
#是否有下划线
font.italic = True
#是否倾斜字体
font.colour_index = 0x01
#设置字体颜色

style.font=font
#设定为style中的样式

设置单元格样式

  1. 设置对齐方式
    #设置单元格居中
    al1=xlwt.Alignment()
    al1.horz=0x02
    al1.vert=0x01
    style.alignment=al1
    sheet.write(0,0,'al1居中方式',style)

    #也可直接赋值
    style.alignment.vert=0x01
    style.alignment.horz=0x02

    #单元格对齐方式
    VERT_TOP = 0x00 上端对齐
    VERT_CENTER = 0x01 居中对齐(垂直方向上)
    VERT_BOTTOM = 0x02 低端对齐

    HORZ_LEFT = 0x01 左端对齐
    HORZ_CENTER = 0x02 居中对齐(水平方向上)
    HORZ_RIGHT = 0x03 右端对齐

在单元格设置超链接或公式等内容

#在(0,0)中插入谷歌的超链接,并且在单元格内显示“Google”
sheet.write(0, 0, xlwt.Formula('HYPERLINK("http://www.google.com";"Google")'))

#添加其他表格的超链接
sheet.write(0, 0, xlwt.Formula('HYPERLINK("./test.xls";"test")'))

#添加公式
sheet.write(2, 0, xlwt.Formula('SUM(A1,A2)'))

写入日期

#写入日期
style.num_format_str='M/D/YY'
sheet.write(2, 0, datetime.datetime.now(),style)

设置单元格背景颜色

#设置单元格背景颜色
pattern.pattern = xlwt.Pattern()
pattern.pattern=SOLID_PATTERN
pattern.pattern_fore_colour=1
#颜色映射表见上
style.pattern=pattern

设置单元格边框

borders=xlwt.Borders()
borders.left=xlwt.Borders.DASHED
#DASHED虚线
#NO_LINE没有
#THIN实线
#left 左 right 右 top 上 bottom 下

#设置边框颜色
borders.left_colour

合并单元格

#write_merge(row,row+m,col,col+m,'lable',style)

隐藏某列某行

sheet.row(i).hidden
=0 显示
=1 隐藏

设置页面布局

copy_sheet.portrait = False
false 横向
true 纵向

去除页眉页脚

    copy_sheet.show_headers = False
    copy_sheet.header_str = b''
    copy_sheet.footer_str = b''