python经常使用模块目录html
原表格:python
import xlrd from xlutils.copy import copy workbook = xlrd.open_workbook('mcw_test.xlsx') # 打开工做簿 new_workbook = copy(workbook) # 将xlrd对象拷贝转化为xlwt对象 new_workbook.save("mcw_test.xlsx") # 保存工做簿
新工做簿的工做表内容同样,sheet2有点数据也复制出来了,只是格式没有复制过来:app
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'] 魔降风云变人名单 <xlrd.sheet.Sheet object at 0x029EC7F0> 4
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 ----------------------------结果: <xlwt.Worksheet.Worksheet object at 0x02A18CB0> <xlwt.Workbook.Workbook object at 0x02A18AF0> 魔降风云变人名单
import xlrd import xlwt from xlutils.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')
#我要修改小郭吹雪的爱好为喝水
#需求分析:我须要知道"小郭吹雪的行号"和“爱好”的列号。我要修改的内容就是行号和列号所对应的单元格。代码修改就能够用行列索引
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函数
#由上四、拷贝后直接修改文件内容可知。只要得到行列索引,则能够将对应的单元格原值覆盖掉,即为修改。这里根据要求得到所需的行列索引
#漏洞分析:若是须要修改一我的的多个列值,那么是执行屡次上述查找的代码吗?能够用装饰器作个次数的传参么?有时间研究.
可看下图,由索引可知,我要修改的是第三行第四列,睡觉改成喝水。索引得出正确

#------------------------------开始获取须要修改的索引坐标------------------------- import xlrd import xlwt from xlutils.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) # return rindex,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') # ------------------修改接收并保存---------------------
#上述代码我想说的点。post
1)一是我用了那个手动建立的文件作的Excel文件进行修改,可是报错了。后来用了以前重写过得文件就行了,即下面这个没有漂亮格式的文件学习
2)而是我居然遇到了一个问题,id查看xlrd读文件接收的变量rindex和cindex同样地址的,后面就不能对文件进行修改。因而我用列表转化,再用int转化,知道内存地址改变了才能不报错的往下执行修改操做。思考,为啥xlrd读出来的不能在下面进行格式化呢?xlrd彷佛没有打开而后关闭的方法spa
3)有时间把上面的写成修改Excel的函数,.net
报错信息: Traceback (most recent call last): File "C:\mcw\temp\xlrd_sty.py", line 25, in <module> old_excel = xlrd.open_workbook('mcw_test.xlsx', formatting_info=True) File "C:\mcw\venv\lib\site-packages\xlrd\__init__.py", line 138, in open_workbook ragged_rows=ragged_rows, File "C:\mcw\venv\lib\site-packages\xlrd\xlsx.py", line 798, in open_workbook_2007_xml raise NotImplementedError("formatting_info=True not yet implemented") NotImplementedError: formatting_info=True not yet implemented
import xlrd from xlutils.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))) return rindex,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)
import xlrd from xlutils.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)
删除备注后的代码:excel
import xlrd from xlutils.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)
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
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']
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)
参考:code
1)https://www.jianshu.com/p/a8391a2b8c6c2)https://blog.csdn.net/blog_user_zk/article/details/75334566