您的位置:首页 > 编程语言 > Python开发

python自动化办公之对Excel的操作

2020-07-20 04:16 543 查看

1.1 xlrd的使用

  • book为excel对象
方法 功能
xlrd.open_wordbook(name) 打开excel表格
book.nsheets 获取工作表的个数
book.sheet_names() 获取工作表的名字
book.sheets()[index] 通过索引获取工作表
book.sheet_by_index(index) 通过索引获取工作表
book.sheet_by_name(name) 通过工作表名获取工作表
book.sheet_loaded(name) 判断工作表是否存在
book.sheet_loaded(index) 判断工作表是否存在
book.sheet_loaded(name or index) 判断工作表是否存在

1.2 对行数据的操作

方法 功能
sheet_one.nrows 获取工作表有效总行数
sheet_one.row(index) 获取第几行
sheet_one.row_slice(row,start_colx=0, end_colx=None) 获取第row行到第colx列的内容
sheet_one.row_types(rowx, start_colx=0, end_colx=None) 查看第row行第colx列的数据类型(对照表见下图)
sheet_one.row_values(rowx, start_colx=0, end_colx=None) 查看第row行第colx列的值
sheet_one.row_len(rows) 查看第row行的有效值

1.3 对列数据的操作

方法 功能
sheet_one.ncols 读取工作表的有效列数
sheet_one**.**col(colx, start_rowx=0,end_rowx=None) 获取第colx列第m行到第n行的数据
sheet_one**.**col_slice(colx, start_rowx=0,end_rowx=None) 获取第colx列到第row行的内容
sheet_one.col_types(colx, start_rowx=0,end_rowx=None) 查看第colx列第row行的数据类型(对照表见下图)
sheet_one.col_values(colx, start_rowx=0,end_rowx=None) 查看第colx列第row行的值

1.4 数据类型对照表

ctype
0 empty(空值)
1 string
2 number
3 data(日期)
4 boolean
5 error(错误)

1.5 对单元格数据的操作

方法 功能
sheet_one.cell(row,col) 获取第row行,第col列的内容
sheet_one.cell_value(row,col) 获取第row行,第col列的内容
sheet_one.cell(row,col).value 获取第row行,第col列的内容
sheet_one.cell_type(row,col) 获取第row行,第col列的数据类型
sheet_one.cell(row,col).ctype 获取第row行,第col列的数据类型

1.6 对合并单元格的操作

方法 功能
sheet1.merged_cells 获取合并单元格的索引(开始行,结束行,开始列,结束列)
sheet1.cell_value(row,col) 获取row行,col列的数据
sheet1.cell(row,col).value 获取row行,col列的数据
sheet1.cell(row,col).ctype 获取row行,col列的数据类型

1.6 案例:将表格转化为指定列表格式

  • 知识点 将数据转发为时间格式:
    xlrd.xldate_as_datetime
  • 将数据转发为时间格式:
    date.strftime('%Y-%m-%d %H:%M:%S')
import xlrd
import datetime
book=xlrd.open_workbook('class_info.xls')#打开表格
table=book.sheet_by_index(0)#选择第一个sheet表格
key=table.row_values(0) #保存表头,既第一行的数据
row_num=table.nrows #保存行数
col_num=table.ncols #保存列数
class_info_data=[]
for i in range(1,row_num):
table_data={}
for j in range(1,col_num):
c_value=table.cell(i,j).value #保存每一个单元格的数据
c_type=table.cell_type(i,j) #保存每一个单元格的数据类型
if c_type==2 and c_value%1==0:
c_value=int(c_value)
elif c_type==3:
#             c_value=xlrd.xldate_as_datetime(c_value,0)#将数据转发为时间格式一 0: 1900, 1: 1904
c_value=date.strftime('%Y-%m-%d %H:%M:%S') #将数据转发为时间格式二
table_data[key[j]]=c_value #将数据保存到字典中
#     print(table_data)
class_info_data.append(table_data) #将数据保存入列表
print(class_info_data)
#[{'年龄': 22, '语言': 'Python', '考试时间': '2020-03-18 00:00:00'}, {'年龄': 21, '语言': 'Python', '考试时间': '2020-03-18 00:00:00'}, {'年龄': 20, '语言': 'Python', '考试时间': '2020-03-18 00:00:00'}, {'年龄': 18, '语言': 'Python', '考试时间': '2020-03-18 00:00:00'}]

2.1 xlwt 的使用

  • 导包:

    import xlwt

  • 创建工作簿:

    xlwt.Workbook(encoding='utf-8')

  • 添加sheet文件并指定为可覆盖的:

    workbook.add_sheet('sheet1',cell_overwrite_ok=True)

  • 在指定行列写入数据:

    worksheet.write(row,col,label)

  • 保存工作簿:workbook.save(path)

2.2 excel 表格字体样式的设置

  • xlwt中有XFStyle这个库来对单元格的样式进行规范操作,所以当我们想要设置单元格样式时,通常需要先实例化XFStyle类,以便于调用该类的方法。

    style=xlwt.XFStyle() 创建格式对象
    Formatting.Font() 字体设置
    Formatting.Alignment() 对齐设置
    Formatting.Borders() 边框设置
    Formatting.Pattern() 背景颜色设置
    字体样式设置
    xlwt.Font() 创建字体对象
    xlwt.Font().name=‘name’ 设置字体
    xlwt.Font().bold=True 设置加粗(True是加粗,False是不加粗)
    xlwt.Font().underline=True 设置下划线
    xlwt.Font().italic=True 设置倾斜
    xlwt.Font().color=‘十六进制数’ 设置字体颜色
    xlwt.Font().colour_index=number 根据颜色索引设置颜色
    xlwt.Font().size=number 设置字体大小
    xlwt.Font().height=number 设置行高
    xlwt.Font().struck_out=True 设置删除线
    worksheet.col(index).width=256*m 设置单元格宽度
    import xlrd
    import xlwt
    workbook=xlwt.Workbook(encoding='utf-8')
    worksheet=workbook.add_sheet('sheet1',cell_overwrite_ok=True)
    style=xlwt.XFStyle()
    font=xlwt.Font()
    font.name='Yu Gothic Light'
    font.bold=True
    font.underline=True
    font.italic=True
    font.color='FF000000'
    font.colour_index=0 #0表示黑色
    font.size=10
    font.heigt=300
    font.struck_out=True
    style.font=font #设置单元格样式为我们制定的font样式
    worksheet.write(0,0,'姓名',style)
    worksheet.write(1,0,'小明')
    worksheet.col(0).width=256*20 # 设置列宽,默认单位一个汉字为2个单位
    workbook.save('test1.xls')

2.2 excel 表格边框样式的设置

边框位置
xlwt.Borders() 创建边框对象
xlwt.Borders().top 设置上边框
xlwt.Borders().bottom 设置下边框
xlwt.Borders().left 设置左边框
xlwt.Borders().right 设置右边框
边框格式
NO_LINE=0x00 保持默认
THIN=0x01 实线
DASHED=0x03 虚线
MEDIUM=0x02 中等线
DOTTED=0x04 点状线
THICK=0x05 加粗线
DOUBLE=0x06 双线
HAIR=0x07
import xlwt
style=xlwt.XFStyle()
border=xlwt.Borders()
border.top=xlwt.Borders.THIN
border.bottom=xlwt.Borders.DASHED
border.left=xlwt.Borders.NO_LINE
style.borders=border

2.3 设置excel对齐方式

对齐方式
xlwt.Alignment() 创建对齐对象
xlwt.Alignment().horz 水平对齐
xlwt.Alignment().vert 垂直对齐
水平和垂直的对齐方式
HORZ_GENERAL=0x00
HORZ_LEFT=0x01 左对齐
HORZ_CENTER=0x02 居中对齐
HORZ_RIGHT=0x03 右对齐
HORZ_FILLED=0x04
HORZ_JUSTIFIFD=0x05 两端对齐
HORZ_CENTER_ACROSS_SEL=0x06
HORZ_DISTRIBUTED=0x07 分散对齐
VERT_TOP=0x00 上对齐
VERT_CENTER=0x01 居中对齐
VERT_BOTTOM=0x02 下对齐
VERT_JUSTIFIED=0x03 两端对齐
VERT_DISTRIBUTED=0x04 分散对齐
import xlwt
style=xlwt.XFStyle()
alignment=xlwt.Alignment()
alignment.horz=xlwt.Alignment.HORZ_CENTER
alignment.vert=xlwt.Alignment.VERT_CENTER
alignment.vert=0x02
style.alignment=alignment

2.4 设置excel背景填充色

xlwt.Pattern() 创建背景对象
xlwt.Pattern().pattern 设置背景,比如实心填充xlwt.Pattern().SOLID_PATTERN
xlwt.Pattern().pattern_fore_colour 设置背景颜色(可直接填写颜色索引)
颜色索引
0 black
1 white
2 red
3 green
4 blue
5 yellow
6 magenta
7 cyan
import xlwt
style=xlwt.XFStyle()
pattern=xlwt.Pattern()
pattern.pattern=xlwt.Pattern.SOLID_PATTERN
pattern.pattern_fore_colour=2
style.pattern=pattern

2.5 综合案例

import xlwt
wb=xlwt.Workbook()
ws=wb.add_sheet('sheet1',cell_overwrite_ok=True)
style=xlwt.XFStyle()

font=xlwt.Font()
font.name='微软雅黑'
font.bold=True
style.font=font

border=xlwt.Borders()
border.top=xlwt.Borders.THIN
border.bottom=xlwt.Borders.THIN
border.left=xlwt.Borders.DASHED
border.right=xlwt.Borders.DASHED
style.borders=border

alignment=xlwt.Alignment()
alignment.horz=xlwt.Alignment.HORZ_CENTER
alignment.vert=xlwt.Alignment.VERT_CENTER
style.alignment=alignment

pattern=xlwt.Pattern()
pattern.pattern=xlwt.Pattern.SOLID_PATTERN
pattern.pattern_fore_colour=5
style.pattern=pattern

ws.write(0,0,'name',style)
ws.write(0,1,'age',style)
ws.write(1,0,'小明')
ws.write(1,1,18)
wb.save('test.xlsx')

3.1 openpyxl 的基本使用

wb=Workbook() 创建工作簿对象
wb.active 获取工作表
wb.create_sheet(‘name’,index) 在指定位置插入工作表,默认在最后
ws.title=name 修改工作表名称
ws.sheet_properties.tabColor=‘1072BA’ 设置工作表按键颜色
wb.sheetnames 查看工作簿的所有工作表(list)
wb.copy_worksheet(sheet) 复制sheet工作表(表格中的图片或图片或工作簿在只读或只写模式下是不可复制的)

3.2 访问单元格

ws为工作表,wb为工作簿
ws[‘A1’]=‘str’ 通过单元格位置给单元格赋值,A1表示位置
ws.cell.(row=,column=,value=) 通过函数给单元格赋值
ws[‘A1’:'C2] 访问多个单元格
ws[‘C’] 访问C列
ws[‘C:D’] 获取CD两列
ws[row] 获取row行
ws[m:n] 获取m到n行
ws.iter_rows(min_row=1,max_row=2,max_col=3,values_only=True) 获取第1、2行的前三行,先读行再读列,values_only=True为只获取单元格的值
ws.iter_cols(min_row=1,max_row=2,max_col=3,values_only=True) 获取第1、2行的前三列,先读列再读行,values_only=False为获取单元格对象

3.3 获取单元格的值与赋值

遍历文件所有的行和列 返回生成器
ws.rows tuple(ws.rows) 遍历所有的行
ws.columns 遍历所有的列
ws.values 获取ws对象中的单元格值
ws[‘A1’].value=‘str’ 修改单元格的值

3.4 打开工作表

from openpyxl import load_workbook
wb=load_workbook('weather_expectation.xlsx')

3.5 创建工作表

from openpyxl import Workbook
wb=Workbook()
ws1=wb.active
ws1.title='sheet1'
li_v=[['name','age','gender'],['amy',18,'girl'],['lisa',19,'girl']]
for li in li_v:
ws1.append(li)
wb.save('test2.xlsx')
from openpyxl import Workbook
wb=Workbook()
ws2=wb.create_sheet(title='data')
for row in range(1,10):
for col in range(1,10):
c=ws2.cell(row=row,column=col,value='{}'.format(row*col))
wb.save('test3.xls')

3.6 日期格式及插入公式

  • 时间格式

    import datetime
    from openpyxl import Workbook
    wb=Workbook()
    ws=wb.active
    ws['A1']=datetime.datetime(2020,6,20)
    ws['A1'].number_format='yyyy-mm-dd hh:mm:ss'
    wb.save('date.xlsx')
  • 插入公式

    from openpyxl import Workbook
    wb=Workbook()
    ws=wb.active
    ws['A2']="=SUM(1,1)"
    wb.save('date.xlsx')

3.7 合并与取消合并单元格

from openpyxl import Workbook
wb=Workbook()
ws=wb.active
ws.merge_cells('A1:C1')#合并单元格
ws.merge_cells(start_row=2,end_row=5,start_column=1,end_column=3) #合并单元格
ws.unmerge_cells('A1:C1')#取消合并单元格
wb.save('合并.xlsx')

3.8 插入图片

from openpyxl import Workbook
from openpyxl.drawing.image import Image
wb=Workbook()
ws=wb.active
img=Image('1.png')
ws.add_image(img,'A1')
wb.save('保存图片.xlsx')

3.9折叠

from openpyxl import Workbook
wb=Workbook()
ws=wb.active
ws.column_dimensions.group('A','D',hidden=True)
ws.row_dimensions.group(1,10,hidden=True)
wb.save('折叠.xlsx')

3.10 删除插入移动行与列

  • 插入行和列

    from openpyxl import Workbook
    wb=Workbook()
    ws=wb.active
    li_v=[['name','age','gender'],['amy',18,'girl'],['lisa',19,'girl']]
    for li in li_v:
    ws.append(li)
    ws.insert_rows(1)# 插入行
    ws.insert_cols(1) #插入列
    ws.merge_cells('B1:D1') #合并
    ws['B1']='班级信息'
    ws.move_range('B3:D3',rows=-2,cols=2) #移动B3到D3,rows-2,cols+2
    ws.delete_cols(1) #删除行
    ws.delete_rows(1)# 删除列
    wb.save('插入.xlsx')

3.11 绘制图表

  • 绘制条形图

    from openpyxl import Workbook
    from openpyxl.chart import BarChart,Reference
    import copy
    wb=Workbook()
    ws=wb.active
    rows=[
    ('number','batch','batch2'),
    (2,10,30),
    (3,40,60),
    (4,50,70),
    (5,20,10),
    (6,10,40),
    (7,50,30),
    ]
    for row in rows:
    ws.append(row)
    chart1=BarChart() #创建条形图对象
    chart1.type='col'#设置类型为树状条形图
    chart1.style=14
    chart1.title='Bar Chart' #设置图表名称
    chart1.y_axis.title='Test number'#设置y轴名称
    chart1.x_axis.title='Sample length(mm)'#设置x轴名称
    data=Reference(ws,min_col=2,max_col=3,min_row=1,max_row=7)
    cats=Reference(ws,min_col=1,min_row=2,max_row=7)
    chart1.add_data(data,titles_from_data=True) #将data添加为作图数据
    chart1.set_categories(cats) #将cats作为作图的x轴
    ws.add_chart(chart1,'A10')
    
    chart2=copy.deepcopy(chart1)
    chart2.style=11
    chart2.type='bar'
    chart2.title='HBar chart'
    ws.add_chart(chart2,'G10')
    wb.save('绘制图表.xlsx')
  • 绘制折线图

    from openpyxl import Workbook
    from datetime import date
    from openpyxl.chart import LineChart,Reference
    
    wb = Workbook()
    ws = wb.active
    rows = [
    ['Date', 'Batch 1', 'Batch 2', 'Batch 3'],
    [date(2015,9, 1), 40, 30, 25],
    [date(2015,9, 2), 40, 25, 30],
    [date(2015,9, 3), 50, 30, 45],
    [date(2015,9, 4), 30, 25, 40],
    [date(2015,9, 5), 25, 35, 30],
    [date(2015,9, 6), 20, 40, 35],
    ]
    for row in rows:
    ws.append(row)
    chart1 = LineChart()  # 创建折线图对象
    
    chart1.title = "Line Chart"   # 设置图表标题
    chart1.y_axis.title = "Size"  # 设置y轴标题
    chart1.x_axis.title = "Test Number"  # 设置x轴标题
    chart1.style = 13
    
    data = Reference(ws,min_row=1,max_row=7,min_col=2,max_col=4) # 选择数据区域
    chart1.add_data(data,titles_from_data=True)  # 将数据添加到作图数据中
    
    # 设置线的样式
    # chart1.series
    s1 = chart1.series[0] # 获取第一条线
    s1.marker.symbol = "triangle" # 设置点的形状 (三角形)
    s1.marker.graphicalProperties.solidFill = "FF0000" # 实心填充色(红色)
    s1.marker.graphicalProperties.line.solidFill = "FF0000" # 三角形的边框色
    s1.graphicalProperties.line.noFill = True  # 线不填充
    
    s2 = chart1.series[1] # 获取第二条线
    s2.graphicalProperties.line.solidFill = "00AAAA" # 设置线的填充色(蓝色)
    s2.graphicalProperties.line.dashStyle = "sysDot" # 设置线的样式为虚线 并且为点
    s2.graphicalProperties.line.width = 100050 # 设置宽度(单位为EMUS)
    
    s3 = chart1.series[2]
    s3.smooth = True # 光滑的曲线
    
    ws.add_chart(chart1,"A10")
    
    wb.save("line.xlsx")
  • 绘制扇形图

    from openpyxl import Workbook
    from openpyxl.chart import PieChart,Reference
    from openpyxl.chart.series import DataPoint
    
    wb = Workbook()
    ws = wb.active
    data = [
    ['Pie', 'Sold'],
    ['Apple', 50],
    ['Cherry', 30],
    ['Pumpkin', 10],
    ['Chocolate', 40],
    ]
    
    for row in data:
    ws.append(row)
    
    pie = PieChart() # 创建扇形图对象
    labels = Reference(ws,min_col=1,min_row=2,max_row=5)  # 选择扇形图的标签区域
    data = Reference(ws,min_col=2,min_row=1,max_row=5)  # 选择作图数据
    pie.add_data(data,titles_from_data=True)   # 将data添加到图表数据
    pie.set_categories(labels)  # 将labels设置为图形的分类
    pie.title = "Pies"
    
    # 将最重比突出扇形图
    slice = DataPoint(idx=0,explosion=200)
    pie.series[0].data_point = [slice] # 重点数据(突出数据)为slice
    
    ws.add_chart(pie,"D10")
    
    wb.save("pie.xlsx")
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: