xlutils.copy 过后的excel读取工作表名称怎么读取值

当前位置:
> python Excel操作之sheet复制
python Excel操作之sheet复制
在日常的工作中,经常会在生成报表的时候用到的操作,因为大多数人还是比较喜欢的风格。
操作excel主要会用到2个库。一个是用于写excel。一个是用于excel文件的读取。
这时候会出现2种情况。
所有内容都是动态生成的
这种情况还是比较好处理,我们只需要使用进行操作即可。
&Python&|&&复制&|?&0102from xlwt import *03&04'''对excel增加行'''
05def writeRow(tableObj,rowNum,tmpList,xlsStyleDict={}):06
for num,o in enumerate(tmpList):07
if num in xlsStyleDict:08
style = xlsStyleDict.get(num)09
tableObj.write(rowNum,num,o,style)10
tableObj.write(rowNum,num,o)12&13'''@param fileName:文件名14
@param dataDict:数据15
dataDict格式 {&_sheetName&:[u'a',u'b',u'c'],16
&_sheetData&:{&a&:[['1','2','3'],['a','b','c']],17
&b&:[['11','22','33'],['aa','bb','cc']],18
&c&:[['111','222','333'],['aaa','bbb','ccc']]19
&_sheetTitle&:{&a&:[[u'日期',u'visits数量',u'leads数量']]}21
&_sheetStyle&:{&a&:{0:XFStyleobject,1:XFStyleobject}}22
}23'''24def createExcelFile(fileName,dataDict):25
if dataDict:26
excelfile = Workbook()27
sheetNameList = dataDict.get(&_sheetName&,[])28
sheetDataDict = dataDict.get(&_sheetData&,{})29
sheetTitleDict = dataDict.get(&_sheetTitle&,{})30
sheetStyleDict = dataDict.get(&_sheetStyle&,{})31&32
for sheetName in sheetNameList:33
ws = excelfile.add_sheet(sheetName)34
titleList = sheetTitleDict.get(sheetName,[])35
styleDict = sheetStyleDict.get(sheetName,{})36
dataList = sheetDataDict.get(sheetName,[])37
rowIdx = 038
for title in titleList:39
writeRow(ws,rowIdx,title)40
rowIdx +=1
for data in dataList:42
writeRow(ws,rowIdx,data,styleDict)43
rowIdx +=144&45
excelfile.save(fileName)46&47
已经存在了一个复杂的excel模板,需要向里面填入数据
此种情况又会分为2种,一种是模板固定;一种是动态模板。
比如就是3个sheet页,我们只需要对应的填入每行的数据即可。
这种情况,我们就需要用到及。
&Python&|&&复制&|?&0102import xlwt03import 04from xlrd import open_workbook 05from .copy import copy06'''@param:targetPath 新生成的excel名字07
@param:templatePath 模板的名字08
@sheetDataList:数组,数组下标对应模板中的sheet下标;下标对应的值要写入到各个sheet中.09'''
10def createExcelFromTemplate(targetPath,templatePath,sheetDataList):11
cf = Utils.getConf(&excel&)12
rb = open_workbook(templatePath) #通过sheet_by_index()获取的sheet没有write()方法13
wb = copy(rb) #通过get_sheet()获取的sheet有write()方法14
for idx in range(0,len(sheetDataList)):15
sheetStartIdx = int(cf.get(excelName,&sheet%s_startIdx& % idx))#此行特殊,我这里是通过配置文件读入sheet模板中表头的行数16
ws = wb.get_sheet(idx)17
insertList = sheetDataList[idx]18
for data in insertList:19
writeRow(ws,sheetStartIdx,newData,{})21
sheetStartIdx +=122
wb.save(targetPath) 25
比如一个模板中就1个sheet页,但是我们生成的excel报表需要根据第一个sheet页的样式来生成多个相同样式的sheet。
这种情况比较复杂,所以需要用到一些xlrd中的获取原模板的数据的方式。
&Python&|&&复制&|?&0102from xlwt import *03import xlrd04from xlrd import open_workbook 05sourceFile =&/home/test/a.xls&06targetFile =&/home/test/b.xls&07rb = open_workbook(sourceFile)08wb = Workbook()09for o in range(0,rb._all_sheets_count):10
t_ws = wb.add_sheet(&--%s& % o)#写入sheet名称11
s_ws = rb.sheet_by_index(o)#rb.sheet_by_name('111')12
numRow = s_ws.nrows 13
numCol = s_ws.ncols 14&15
for row in xrange(numRow): 16
rowList = s_ws.row_values(row) 17
for col in xrange(numCol): 18
oneValue = rowList[col] 19
t_ws.write(row, col, oneValue)20wb.save(targetFile)21
另外附上一个不错的代码。也是用于sheet复制的,但是他是从同一个workbook中复制。
&Python&|&&复制&|?&0102from xlwt import *03import xlrd04from xlutils import copy05''' 06workbook
== book in use 07source_index == index of sheet you want to copy (0 start) 08new_name
== name of new copied sheet 09''' 10def copy_sheet(workbook, source_index, new_name): 11
new_sheet = copy.copy(workbook.get_sheet(source_index)) 12
workbook._Workbook__worksheets.append(new_sheet) 13
append_index = len(workbook._Workbook__worksheets)-1 14
workbook.set_active_sheet(append_index) 15
workbook.get_sheet(append_index).set_name(new_name)16
另注意,现在python的类库对excel支持有一定限制,当行数超过65535即报错。
一旦遇到这种问题,不要犹豫了,改csv吧!明天我再简单介绍一下python操作csv。
本文固定链接: 标签: , , , ,
【上一篇】【下一篇】
您可能还会对这些文章感兴趣!
您必须才能发表留言!
◇公◆告◆栏◇
在这里发一个招聘信息吧,招聘hadoop及相关大数据技术开发人员,要求熟悉hadoop,hive,对实时流计算比如storm,elasticsearch了解,同时有意愿学习算法分析,简历请发 !
日志总数:150 篇
评论总数:24 篇
标签数量:220 个
链接总数:10 个
建站日期:
运行天数:1802 天
最后更新:& Python读写Excel如何保留原有格式
Python读写Excel如何保留原有格式
我们在程序开发过程中,经常会用到读写Excel的问题,python语言提供了一些第三方插件来解决这个问题。最近写了个小应用,用到要保持原有格式,费劲周折。这里作个记录。
首先是选择工具的问题:这篇博文有很好的介绍,就不多说了: From GoCalf Blog
原来的EXCEL是XLSX格式,最初想用OpenPyXL, 但它对格式的支持非常差,XLSXWriter又不能读。最后只好选择Excel转换成XLS格式后,用xlrd、xlwt和xlutils系列,pyExcelerator的读文件功能太差就不考虑了。
基本的思想是来自这个帖子: From stackoverflow
import xlrd
import xlutils.copy
newwb = xlrd.open_workbook(newFile, formatting_info=True)
# formatting_info 带格式导入
outwb = xlutils.copy.copy(newwb)
# 建立一个副本来用xlwt来写
def setOutCell(outSheet, col, row, value):
&&& Change cell value without changing formatting. &&&
def _getOutCell(outSheet, colIndex, rowIndex):
&&& HACK: Extract the internal xlwt cell representation. &&&
row = outSheet._Worksheet__rows.get(rowIndex)
if not row: return None
cell = row._Row__cells.get(colIndex)
return cell
# HACK to retain cell style.
previousCell = _getOutCell(outSheet, col, row)
# END HACK, PART I
outSheet.write(row, col, value)
# HACK, PART II
if previousCell:
newCell = _getOutCell(outSheet, col, row)
if newCell:
newCell.xf_idx = previousCell.xf_idx
# END HACK
outSheet = outwb.get_sheet(0)
setOutCell(outSheet, 5, 5, 'Test')
outwb.save('output.xls')
这个程序只能修改固定单元格的数据,但是不能更改其格式,如果更改原来的格式就不能保留了。查了一下网上也没有好的解决方案,期待后来者解决。
这里的Python是2.x版本。
文章如非说明皆为原创,请注明转载自:葡萄皮的数据空间[]
本文链接: /2014/06/python%e8%af%bb%e5%86%99excel%e5%a6%82%e4%bd%95%e4%bf%9d%e7%95%99%e5%8e%9f%e6%9c%89%e6%a0%bc%e5%bc%8f/`
2014年六月
15161718192021
22232425262728
- 9,495 次阅读 - 4,386 次阅读 - 3,702 次阅读 - 3,076 次阅读 - 2,509 次阅读 - 2,335 次阅读 - 2,141 次阅读 - 2,058 次阅读 - 1,922 次阅读 - 1,581 次阅读3218人阅读
Python(59)
Python解析Excel时需要安装两个包,分别是xlrd(读excel)和xlwt(写excel),安装方法如下:
pip install xlrd
pip install xlwt
读取Excel表
读取excel前需要先引入该模块(import xlrd)。但是需要注意的是,用xlrd读取excel表时,返回的xlrd.Book类型,是只读的,不能对其进行操作。
下面介绍一下读取Excel的流程及使用的一些函数:
1、打开Excel文件并读取数据
xlrd.open_workbook(filename)
filename是要读取的excel表名,当然要加上表所在目录的路径。
data = xlrd.open_workbook('c:\\t2.xls')
查看一下data类型:
&&& type(data)
&class 'xlrd.book.Book'&
可见data是xlrd.book.Book类的一个实例。
2、获取一个工作表(sheet)
获取一个工作表的方法有三种,分别为:
(1)通过索引顺序获取
table = data.sheets()[index_number]
index_number表示表的索引号,索引号从0开始,表示第一张表,1表示第二张表,依次类似。
查看一下data.sheets这个方法的原型:
&&& help(data.sheets)
sheets(self) method of xlrd.book.Book instance
# @return A list of all sheets in the book.
# All sheets not already loaded will be loaded.
这个方法的作用是,将excel中所有表存于list中并返回。
(2)通过索引顺序获取
table = data.sheet_by_index(index_number)
index_number表示表的索引号,索引号从0开始,表示第一张表,1表示第二张表,依次类似。
函数原型:
sheet_by_index(self, sheetx) method of xlrd.book.Book instance
# @param sheetx Sheet index in range(nsheets)
# @return An object of the Sheet class
(3)通过名称获取
table = data.sheet_by_name(sheet_name)
sheet_name表示工作表的名字,但是需要注意的是这个表明的字符串需要使用Unicode的字符串,如:
table = data.sheet_by_name(u'Sheet1')
函数原型:
sheet_by_name(self, sheet_name) method of xlrd.book.Book instance
# @param sheet_name Name of sheet required
# @return An object of the Sheet class
3、获取整行和整列的值
返回一行:
table.row_values(row_index)
row_index表示行索引号,0表示第一行,1表示第二行,以此类推。返回的结果是row_index 行组成的list。
返回一列:
table.col_values(col_index)
col_index表示行索引号,0表示第一列,1表示第二列,以此类推。返回的结果是col_index 行组成的list。
4、获取表的行数和列数
获取行数和列数都是固定语法:
table.nrows #获取行数
table.ncols
5、获取单元格中的值
table.cell(row_index, col_index).value
row_index:表示表的行索引号。
col_index:表示表的列索引号。
创建Excel表
Python中使用的是xlwt模块来生成Excel文件,并且可以控制单元格的格式。xlwt.Workbook()返回的xlwt.Workbook类型的save(filepath)方法可以保存excel文件。下面就让我们看看写excel文件的流程及需要使用的函数吧。
写excel前也必须先导入该模块(import xlwt)。流程如下:
1、创建工作表(workbook)
创建workbook,其实就是创建excel,写完数据后,保存就ok了。
workbook = xlwt.Workbook(encoding = 'ascii')
查看一下workbook类型:
&&& type(workbook)
&class 'xlwt.Workbook.Workbook'&
可见workbook是xlwt.Workbook类的一个实例。
worksheet = Workbook.add_sheet(sheet_name)
worksheet = Workbook.add_sheet('note')
3、往单元格中写内容
worksheet.write(r, c, label='', style=&xlwt.Style.XFStyle object&)
参数说明:
r :表示行索引号,从0开始。
c :表示列索引号,从0开始。
label :表示要写的内容。
4、保存excel表
workbook.save(Excel_name)
Excel_name表示保存为什么名,当然可以保存在具体的目录下。如:
workbook.save('c:\\Excel_Test.xls')
上面我们介绍了读和写excel,前两种都是不能修改excel的,但是在实际的工作中,经常会遇到修改已经存在的Excel文件这种需求,通常我们能想到的办法,就是先打开这个excel,然后将内容读入到内存,进行处理,然后写到一个新的同名excel文件中,最后直接用修改后的excel文件覆盖了老的excel文件即可。值得我们高兴的是,python已经帮我们实现了这么一个功能模块,那就是模块xlutils,这个模块依赖于xlrd和xlwt模块,它提供了复制excel文件内容和修改文件内容的功能。其实也就是在xlrd.Book和xlwt.Workbook之间建立了一个管道来实现修改功能。实现流程如下图所示:
引入模块时,需要同时引入读模块和修改模块,如下:
import xlrd
from xlutils.copy import copy
打开excel开始将内容读到内存中:
readbook = xlrd.open_workbook('c:\\t2.xls')
使用xlutils.copy模块的copy()方法将原excel另外拷贝一份,准备修改操作:
copyBook = copy(readbook)
接下来就是从readBook中(也就是原excel中,注意这里读取数据的时候必须从原excel中读取)取得要修改的工作表,然后使用copybook取到相同工作表,使用进行修改操作,最后把修改的内容保存到
读取到要修改的工作表,如:
readSheet = readBook.sheet_by_index(0)
上面这种读sheet的方法是xlrd模块中的方法,它是没有write()方法,所以是不能写的。
然后将要修改的sheet或整个excel文档拷贝一份:
copyBook = copy(readbook)
copyBook = copy(readSheet)
writeSheet = copybook.get_sheet(0)
上面的通过get_sheet()获取的sheet是有write()方法,所以能写。
然后进行修改操作,如:
writeSheet.write(1,0,'asd')
当然,上面的实例只是一个简单的写操作,我们还可做一些更复杂的写操作,修改完数据以后,将新的excel表保存并覆盖旧的excel表即可,这就实现了对excel修改的操作需求。
copybook.save('c:\\t2.xls')
读必须从原表中读取,写必须写入拷贝的表中。
下面是一个修改已存在excel的实例:修改t2.xls,并将里面小写字母变成大写字母
import xlrd
from xlutils.copy import copy
readbook = xlrd.open_workbook('c:\\t2.xls')
copybook = copy(readbook)
for i in range(len(readbook.sheets())) :
遍历excel文档中的每个工作表,进行下面的处理
sheet = copybook.get_sheet(i)
readSheet = readbook.sheet_by_index(i)
for row in range(readSheet.nrows) :
对表i中的单元格数据做如下处理
for col in range(readSheet.ncols) :
cell = readSheet.cell(row, col).value
print "type is :", type(cell),cell
if type(cell) in (str, unicode) :
判断一下读取出来的单元格数据格式,
如果为str和unicode的字符串,就调用字符串的upper函数,
将小写改成大写。
res = cell.upper()
sheet.write(row, col, res)
copybook.save('c:\\wcx\\t2.xls')
借助上面的例子,我们来讨论一下Python中编码的问题。
在介绍编码前,先介绍一下Python中判断字符编码的一些函数:
isinstance()函数,如:
isinstance(s, unicode) #判断s是否是Unicode字符串
print type(s).__name__ #看看字符串s是普通字符串还是Unicode字符串
使用chardet模块进行字符编码判断。
pip install chardet
import chardet
&&& type(t)
&type 'str'&
&&& chardet.detect(t)
{'confidence': 1.0, 'encoding': 'ascii'}
Python中的字符串类型有两种,一种是str类型,一种是Unicode类型。除了Unicode类型的字符串外,其他编码的字符串都是str类型的。例:
&&& s = u'中国'
&&& type(s)
&type 'unicode'&
&&& t = "sdf"
&&& type(t)
&type 'str'&
看下面这个例子:
&&& s = u'中国'
&&& type(s)
&type 'unicode'&
&&& str(s)
Traceback (most recent call last):
File "&stdin&", line 1, in &module&
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-1: ordinal not in range(128)
为什么会报错呢?
首先我们查看一下我们系统默认编码:
&&& import sys
&&& sys.getdefaultencoding()
从结果可以看出,系统默认编码时ASCII码,ASCII码编码中一个字符只占一个字节,而Unicode编码中一个字符占2个字节(因为要表示中文汉字)。
当调用str()函数将一个Unicode字符串转str类型时,如果我们没有指定编码,就会采用系统默认编码(ascii)对Unicode字符进行编码,但是ascii码和Unicode编码的字符所占字节数不一致,那些非ascii编码的字符就不能被转化,这就是为什么会报UnicodeEncodeError这个错。
那到底str和Unicode之间怎么转呢?
这就需要用到Python提供的解码(decode)和编码(encode)函数了,其实str是Unicode字符串编码(encode)后的字符串,相反的Unicode就是str解码(decode)后的字符串,这样str和Unicode之间转换起来就简单了。如:
&&& s = u'中国'
&&& type(s)
&type 'unicode'&
&&& g = s.encode('gbk')
&&& type(g)
&type 'str'&
&&& u = s.encode('utf-8')
&&& type(u)
&type 'str'&
&&& str(g)
'\xd6\xd0\xb9\xfa'
&&& str(u)
'\xe4\xb8\xad\xe5\x9b\xbd'
&&& t = "asdf"
&&& c = t.decode('ascii')
&&& type(c)
&type 'unicode'&
不过我们还有另一个种处理办法:
那就是将系统默认缺省编码改成utf-8,如下:
&&& import sys
&&& reload sys
&&& sys.setdefaultencoding('utf-8')
utf-8是一种针对Unicode的可变长度字符编码,它用1到6个字节编码Unicode字符,所以显示中文。将系统默认编码设置为utf-8后,就可以直接使用str()函数直接转化Unicode字符了,不用再使用编码解码函数了。如:
&&& s = u"表单"
&&& str(s)
'\xe8\xa1\xa8\xe5\x8d\x95'
网络上传的json、excel、字节流等数据串都被转化成Unicode字符,这样更通用。所以我们从excel中读取出来的数据只要是字符类型的都会被转成Unicode字符(通常需要判断一下),而我们程序中通常都用的是utf-8,所以需要将Unicode转化成uft-8后再处理这些字符,处理完后,再转成Unicode的通过网络传回去,这样保持传回去的字符集和获得的字符集编码一样,就会不出现乱码。
在上面修改excel实例程序中,写了这么一句,虽然被注释了:
sheet.write(row, col, '中文'.decode('GBK'))
这句的目的是,让写入excel中的中文不出现乱码,这里设计到一个内码的概念。
什么叫内码呢?
内码是指计算机汉字系统中使用的二进制字符编码,是沟通输入、输出与系统平台之间的交换码,通过内码可以达到通用和高效率传输文本的目的。
而win默认gbk作为系统内部编码,所以要想显示正确的中文,就需要将GBK解码成Unicode,然后传输给excel。
&&相关文章推荐
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:170252次
积分:2547
积分:2547
排名:第13130名
原创:103篇
(4)(12)(25)(27)(30)(7)(3)python读写excel文件
操作excel的三个工具包如下,注意,只能操作.xls,不能操作.xlsx。
xlrd: 对excel进行读相关操作
xlwt: 对excel进行写相关操作
xlutils: 对excel读写操作的整合
这三个工具包都可以直接使用pip进行下载:
sudo pip install xlrdsudo
pip install xlwtsudo
pip install xlutils
二、使用xlrd模块读取已有的excel文件内容
xlrd是用来从一个excel文件中读取内容的模块
代码如下:
import xlrd
data = xlrd.open_workbook('demo.xls')#注意这里的workbook首字母是小写
查看文件中包含sheet的名称
data.sheet_names()
得到第一个工作表,或者通过索引顺序 或 工作表名称
table = data.sheets()[0]
table = data.sheet_by_index(0)
table = data.sheet_by_name(u'Sheet1')
获取行数和列数
nrows = table.nrows
ncols = table.ncols
获取整行和整列的值(数组)
table.row_values(i)
table.col_values(i)
循环行,得到索引的列表
for rownum in range(table.nrows):
print table.row_values(rownum)
cell_A1 = table.cell(0,0).value
cell_C4 = table.cell(2,3).value
分别使用行列索引
cell_A1 = table.row(0)[0].value
cell_A2 = table.col(1)[0].value
简单的写入
ctype = 1# 类型 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error
value = 'lixiaoluo'
xf = 0# 扩展的格式化 (默认是0)
table.put_cell(row, col, ctype, value, xf)
table.cell(0,0) # 文本:u'xxxx'
table.cell(0,0).value # 'yyyy'
三、使用xlwd模块写内容保存到新的excel文件中
xlwt只能创建一个全新的excel文件,然后对这个文件进行写入内容以及保存。但是大多数情况下我们希望的是读入一个excel文件,然后进行修改或追加,这个时候就需要xlutils了。
代码如下:
import xlwt
新建一个excel文件
file = xlwt.Workbook()#注意这里的Workbook首字母是大写,无语吧
新建一个sheet
table = file.add_sheet('sheet name')
写入数据table.write(行,列,value)
table.write(0,0,'test')
如果对一个单元格重复操作,会引发
returns error:
# Exception: Attempt to overwrite cell:
# sheetname=u'sheet 1' rowx=0 colx=0
所以在打开时加cell_overwrite_ok=True解决
table = file.add_sheet('sheet name',cell_overwrite_ok=True)
file.save('demo.xls')
另外,使用style
style = xlwt.XFStyle()#初始化样式
font = xlwt.Font()#为样式创建字体
font.name = 'Times New Roman'
font.bold = True
style.font = font#为样式设置字体
table.write(0, 0, 'some bold Times text', style)# 使用样式
四、使用xlutils模块追加写入内容到已有的excel文件中(新内容追加到已有内容里面)
代码如下:
# -*- coding: cp936 -*-
from xlutils.
import xlrd
#用xlrd提供的方法读取一个已经存在的excel文件,使用&formatting_info=True&保持源文件格式不变
rexcel = xlrd.open_workbook(&file.xls&,formatting_info=True)
#用wlrd提供的方法获得现在已有的行数
rows = rexcel.sheets()[0].nrows
#cols = rexcel.sheets()[0].ncols
#用xlutils提供的copy方法将xlrd的对象转化为xlwt的对象
excel = copy(rexcel)
#用xlwt对象的方法获得要操作的excel中的表名(sheet),0表示第一张表,1表示第二张表。
table = excel.get_sheet(0)
values = ['1','2','3']
row = rows
for value in values:
# xlwt对象的写方法,参数分别是行、列、值
table.write(row,0,value)
table.write(row,1,&haha&)
table.write(row,2,&lala&)
# xlwt对象的保存方法,这时便覆盖掉了原来的excel
excel.save(&file.xls&)

我要回帖

更多关于 copy from user返回值 的文章

 

随机推荐