1、xlutils 实现拷贝原文件

原表格:

import xlrdfromxlutils.copy import copy

workbook= xlrd.open_workbook('mcw_test.xlsx') # 打开工作簿

new_workbook=copy(workbook) # 将xlrd对象拷贝转化为xlwt对象

new_workbook.save("mcw_test.xlsx") # 保存工作簿

新工作簿的工作表内容一样,sheet2有点数据也复制出来了,只是格式没有复制过来:

2、拷贝前获取原工作簿信息

workbook = xlrd.open_workbook('mcw_test.xlsx') # 打开工作簿

sheets=workbook.sheet_names() # 获取工作簿中的所有工作表名字,形成列表元素

worksheet= workbook.sheet_by_name(sheets[0]) # 通过sheets[0]工作表名称获取工作簿中所有工作表中的的第一个工作表

rows_old=worksheet.nrows # 获取第一个工作表中已存在的数据的行数

print(sheets,sheets[0],worksheet,worksheet.nrows )-------------------------------------结果:

['魔降风云变人名单', 'Sheet2', 'Sheet3'] 魔降风云变人名单 4

3、拷贝后获得新工作簿的信息:

workbook = xlrd.open_workbook('mcw_test.xlsx') # 打开工作簿

new_workbook = copy(workbook) # 将xlrd对象拷贝转化为xlwt对象

new_worksheet = new_workbook.get_sheet(0) # 获取转化后工作簿中的第一个工作表对象

print(new_worksheet,new_workbook,new_worksheet.name) #有时间整理下工作表对象的方法,工作表可以.name

----------------------------结果:

魔降风云变人名单

4、拷贝后直接修改文件内容:

import xlrd

import xlwtfromxlutils.copy import copy

# 打开想要更改的excel文件

old_excel= xlrd.open_workbook('mcw_test.xlsx', formatting_info=True)

# 将操作文件对象拷贝,变成可写的workbook对象

new_excel=copy(old_excel)

# 获得第一个sheet的对象

ws= new_excel.get_sheet(0)

# 写入数据

ws.write(0, 0, '第一行,第一列')

ws.write(0, 1, '第一行,第二列')

ws.write(0, 2, '第一行,第三列')

ws.write(1, 0, '第二行,第一列')

ws.write(1, 1, '第二行,第二列')

ws.write(1, 2, '第二行,第三列')

# 另存为excel文件,并将文件命名,可以重新命名,应该也可以覆盖掉

new_excel.save('new_mcw_test.xlsx')

5、读取文件,根据标题行和姓名列获取所有单元格索引坐标。

#我要修改小郭吹雪的爱好为喝水

#需求分析:我需要知道"小郭吹雪的行号"和“爱好”的列号。我要修改的内容就是行号和列号所对应的单元格。代码修改就可以用行列索引

import xlrd

import xlwt

from xlutils.copy import copy

workbook = xlrd.open_workbook('mcw_test.xlsx') # 打开工作簿

Data_sheet = workbook.sheets()[0]

row1 = Data_sheet.row_values(0) #取出第一行

dic_col_s={str(i):row1[i] for i in range(0,len(row1))} #将第一行的每个元素加个序数标记,标记列表索引,让列表索引和标题对应,由标题则可以从字典获取列号,即列表索引+1,这里需要的是索引

col2=Data_sheet.col_values(1) #取出第二列,

dic_row_s={str(i):col2[i] for i in range(0,len(col2))} #将第二列的每个元素加个序数标记,标记为第二列的列表索引。让名字和列表索引对应,就可以在字典中由名字得行号,即列表索引+1。这里需要的是这个索引

print(dic_row_s)

print(dic_col_s)

mtitle="爱好" #需要修改哪个标题

mname="小郭吹雪" #需要修改哪个人的

rindex="".join([i for i in dic_row_s if dic_row_s[i]==mname]) #获取要修改的标题所在行的索引

cindex="".join([i for i in dic_col_s if dic_col_s[i]==mtitle]) #获取要修改的那个人所在的列索引

print(rindex,cindex) #获得要修改的单元格的行索引和列索引

------------------结果:

{'0': '姓名', '1': '小马过河', '2': '小郭吹雪', '3': '樱花小月'}

{'0': 'id', '1': '姓名', '2': '性别', '3': '爱好', '4': '毕业时间'}

2 3

#由上4、拷贝后直接修改文件内容可知。只要获得行列索引,则可以将对应的单元格原值覆盖掉,即为修改。这里根据要求获得所需的行列索引

#漏洞分析:如果需要修改一个人的多个列值,那么是执行多次上述查找的代码吗?可以用装饰器做个次数的传参么?有时间研究.

可看下图,由索引可知,我要修改的是第三行第四列,睡觉改为喝水。索引得出正确

6、4,5结合成标题6的内容。实现了对已有文件的某个单元格,与之同行的另一个单元格的修改

#------------------------------开始获取需要修改的索引坐标-------------------------import xlrd

import xlwtfromxlutils.copy import copy

#------------------开始修改----------------------------# def recindex():

workbook= xlrd.open_workbook('mcw_test.xlsx') # 打开工作簿

Data_sheet= workbook.sheets()[0]

row1= Data_sheet.row_values(0) #取出第一行

dic_col_s={str(i):row1[i] for i in range(0,len(row1))} #将第一行的每个元素加个序数标记,标记列表索引,让列表索引和标题对应,由标题则可以从字典获取列号,即列表索引+1,这里需要的是索引

col2=Data_sheet.col_values(1) #取出第二列,

dic_row_s={str(i):col2[i] for i in range(0,len(col2))} #将第二列的每个元素加个序数标记,标记为第二列的列表索引。让名字和列表索引对应,就可以在字典中由名字得行号,即列表索引+1。这里需要的是这个索引

mtitle="爱好"#需要修改哪个标题

mname="小郭吹雪"#需要修改哪个人的

rindex="".join([i for i in dic_row_s if dic_row_s[i]==mname]) #获取要修改的标题所在行的索引

cindex="".join([i for i in dic_col_s if dic_col_s[i]==mtitle]) #获取要修改的那个人所在的列索引

rindex=list(rindex)

rindex="".join(rindex)

rindex=int(rindex)

cindex=list(cindex)

cindex="".join(cindex)

cindex=int(cindex)

# print(rindex,cindex)

#returnrindex,cindex

# rindex,cindex=recindex()

# print(rindex,cindex) #获得要修改的单元格的行索引和列索引

# rindex=2# cindex=3# 打开想要更改的excel文件

old_excel= xlrd.open_workbook('mcw_test.xlsx', formatting_info=True)

# 将操作文件对象拷贝,变成可写的workbook对象

new_excel=copy(old_excel)

# 获得第一个sheet的对象

ws= new_excel.get_sheet(0)

# 写入数据

ws.write(rindex,cindex,'喝水') #修改第3行第4列

# 另存为excel文件,并将文件命名,可以重新命名,应该也可以覆盖掉

new_excel.save('mcw_test.xlsx')

#------------------修改接收并保存---------------------

#上述代码我想说的点。

1)一是我用了那个手动创建的文件做的Excel文件进行修改,但是报错了。后来用了之前重写过得文件就好了,即下面这个没有漂亮格式的文件

2)而是我竟然遇到了一个问题,id查看xlrd读文件接收的变量rindex和cindex一样地址的,后面就不能对文件进行修改。于是我用列表转化,再用int转化,知道内存地址改变了才能不报错的往下执行修改操作。思考,为啥xlrd读出来的不能在下面进行格式化呢?xlrd似乎没有打开然后关闭的方法

3)有时间把上面的写成修改Excel的函数,

报错信息:

Traceback (most recent call last):

File"C:\mcw\temp\xlrd_sty.py", line 25, in old_excel= xlrd.open_workbook('mcw_test.xlsx', formatting_info=True)

File"C:\mcw\venv\lib\site-packages\xlrd\__init__.py", line 138, inopen_workbook

ragged_rows=ragged_rows,

File"C:\mcw\venv\lib\site-packages\xlrd\xlsx.py", line 798, inopen_workbook_2007_xml

raise NotImplementedError("formatting_info=True not yet implemented")

NotImplementedError: formatting_info=True not yet implemented

7、(表格函数1:改)读取单元格索引并修改单元格的两个函数

import xlrdfromxlutils.copy import copy

fpath='mcw_test.xlsx'mname="小郭吹雪"mtitle="爱好"modifycontent="睡觉"def recindex(path,mname,mtitile):'''定位单元格,返回单元格行列索引供modify_cell函数使用

:param path: Excel文件路径

:param mname: 要修改的名字

:param mtitile: 要修改的标题

:return: 单元格的行列索引号。rindex:行,cindex:列索引''' workbook =xlrd.open_workbook(path)

Data_sheet= workbook.sheets()[0]

row1= Data_sheet.row_values(0)

dic_col_s={str(i):row1[i] for i in range(0,len(row1))}

col2=Data_sheet.col_values(1)

dic_row_s={str(i):col2[i] for i in range(0,len(col2))}

rindex="".join([i for i in dic_row_s if dic_row_s[i]==mname])

cindex="".join([i for i in dic_col_s if dic_col_s[i]==mtitle])

rindex=int("".join(list(rindex)))

cindex=int("".join(list(cindex)))returnrindex,cindex

def modify_cell(path,rindex,cindex,modifycontent):"""修改文件指定单元格内容,由recindex函数返回值获取rindex和cindex参数

:param path: 要修改的Excel文件路径

:param rindex:recindex返回值元组第一个元素,行索引

:param cindex:recindex返回值元组第二个元素,列索引

:param modifycontent: 要修改的单元格新的内容

:return:""" old_excel = xlrd.open_workbook(path, formatting_info=True)

new_excel=copy(old_excel)

ws= new_excel.get_sheet(0)

ws.write(rindex,cindex, modifycontent)

new_excel.save(path)

val=recindex(fpath,mname,mtitle)

modify_cell(fpath,val[0],val[1],modifycontent)

8、(表格函数2:增)往工作表中追加多行数据

import xlrdfromxlutils.copy import copy

fpath='mcw_test.xlsx'valueli=[["3","明明如月","女","听歌","2030.07.01"],

["4","志刚志强","男","学习","2019.07.01"],]

def write_excel_xls_append(path, value):

index=len(value) # 获取需要写入数据的行数

workbook=xlrd.open_workbook(path) # 打开工作簿

sheets=workbook.sheet_names() # 获取工作簿中的所有表格

worksheet= workbook.sheet_by_name(sheets[0]) # 获取工作簿中所有表格中的的第一个表格

rows_old=worksheet.nrows # 获取表格中已存在的数据的行数

new_workbook=copy(workbook) # 将xlrd对象拷贝转化为xlwt对象

new_worksheet= new_workbook.get_sheet(0) # 获取转化后工作簿中的第一个表格for i in range(0, index):for j in range(0, len(value[i])):

new_worksheet.write(i+rows_old, j, value[i][j]) # 追加写入数据,注意是从i+rows_old行开始写入

new_workbook.save(path) # 保存工作簿

print("xls/xlsx格式表格【追加】写入数据成功!")

write_excel_xls_append(fpath,valueli)

删除备注后的代码:

import xlrdfromxlutils.copy import copy

fpath='mcw_test.xlsx'valueli=[["3","明明如月","女","听歌","2030.07.01"],

["4","志刚志强","男","学习","2019.07.01"],]

def write_excel_xls_append(path, value):"""在excel第一个工作表中追加一行或多行数据

:param path: 要修改的Excel文件路径

:param value: 要添加的内容,每行都是列表元素,如示例:[["3","明明如月","女","听歌","2030.07.01"],

["4","志刚志强","男","学习","2019.07.01"],]""" index =len(value)

workbook=xlrd.open_workbook(path)

sheets=workbook.sheet_names()

worksheet= workbook.sheet_by_name(sheets[0])

rows_old=worksheet.nrows

new_workbook=copy(workbook)

new_worksheet= new_workbook.get_sheet(0)for i in range(0, index):for j in range(0, len(value[i])):

new_worksheet.write(i+rows_old, j, value[i][j])

new_workbook.save(path)

print("xls/xlsx格式表格【追加】写入数据成功!")

write_excel_xls_append(fpath,valueli)

9、(表格函数3:查1)显示文件的每行内容,制表符分隔每列

import xlrd

fpath="mcw_test.xlsx"def read_excel_xls(path):

workbook=xlrd.open_workbook(path) # 打开工作簿

sheets=workbook.sheet_names() # 获取工作簿中的所有表格

worksheet= workbook.sheet_by_name(sheets[0]) # 获取工作簿中所有表格中的的第一个表格for i in range(0, worksheet.nrows):for j in range(0, worksheet.ncols):

print(worksheet.cell_value(i, j),"\t", end="") # 逐行逐列读取数据#分隔符加空格实现对其点的

print()

read_excel_xls(fpath)-----------------------------------结果:

id 姓名 性别 爱好 毕业时间2.0 小马过河 男 跑步 2017.07.01

5.0 小郭吹雪 男 睡觉 2016.07.01

1.0 樱花小月 女 吃饭 2018.07.01

3 明明如月 女 听歌 2030.07.01

4 志刚志强 男 学习 2019.07.01

10、(表格函数4:查2)以列表形式显示文件的每行内容

import xlrd

fpath="mcw_test.xlsx"def read_excel_xls(path):"""打印所有行的内容,每行内容以列表形式展示

:param path: 要查看的Excel文件路径""" workbook =xlrd.open_workbook(path) # 打开工作簿

sheets=workbook.sheet_names() # 获取工作簿中的所有表格

worksheet= workbook.sheet_by_name(sheets[0]) # 获取工作簿中所有表格中的的第一个表格

rows= worksheet.row_values(0)for i in range(0, worksheet.nrows):

rows=worksheet.row_values(i) # 逐行逐列读取数据#分隔符加空格实现对其点的

print(rows)

read_excel_xls(fpath)------------------------------------结果:

['id', '姓名', '性别', '爱好', '毕业时间']

[2.0, '小马过河', '男', '跑步', '2017.07.01']

[5.0, '小郭吹雪', '男', '睡觉', '2016.07.01']

[1.0, '樱花小月', '女', '吃饭', '2018.07.01']

['3', '明明如月', '女', '听歌', '2030.07.01']

['4', '志刚志强', '男', '学习', '2019.07.01']

11、(表格函数5:建)新建表格并写入数据

import xlwt

fpath='修仙学院人名单.xlsx'sheet_name="小马过河工作表"valueli=[['id', '姓名', '性别', '爱好', '毕业时间'],

["3","明明如月","女","听歌","2030.07.01"],

["4","志刚志强","男","学习","2019.07.01"],]

def write_excel_xls(path, sheet_name, value):

index=len(value) # 获取需要写入数据的行数

workbook=xlwt.Workbook() # 新建一个工作簿

sheet=workbook.add_sheet(sheet_name) # 在工作簿中新建一个表格for i in range(0, index):for j in range(0, len(value[i])):

sheet.write(i, j, value[i][j]) # 像表格中写入数据(对应的行和列)

workbook.save(path) # 保存工作簿

print("xls/xlsx格式表格写入数据成功!")

write_excel_xls(fpath,sheet_name,valueli)

12、(表格函数6:删)未写,待增添

参考:

1)https://www.jianshu.com/p/a8391a2b8c6c

2)https://blog.csdn.net/blog_user_zk/article/details/75334566

python的xlutils模块_xlutils模块使用相关推荐

  1. Python杀死Excel?众多模块哪家强

    大家可能可能会面临这个问题: 成堆的科学实验数据需要导入 Excel 进行分析 成堆的销售数据表格等待统计 成堆的商品数据等待分析 作为人生苦短的 Python 程序员,该如何优雅地操作 Excel? ...

  2. python莫比乌斯环_python基础|模块

    1 模块简介 在python中常见的模块有三种,在python解释器中的内置模块,第三方模块和自定义模块.模块的有使用python编写的文件,有已被编译为共享库或DLL的C或C++扩展,也有使用C编写 ...

  3. Python中的类、模块和包究竟是什么?

    Python培训教程:Python中的类.模块和包究竟是什么?在Python和其他编程语言中,都有类似或相同的概念,如对象.类.模块.包,名称都是一样的,只不过会有细微的一些区别,正是因为有这些存在, ...

  4. Python中爬虫框架或模块的区别

    Python中爬虫框架或模块的区别,我们在Python的学习过程中,需要不断的总结知识点,这样我们才能进步的更快一些. (1)爬虫框架或模块 Python自带爬虫模块:urllib.urllib2; ...

  5. Python炫技操作:模块重载的五种方法

    作者 | 写代码的明哥 来源 | Python编程时光 环境准备 新建一个 foo 文件夹,其下包含一个 bar.py 文件 $ tree foofoo└── bar.py 0 directories ...

  6. python 多线程编程之_thread模块

    python 多线程编程之_thread模块 参考书籍:python核心编程 _thread模块除了可以派生线程外,还提供了基本的同步数据结构,又称为锁对象(lock object,也叫原语锁.简单锁 ...

  7. python 路径往上一层_Python常用模块之模块、包介绍和相关语法

    在计算机程序的开发过程中,随着程序代码越写越多,在一个文件里代码就会越来越长,越来越不容易维护. 为了编写可维护的代码,我们把很多函数分组,分别放到不同的文件里,这样,每个文件包含的代码就相对较少,很 ...

  8. Python实战案例,pygame模块,Python实现套路表白神器VS无套路表白神器

    前言 利用Python实现套路表白神器VS无套路表白神器.废话不多说. 让我们愉快地开始吧~ 开发工具 Python版本: 3.6.4 相关模块: pygame模块: random模块 sys模块: ...

  9. python逐行写入csv_python之模块csv之CSV文件的写入(按行写入)

    # -*- coding: utf-8 -*- #python 27 #xiaodeng #CSV文件的写入(按行写入) import csv #csv文件,是一种常用的文本格式,用以存储表格数据,很 ...

最新文章

  1. 想要彻底搞懂“异地多活”,看完这篇就够了
  2. python实现三叉树_使用python代码实现三叉搜索树高效率”自动输入提示”功能
  3. react使用setState注意事项
  4. javascript教程_JavaScript教程
  5. java获取次月1日,java处置年、月、周次以及起至日期大全 (转载)
  6. c语言程序设计考场排座位,“听说学霸座位是这个?”老师揭秘排座,真正的C位其实在这里……...
  7. 经验 | 我的研究生这三年
  8. RTSP视频流直播实现(海康)
  9. Axure RP 9 汉化包
  10. OFD版式Java开发组件——cnofd
  11. 淘宝CRM是如何通过数据分析进行解决问题的
  12. no package identifier when getting value for resource number 0x00000005
  13. 初识MIMO(六):MU-MIMO的仿真
  14. 20个非常有用的Python单行代码
  15. 用Java编写租车项目核心业务
  16. 用于针对DNN中后门攻击的蒸馏对策和中毒数据的去除
  17. 解决Chrome 无法保存密码问题
  18. Suspicious Operation Django
  19. 微软CEO鲍尔默失策太多次 应只拿1美元年薪
  20. refinerycms

热门文章

  1. smartforms打印不了可能问题
  2. 如何加快按生产订单查找物料凭证的报表的速度
  3. html点击按钮自动获取值,如何获取HTML按钮的文本值
  4. php background-color:,background-color属性怎么用
  5. caliop 数据可视化_星载激光雷达CALIOP数据处理算法概述
  6. java万法_Java内省机制和 BeanUtils实现
  7. c++图形化界面_还能这样用?Linux下如何编译C程序?
  8. 山西省内大学计算机,在山西省哪几所大学的计算机系比较有名
  9. fastjson反序列化漏洞_漏洞预警Fastjson再爆反序列化代码执行漏洞;星巴克被发现存在信息泄露风险...
  10. 利用宝塔linux面板+苹果CMS-----从0搭建一个电影网站(一)