Excel自动化办公

python操作excel主要⽤到xlrd和xlwt这两个库,即xlrd是读 excel,xlwt是写excel的库。

在UI⾃动化或者接⼝⾃动化中数据维护是⼀个核⼼,所以此模块⾮常实⽤。

刚刚装好后会报错【xlrd.biffh.XLRDError: Excel xlsx file; not supported】

默认安装的版本太高,卸载2.0.1并重装1.2.0解决

pip uninstall xlrd;  pip install xlrd==1.2.0

1. 基本操作

data = xlrd.open_workbook(filename) # ⽂件名以 及路径,如果路径或者⽂件名有中⽂给前⾯加⼀个 r

data = xlrd.open_workbook('./data/data.xlsx')
print(data.sheets())
name = data.sheet_names()
print(name)
table1 = data.sheets()[0]            # 通过索引顺序获取
table2 = data.sheet_by_index(0)       # 通过索引顺序获取
table3 = data.sheet_by_name("Sheet1")   # 通过名称获取

2. 行的操作

 nrows = table.nrows #改工作表返回行数

print((table.row(0))) #返第一行数据列表, 元素为类型加值的字典

for i in range(nrows):

        print(table.row(i)) # 返回类型+数据组成的列表

        print(table.row_values(0, start_colx=0, end_colx=None)) # 只返回所有数据组成的列表                   print(table.row_len(i)) #返回第0行数据个数

print(table.row_slice(0)) # 返回由该⾏中所有的单元格对象组成的列表,和nrows相同

原始表格:

3. 列的操作

data = xlrd.open_workbook('./data/data.xlsx')
table = data.sheets()[0]
ncols = table.ncols
print(ncols)
print(table.col(0, start_rowx=0, end_rowx=None))

for i in range(ncols):
    values = table.col_values(i, start_rowx=0,end_rowx=None)
    # print(table.col_slice(i, start_rowx=0, end_rowx=None)) #和table.col相同
    print(values)

4. 单元格操作

rowx, colx = 1,1
# 返回单元格对象
obj = table.cell(rowx, colx)
# 返回对应位置单元格中的数据类型
typ = table.cell_type(rowx, colx)
# 返回对应位置单元格中的数据
values = table.cell_value(rowx, colx)

number:98.0 2 98.0

5. xlwt 写⼊ 操作 Excel(仅限xls格式!)

官方文档:xlwt documentation — xlwt 1.3.0 documentation

装包:pip install xlwt==1.3.0

5.1 一般写入数据

def fun():
    workbook = xlwt.Workbook(encoding='ascii')
    worksheet = workbook.add_sheet("my test sheet")
    worksheet.write(0,0,'rob')
    worksheet.write(2,1,'handsome',style)
    workbook.save("./data/新创建表格1.xls")
fun()

5.2 设置字体格式

font = xlwt.Font()
font.name = 'Times New Roman'
font.bold = True
font.underline = True
font.italic = True
#把字体赋给样式的字体
style.font = font

5.3 设置列宽

xlwt中列宽的值表示⽅法:默认字体0的1/256为衡量单位。 xlwt创建时使⽤的默认宽度为2960,既11个字符0的宽度所以 我们在设置列宽时可以⽤如下⽅法:width = 256 * 20 256为 衡量单位,20表示20个字符宽度

# 设置列宽
worksheet.col(0).width = 256 * 20

5.4 设置行高

⾼⾏⾼是在单 元格的样式中设置的,可以通过⾃动换⾏通过输⼊⽂字的多 少来确定⾏⾼ :

style = xlwt.easyxf('font:height 360;') # 设置⾏⾼

5.5 合并列和行

# 合并 第2⾏到第3⾏ 的 第1列到第4列

worksheet.write_merge(1, 2, 0, 3, '办公⾃ 动化')

5.6添加边框

borders = xlwt.Borders()

borders.left = xlwt.Borders.THIN
 borders.right = xlwt.Borders.THIN
 borders.top = xlwt.Borders.DASHED
 borders.bottom = xlwt.Borders.DASHED
 borders.left_colour = 0x40
 borders.right_colour = 0x40
 borders.top_colour = 0x40
 borders.bottom_colour = 0x40

style2 = xlwt.XFStyle() # Create Style

style2.borders = borders # Add Borders to Style

# 往表格写⼊内容

worksheet.write(1, 1, 'rob is', style2)

worksheet.write(2, 1, "a good man")

整体代码和效果:

import xlwt
def fun():
    workbook = xlwt.Workbook(encoding='ascii')
    worksheet = workbook.add_sheet("my test sheet")
    #设置样式
    style1 = xlwt.XFStyle()
    #为样式设置字体
    font = xlwt.Font()
    font.name = 'Times New Roman'
    font.bold = True
    font.underline = True
    font.italic = True
    #把字体赋给样式的字体
    style1.font = font
    # 设置列宽
    worksheet.col(0).width = 256 * 20
    worksheet.write(0,0,'rob')
    worksheet.write(0,1,'is handsome',style1)

    worksheet.col(0).width = 256 * 20 #列宽
    borders = xlwt.Borders()
    borders.left = xlwt.Borders.THIN
    borders.right = xlwt.Borders.THIN
    borders.top = xlwt.Borders.DASHED
    borders.bottom = xlwt.Borders.DASHED
    borders.left_colour = 0x40
    borders.right_colour = 0x40
    borders.top_colour = 0x40
    borders.bottom_colour = 0x40
    style2 = xlwt.XFStyle()  # Create Style
    style2 = xlwt.easyxf('font:height 360;') # 设置⾏⾼
    style2.borders = borders  # Add Borders to Style
    # 往表格写⼊内容
    worksheet.write(2, 2, 'rob is', style2)
    worksheet.write(2, 3, "a good man")
    workbook.save("./data/新创建表格1.xls")
fun()

6. xlutils修改Excel

6.1 安装xlutils : pip install xlutils

6.2 拷⻉源⽂件(需配合xlrd使⽤)

new_workbook = copy(workbook)  # 将xlrd对象拷⻉转化为xlwt对象
new_workbook.save("./data/新创建表格2.xls")  # 保存⼯作簿

拷贝后的文件样式会消失:

6.3 写入

write_save.write(0, 1, "xlutils写⼊!")  #1⾏2列写⼊

7. openpyxl 读取 写⼊ 修改 操作Excel

在openpyxl中,主要⽤到三个概念:Workbooks,Sheets, Cells。

7.1  Workbook就是⼀个excel⼯作表; Sheet是⼯作表中的⼀张表⻚; Cell就是简单的⼀个格。 openpyxl就是围绕着这三个概念进⾏的,不管读写都是:打开Workbook,定位Sheet,操作Cell。

from openpyxl import Workbook
import datetime
wb = Workbook()
# 抓取活动⼯作表
ws = wb.active
# 数据可以直接分配给单元格
ws['A1'] = 42
# 下⼀⾏⾏每列添加元素
ws.append([1, 2, 3])
# Python类型将⾃动转换
ws['A3'] = datetime.datetime.now()
# Save the file
wb.save("./data/pyxl_sample.xlsx")

7.2 创建和选择表(sheet)

# ⽅式⼀:插⼊到最后(default) ws1 = wb.create_sheet("Mysheet")

# ⽅式⼆:插⼊到最开始的位置 ws2 = wb.create_sheet("Mysheet", 0)

worksheet ws = wb.active # 激活

ws3 = wb["New Title"]  # sheet 名称可以作为 key 进⾏索引

ws4 = wb.get_sheet_by_name("New Title")  #deprecated

7.3 循环获取单元格数据

from openpyxl import load_workbook
# 实例化
wb = load_workbook('./data/pyxl_sample.xlsx')
sheet = wb['Sheet']
# A1, A2, A3这样的顺序
for column in sheet.columns:
    for cell in column:
        print(cell.value)

7.4 打印2D图表

from openpyxl import Workbook
from openpyxl.chart import BarChart, Series,Reference
from copy import deepcopy
wb = Workbook(write_only=True)
ws = wb.create_sheet()
rows = [
 ('Number', 'Batch 1', 'Batch 2'),
 (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"
# 使⽤ 1 到 48 的⼀个数字来设置图表样式。
chart1.style = 48
## 设置标题
chart1.title = "Bar Chart"
chart1.y_axis.title = 'Test number'
## X轴描述
chart1.x_axis.title = 'Sample length (mm)'
## 数据
# 引⽤⼯作表的单元范围,⽤作图表添加数据
data = Reference(ws, min_col=2, min_row=1,max_row=7, max_col=3)
# 引⽤⼯作表的单元范围,⽤作X轴标签使⽤
labels = Reference(ws, min_col=1, min_row=2,max_row=7)
# 添加被引⽤的数据到 BarChart 对象
chart1.add_data(data, titles_from_data=True)
# 设置类别轴的标签(也就是x轴对应标注的值为Number列的数据)
chart1.set_categories(labels)
## 图表开始位置 A10
ws.add_chart(chart1, "A10")
## 复制图表
chart2 = deepcopy(chart1)
# 使⽤ 1 到 48 的⼀个数字来设置图表样式。
chart2.style = 11
# 图表类型 横着
chart2.type = "bar"
# 图表标题
chart2.title = "Horizontal Bar Chart"
## 图表开始位置 G10
ws.add_chart(chart2, "G10")
chart3 = deepcopy(chart1)
# 图表类型
chart3.type = "col"
# 使⽤ 1 到 48 的⼀个数字来设置图表样式。
chart3.style = 12
# 堆积
chart3.grouping = "stacked"
# 指定位于列和栏的⽅式。 可以是介于1-100 和100之间的值。 仅适⽤于2D 横条图和2D 直条图。 可读写的Long。
chart3.overlap = 100
chart3.title = 'Stacked Chart'
## 图表开始位置 A27
ws.add_chart(chart3, "A27")
chart4 = deepcopy(chart1)
# 图表类型
chart4.type = "bar"
# 使⽤ 1 到 48 的⼀个数字来设置图表样式。
chart4.style = 13
# 堆积
chart4.grouping = "percentStacked"
# 会指定位于列和栏的⽅式。 可以是介于-100 和100之间的值。 仅适⽤于2D 横条图和2D 直条图。 可读写的
chart4.overlap = 100
chart4.title = 'Percent Stacked Chart'
ws.add_chart(chart4, "G27")
wb.save("./data/bar.xlsx")

效果图:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值