openpyxl 和 xlrd&xlwt 都能对excel进行读写,但是它们读写的格式不同,openpyxl 只能读写 xlsx格式的excel,xlrd&xlwt 只能读写 xls格式的excel。

openpyxl

创建excel文件

import openpyxl
# ====== 创建格式为xlsx的excel文件 ======
# 创建一个工作簿,若表格已存在,则覆盖
wb = openpyxl.Workbook() # 创建一个名为test的sheet
wb.create_sheet('test') # 保存文件。注:创建表格会有两个sheet,按顺序名称分别为Sheet和test
wb.save('test.xlsx') # 关闭工作薄
wb.close()

读写已有excel文件

import openpyxl

# ====== 打开已有的excel表格 ======
# 打开一个工作簿
wb = openpyxl.load_workbook('test.xlsx') # 选择一个sheet
# sheet = wb["Sheet1"] # 通过表名选择
sheet = wb.worksheets[0] # 通过索引选择 # 关闭工作薄
wb.close()

对sheet进行读写

# coding:utf-8
import openpyxl # ====== 向sheet写入数据 ======
# 打开一个工作簿
wb = openpyxl.load_workbook('test.xlsx')
# 选择一个sheet
# sheet = wb["Sheet1"] # 通过表名选择
sheet = wb.worksheets[0] # 通过索引选择 # 获取行数
row = sheet.max_row
# 获取列数
column = sheet.max_column
print(row, column) # 写入数据
sheet.append(["aaa", "bbb", "ccc"]) # 在最后一行写入一行数据,列表中每一个数据表示每列写入的数据
sheet.append([1, 2, 3, 4]) # 读取数据
ce = sheet.cell(row=1, column=1) # 读取第1行,第1列的数据
print(ce.value) # 更新数据
ce.value = "ddd" # 更新第1行,第1列的数据为 ddd
sheet.cell(3, 1, '') # 更新第3行第1列的数据为 空串 # 删除数据
# 从第2行开始删除,删除1行
sheet.delete_rows(2, amount=1)
# 删除第3列
sheet.delete_cols(3) # 保存文件
wb.save('test.xlsx')
# 关闭工作薄
wb.close()

简单封装

# coding:utf-8
import openpyxl
import os class Workbook:
workbook = None
filename = None @classmethod
def get_workbook(cls, filename, is_create=False):
""" 获取工作簿,若文件存在则打开,若文件不存在则新建 """
cls.filename = filename
is_file = os.path.exists(filename)
if is_create:
is_file = False
if is_file:
cls.workbook = openpyxl.load_workbook(filename)
else:
cls.workbook = openpyxl.Workbook()
return cls() def sheet_by_name(self, sheet_name):
""" 通过表的名称获取sheet对象 """
ws = WorkSheet(self.workbook)
return ws.sheet_by_name(sheet_name) def sheet_by_index(self, index):
""" 通过表的索引获取sheet对象 """
ws = WorkSheet(self.workbook)
return ws.sheet_by_index(index) def save(self, filename=None):
if filename is None:
filename = self.filename
self.workbook.save(filename) def close(self):
self.workbook.close() class WorkSheet: def __init__(self, workbook):
self.workbook = workbook
self.sheet = None def sheet_by_name(self, name):
""" 通过表的名称获取sheet对象 """
self.sheet = self.workbook[name]
return self def sheet_by_index(self, index):
""" 通过表的索引获取sheet对象 """
self.sheet = self.workbook.worksheets[index]
return self def get_cell_value(self, row, column):
""" 获取单元格的值 """
return self.sheet.cell(row, column).value def get_col_values(self, column):
""" 获取指定列的所有值 """
col_values = []
rows = self.rows
for row in range(rows):
row += 1
v = self.get_cell_value(row, column)
col_values.append(v)
return col_values def get_row_values(self, row):
""" 获取指定行的所有值 """
row_values = []
columns = self.columns
for column in range(columns):
column += 1
v = self.get_cell_value(row, column)
row_values.append(v)
return row_values def write_cell_value(self, row, column, value):
""" 写入或更新单元格的值 """
return self.sheet.cell(row, column, value) def insert_row_values(self, values, row=None):
"""
插入一行数据,默认插入最后一行
:param values: 插入的数据
:type values: list
:param row: 行号
:type row: int
"""
if row is None:
self.sheet.append(values)
else:
self.sheet.insert_rows(row)
col = 1
for v in values:
self.write_cell_value(row, col, v)
col += 1 def insert_column_values(self, values, column=None):
""" 插入一列数据,默认插入最后一列 """
if column is None:
col = self.columns
row = self.rows
v = self.get_cell_value(1, 1)
if col == 1 and row == 1 and v is None:
column = 1
else:
column = self.columns + 1
else:
self.sheet.insert_cols(column)
row = 1
for v in values:
self.write_cell_value(row, column, v)
row += 1 def delete_rows(self, row, amount=1):
""" 删除行数, row表示删除起始行,amount表示删除的行数 """
self.sheet.delete_rows(row, amount) @property
def rows(self):
""" 表格的行数 """
return self.sheet.max_row @property
def columns(self):
""" 表格的列数 """
return self.sheet.max_column def del_wrap(values):
""" 删除换行符 """
if isinstance(values, str):
values = [values]
new_values = []
for value in values:
new_values.append(value.replace("\n", ""))
return new_values if __name__ == '__main__':
# 打开一个工作簿
filename = r'C:\Users\41850\Desktop\test.xlsx'
wb = Workbook.get_workbook(filename) # 选择一个sheet
sheet = wb.sheet_by_index(0) # 通过索引选择 RequireNum = [u"需求编号"]
RequireNum_col_values = None TestModel = [u"测试项"]
TestModel_col_values = None CaseName = [u"用例名称", u"TestSummary"]
CaseName_col_values = None Step = [u"操作步骤", u"Action"]
Step_col_values = None ExpectResult = [u"预期结果", u"Result"]
ExpectResult_col_values = None # 获取各字段的值
fields = sheet.get_row_values(1)
for field in fields:
if field in RequireNum:
RequireNum_col_num = fields.index(field) + 1 # 需求编号列号
RequireNum_col_values = sheet.get_col_values(RequireNum_col_num)[1:]
RequireNum_col_values_new = []
t_value = None
for value in RequireNum_col_values:
if value is not None:
RequireNum_col_values_new.append(value)
t_value = value
else:
RequireNum_col_values_new.append(t_value)
RequireNum_col_values = RequireNum_col_values_new
elif field in TestModel:
TestModel_col_num = fields.index(field) + 1 # 测试项列号
TestModel_col_values = sheet.get_col_values(TestModel_col_num)[1:]
TestModel_col_values_new = []
t_value = None
for value in TestModel_col_values:
if value is not None:
TestModel_col_values_new.append(value)
t_value = value
else:
TestModel_col_values_new.append(t_value)
TestModel_col_values = TestModel_col_values_new
elif field in CaseName:
CaseName_col_num = fields.index(field) + 1 # 用例名称列号
CaseName_col_values = sheet.get_col_values(CaseName_col_num)[1:]
CaseName_col_values = del_wrap(CaseName_col_values)
elif field in Step:
Step_col_num = fields.index(field) + 1 # 操作步骤列号
Step_col_values = sheet.get_col_values(Step_col_num)[1:]
Step_col_values = del_wrap(Step_col_values)
elif field in ExpectResult:
ExpectResult_col_num = fields.index(field) + 1 # 操作步骤列号
ExpectResult_col_values = sheet.get_col_values(ExpectResult_col_num)[1:]
ExpectResult_col_values = del_wrap(ExpectResult_col_values) # 检查必要字段
if not all([CaseName_col_values, Step_col_values, ExpectResult_col_values]):
raise ValueError("缺少必要字段名称,必要字段名称为:用例名称、操作步骤、预期结果") # 拼接用例编号和测试项
if RequireNum_col_values:
TestModel_col_values_new = []
for RequireNum_col_value, TestModel_col_value in zip(RequireNum_col_values, TestModel_col_values):
TestModel_col_values_new.append(u"【%s-%s】" % (RequireNum_col_value, TestModel_col_value))
TestModel_col_values = TestModel_col_values_new
CaseName_col_values_new = [] # 拼接测试项和用例名称
for TestModel_col_value, CaseName_col_value in zip(TestModel_col_values, CaseName_col_values):
CaseName_col_values_new.append(TestModel_col_value + CaseName_col_value)
CaseName_col_values = CaseName_col_values_new # 拼接用例名称、操作步骤、预期结果
insert_values = []
insert_values.append("TCID;TestSummary;Action;Result") tcid = 1
for case_name, step, expect_result in zip(CaseName_col_values, Step_col_values, ExpectResult_col_values):
v = "%s;%s;%s;%s" % (tcid, case_name, step, expect_result)
insert_values.append(v)
tcid += 1 # 将数据另存到新的文件
filename_path = filename.split('\\')
new_filename = "new_" + filename_path[-1]
filename_path.pop()
filename_path.append(new_filename)
new_filename_path = "\\".join(filename_path)
new_wb = Workbook.get_workbook(new_filename_path, is_create=True) # 选择一个sheet
sheet_new = wb.sheet_by_index(0) # 通过索引选择 # 写入新的数据
sheet_new.insert_column_values(insert_values) # 保存文件
new_wb.save(new_filename_path) # 关闭工作薄
wb.close()
new_wb.close()

xlrd&xlwt

xlrd

xlrd只能对excel文件进行读

# coding:utf-8
import xlrd # 使用xlrd创建一个工作薄对象
workbook = xlrd.open_workbook('C:/Users/41850/Desktop/test.xls') # 根据工作表的名称创建表格对象
# sheet = workbook.sheet_by_name('Sheet1')
# 根据工作表的索引创建表格对象,索引从0开始
sheet = workbook.sheet_by_index(0) # 获取sheet名称
sheet_name = sheet.name
print(u"表格名称: %s" % sheet_name) # 获取工作表的行数
row_count = sheet.nrows
# 获取工作表的列数
col_count = sheet.ncols
print("行数: %s 列数: %s" % (row_count, col_count)) # 获取数据
row_value = sheet.row_values(0) # 获取第1行数据
col_value = sheet.col_values(0) # 获取第1列数据
cell_value = sheet.cell_value(0, 1) # 获取第1行第2列数据
print("获取的数据值为:%s, %s, %s" %(row_value, col_value, cell_value))

xlwt

xlwt只能对xls文件进行写

# coding:utf-8
import xlwt # 打开一个工作薄
filename = 'C:/Users/41850/Desktop/test1.xls'
write_book = xlwt.Workbook(encoding="utf-8") # 新增个表格,若文件已存在,则覆盖
sheet = write_book.add_sheet('test') # 写入数据(行号, 列号, 写入值)
sheet.write(0, 0, 123.456)
sheet.write(1, 0, 789)
sheet.write(2, 0, 'hello') # 保存
write_book.save(filename)

注意,xlwt没有直接修改已有 xls 文件的方法。通常的做法是,读取出文件,复制一份数据,对其进行修改,再保存。

# coding:utf-8
import xlrd
from xlutils.copy import copy # 打开文件
filename = 'C:/Users/41850/Desktop/test1.xls'
rb = xlrd.open_workbook(filename) # 复制
wb = copy(rb)
# 选取表单
s = wb.get_sheet(0)
# 写入数据
s.write(0, 1, 'new data')
# 保存
wb.save(filename)

Python_对excel表格读写-openpyxl、xlrd&xlwt的更多相关文章

  1. python操作excel表格详解(xlrd/xlwt)

    http://www.2cto.com/kf/201501/373655.html http://blog.csdn.net/b_h_l/article/details/17001395 利用pyth ...

  2. Python操作Excel——win32com模块和xlrd+xlwt+xlutils组合

    今天,接到一个任务,要生成大约两百个excel文件,从2006年到2013年,每个月两个文件,这些文件中除了几个关于日期的单元格不同外,其他数据都相同,所以就想到可以用python写一个小脚本,自动生 ...

  3. python操作excel表格文件--使用xlrd模块

    原文: http://www.cnblogs.com/lhj588/archive/2012/01/06/2314181.html 引言: 实际工作中,可能很多情况下都会用到excel表格,像如果不需 ...

  4. 【Python】excel读写操作 xlrd & xlwt

    xlrd ■ xlrd xlrd模块用于读取excel文件内容 基本用法: workbook = xlrd.open_workbook('文件路径') workbook.sheet_names() # ...

  5. Python处理Excel文档(xlrd, xlwt, xlutils)

    简介 xlrd,xlwt和xlutils是用Python处理Excel文档(*.xls)的高效率工具.其中,xlrd只能读取xls,xlwt只能新建xls(不可以修改),xlutils能将xlrd.B ...

  6. Python excel 库:Openpyxl xlrd 对比 介绍

    打算用python做一个写mtk camera driver的自动化工具. 模板选用标准库里面string -> Template 即可 但要重定义替换字符,稍后说明 配置文件纠结几天:cfg, ...

  7. 用python批量处理Excel表格,处理结果又快又好,做办公室最靓的那个仔

    使用python批量处理Excel数据     让你根据Excel上所有人的身份证号码,提取出公司员工的生日 让你每个月都将公司所有人的考勤数据整理一下 类似这样的格式化的重复操作,你还在每次都使用的 ...

  8. Python—对Excel进行读写操作

    学习Python的过程中,我们会遇到Excel的读写问题.通过搜索得知,我们可以使用xlwt module将数据写入Excel表格,使用xlrd module从Excel读取数据.下面介绍如何实现使用 ...

  9. python学习笔记(十三)-python对Excel进行读写修改操作

    日常工作中会遇到Excel的读写问题.我们可以使用xlwt 模块将数据写入Excel表格,使用xlrd 模块从Excel读取数据,使用xlutils模块和xlrd模块结合对Excel数据进行修改.下面 ...

随机推荐

  1. my37_MGR流控对数据库性能的影响以及MGR与主从的性能对比

    mysql> show variables like 'group_replication_flow_control_applier_threshold'; +----------------- ...

  2. mybatis分页插件PageHelper源码浅析

    PageHelper 是Mybaties中的一个分页插件.其maven坐标 <!-- https://mvnrepository.com/artifact/com.github.pagehelp ...

  3. angular过滤器在html和js中的使用

    在HTML中使用格式为:{{数据 | 过滤器名称:条件一:条件二--}}:过滤条件间使用:隔开 例如: 在代码中一般格式为:  变量 = $filter("过滤器名称")(被过滤数 ...

  4. ssm+ajax实现登陆

    ssm的搭建见上一章 1.数据协议层 public User selectByLoginnameAndPassword(@Param("loginname")String logi ...

  5. Delphi编译报错对照表

    ';' not allowed before 'ELSE' → ElSE前不允许有";" " clause not allowed in OLE automation s ...

  6. Mysql-5.6 二进制多实例部署

    目录 一.简介 二.环境声明 三.程序部署 一.简介 MySQL多实例就是在一台机器上开启多个不同的服务端口(如:3306,3307),运行多个MySQL服务进程,通过不同的socket监听不同的服务 ...

  7. pyecharts简介

    一.概况 Echarts 是一个由百度开源的数据可视化,凭借着良好的交互性,精巧的图表设计,得到了众多开发者的认可. 而 Python 是一门富有表达力的语言,很适合用于数据处理.当数据分析遇上数据可 ...

  8. MySQL如何随机筛选25000条数据

    一.SELECT * FROM sheet1 t1 ORDER BY RAND() LIMIT 10000; 二.SELECT * FROM sheet1 AS t1 JOIN (SELECT ROU ...

  9. [BUUCTF]PWN——[ZJCTF 2019]Login

    [ZJCTF 2019]Login 附件 步骤: 例行检查,64位程序,开启了canary和nx保护 2. 试运行一下程序 3. 64位ida载入,检索字符串,在程序里找到了用户名admin和密码2j ...

  10. 任务信息的高级选项(Project)

    <Project2016 企业项目管理实践>张会斌 董方好 编著 张同学说,[高级]选项卡很重要,嗯,本妖深以为然! 这里的[高级]选项卡,是指[任务信息]里的,在默认视图下,只要双击某任 ...