精华帖 (0) :: 良好帖 (1) :: 新手帖 (0) :: 隐藏帖 (0)
|
|
---|---|
作者 | 正文 |
发表时间:2011-09-16
最后修改:2011-10-12
Python Excel Tutorial 指南安装有几种不同的安装方法。下面是以xlrd为例的,其它二个库都是使用同样的步骤。
从源码安装Linux系统: $ tar xzf xlrd.tgz $ cd xlrd-0.7.1 $ python setup.py install Windows系统:使用WinZip或类似工具解压xlrd-0.7.1.zip: C:\> cd xlrd-0.7.1 C:\xlrd-0.7.1> \Python26\python setup.py install 注意:确保你想要在你的项目中使用python。
使用Windows Installer安装Windows系统下,你可以下载运行xlrd-0.7.1.win32.exe安装。 注意它只是以注册表形式安装到Python中。
使用EasyInstall安装这种跨平台方法需要你已经安装了EasyInstall。更多信息请参考: http://peak.telecommunity.com/DevCenter/EasyInstall easy_install xlrd
使用Buildout安装Buildout在遇见python包时依靠一个没有涉及到Python系统的项目,提供一种跨平台的方法。 创建一个目录mybuildout,在里面下载下面文件: http://svn.zope.org/*checkout*/zc.buildout/trunk/bootstrap/bootstrap.py 现在,在mybuilout目录中创建一个名为buildout.cfg的文件,内容如下: [buildout] parts = py versions = versions [versions] xlrd=0.7.1 xlwt=0.7.2 xlutils=1.3.2 [py] recipe = zc.recipe.egg eggs = xlrd xlwt xlutils interpreter = py 注意:这个版本部分是可选的。 最后,运行下面: $ python bootstrap.py $ bin/buildout 这两行:
Buildout主页在 http://pypi.python.org/pypi/zc.buildout
读取Excel文件下面展示的所有的例子都是基于xlrd目录的教程。
打开WorkbooksWorkbooks能从一个文件、一个mmap.mmap对象或一个字符串加载: from mmap import mmap,ACCESS_READ from xlrd import open_workbook print open_workbook('simple.xls') with open('simple.xls','rb') as f: print open_workbook( file_contents=mmap(f.fileno(),0,acc ) aString = open('simple.xls','rb').read() print open_workbook(file_contents=aString) 操作Workbook这是一个简单操作workbook的例子: from xlrd import open_workbook wb = open_workbook('simple.xls') for s in wb.sheets(): print 'Sheet:',s.name for row in range(s.nrows): values = [] for col in range(s.ncols): values.append(s.cell(row,col).value) print ','.join(values) print 下面几乎没有小节涉及到操作workbook的更多细节。
揭秘Book通过open_workbook返回的xlrd.Book对象包含了所有对工作簿要的事情,能被用于在工作簿中取得独立的sheet。
这个nsheets属性是一个整数,包含工作簿sheet的数量。这个属性与sheet_by_index方法结合起来是获取独立sheet最常用的方法。
sheet_names方法返回包含工作簿中所有sheet名字的unicode列表。单独的sheet可以通过sheet_by_name方法使用这些名字获取。
sheets方法的结果是迭代获取工作簿中的每个sheet。
下面是这些方法和属性的例子示范: from xlrd import open_workbook book = open_workbook('simple.xls') print book.nsheets for sheet_index in range(book.nsheets): print book.sheet_by_index(sheet_index) print book.sheet_names() for sheet_name in book.sheet_names(): print book.sheet_by_name(sheet_name) for sheet in book.sheets(): print sheet xlrd.Book对象有与工作簿内容相关的其它属性,但很少用到:
如果你可能需要运用这些属性,请查看xlrd文档。
揭秘Sheet通过上面介绍的方法返回的xlrd.sheet.Sheet对象包含了所有对worksheet和它的内容操作的信息。
name属性是worksheet名字的unicode表示。
nrows和ncols属性分别包含了worksheet中的行数和列数。
下面例子展示了如何使用迭代来显示一个worksheet的内容: from xlrd import open_workbook,cellname book = open_workbook('odd.xls') sheet = book.sheet_by_index(0) print sheet.name print sheet.nrows print sheet.ncols for row_index in range(sheet.nrows): for col_index in range(sheet.ncols): print cellname(row_index,col_index),'-', print sheet.cell(row_index,col_index).value xlrd.sheet.Sheet对象有其他一些与worksheet内容相关的属性,但很少使用:
如果你认为你可能需要运用这些属性,请参看xlrd文档。
获得特定的单元格正如你在前面例子中看到的,Sheet对象的cell方法能用来返回特定单元格的内容。
cell方法返回一个xlrd.sheet.Cell对象。除了value包含了单元格的真实值,ctype包含了单元格的类型,Cell对象几乎没有其他属性。
另外,Sheet对象有两个方法返回这两种数据类型。cell_value方法返回特定单元格的值,而cell_type方法返回特定单元格的类型。这两个方法执行时比获取Cell对象更快。
后面会讲述更多Cell类型的细节。下面示范了这些方法,属性和起作用的类: from xlrd import open_workbook,XL_CELL_TEXT book = open_workbook('odd.xls') sheet = book.sheet_by_index(1) cell = sheet.cell(0,0) print cell print cell.value print cell.ctype==XL_CELL_TEXT for i in range(sheet.ncols): print sheet.cell_type(1,i),sheet.cell_value(1,i) 迭代Sheet的内容我们已经见过怎么迭代worksheet的内容,获取产生的单独的单元格。然而,有更容易的方法来获取单元格组。有一套对称的方法来通过行或列获取单元格组的信息。
row和col方法分别返回一整行(列)的Cell对象。
row_slice和col_slice方法分别返回一行(列)中以开始索引和一个可选的结束索引为边界的Cell对象列表。
row_types和col_types方法分别返回一行(列)中以开始索引和一个可选的结束索引为边界的表示单元格类型的整数列表。
row_values和col_values方法分别返回一行(列)中以开始索引和一个可选的结束索引为边界的表示单元格值的对象列表。
下面是所有sheet迭代方法的示例: from xlrd import open_workbook book = open_workbook('odd.xls') sheet0 = book.sheet_by_index(0) sheet1 = book.sheet_by_index(1) print sheet0.row(0) print sheet0.col(0) print print sheet0.row_slice(0,1) print sheet0.row_slice(0,1,2) print sheet0.row_values(0,1) print sheet0.row_values(0,1,2) print sheet0.row_types(0,1) print sheet0.row_types(0,1,2) print print sheet1.col_slice(0,1) print sheet0.col_slice(0,1,2) print sheet1.col_values(0,1) print sheet0.col_values(0,1,2) print sheet1.col_types(0,1) print sheet0.col_types(0,1,2) 实用方法当围绕workbook进行操作的时候,把行和列转换成用户习惯看到的Excel单元格引用(如:(0,0)转换成A1),这是很有用的。下面提供的方法帮助我们实现它:
cellname方法把一对行和列索引转换为一个对应的Excel单元格引用。
cellnameabs方法把一对行和列索引转换为一个绝对的Excel单元格引用(如:$A$1)。
colname方法把一个列索引转换为Excel列名。
下面是这三个方法的示例: from xlrd import cellname, cellnameabs, colname print cellname(0,0),cellname(10,10),cellname(100,100) print cellnameabs(3,1),cellnameabs(41,59),cellnameabs(265,358) print colname(0),colname(10),colname(100) Unicode由xlrd产生的所有文本属性不是unidecode对象,就是ascii字符串(很少)。
由Microsoft Excel输入的每个文本都是下列编码之一:
其他知名软件用错误字符集或不用字符集写入Excel文件的情况是很少的。这种情况下,可能需要在open_workbook方法中指定正确的字符集。 from xlrd import open_workbook book = open_workbook('dodgy.xls',encoding='cp1252') 单元格的类型我们已经看过单元格类型用一个整数表示。这个整数相当于xlrd识别单元格类型的一组常数。可能的单元格类型在下面部分全部被列出来了。
Text 文本这是由xlrd.XL_CELL_TEXT常数表示的。
Number 数字这是由xlrd.XL_CELL_NUMBER常数表示的。
Date 日期这是由xlrd.XL_CELL_DATE常数表示的。 注意:日期在Excel文件中实际上是不存在的,它们只不过是特别格式化后的数字。
如果数字格式字符串看起来像日期,xlrd将会返回xlrd.XL_CELL_DATE作为单元格类型。
提供的xldate_as_tuple方法把日期单元格中的float数转化为适合实例化各种日期或时间对象的元组。这个例子展示了怎么使用它: from datetime import date,datetime,time from xlrd import open_workbook,xldate_as_tuple book = open_workbook('types.xls') sheet = book.sheet_by_index(0) date_value = xldate_as_tuple(sheet.cell(3,2).value,book.datemode) print datetime(*date_value),date(*date_value[:3]) datetime_value = xldate_as_tuple(sheet.cell(3,3).value,book.datemode) print datetime(*datetime_value) time_value = xldate_as_tuple(sheet.cell(3,4).value,book.datemode) print time(*time_value[3:]) print datetime(*time_value) 说明:
Boolean 布尔值这是由xlrd.XL_CELL_BOOLEAN常数表示的。
Error 错误这是由xlrd.XL_CELL_ERROR常数表示的。 from xlrd import open_workbook,error_text_from_code book = open_workbook('types.xls') sheet = book.sheet_by_index(0) print error_text_from_code[sheet.cell(5,2).value] print error_text_from_code[sheet.cell(5,3).value] 对一种明显显示所有单元格类型的简单方法,参看xlutils.display。
Empty/Blank 空值或空白Excel只是在单元格中存储信息,或者对单元格格式化。而xlrd是作为单元格的矩形网格表示。
Excel文件中没有任何信息的单元格由xlrd.XL_CELL_EMPTY常数表示。另外,只要有一个空值,用于xlrd后整个值是空串,所以空值单元格应该使用一种Python标识检查。
Excel文件中只有格式信息的单元格由xlrd.XL_CELL_BLANK常数表示,它的值总是一个空字符串。 from xlrd import open_workbook,empty_cell print empty_cell.value book = open_workbook('types.xls') sheet = book.sheet_by_index(0) empty = sheet.cell(6,2) blank = sheet.cell(7,2) print empty is blank, empty is empty_cell, blank is empty_cell book = open_workbook('types.xls',formatting_info=True) sheet = book.sheet_by_index(0) empty = sheet.cell(6,2) blank = sheet.cell(7,2) print empty.ctype,repr(empty.value) print blank.ctype,repr(blank.value) 下面例子展示了以上所有单元格类型一起的使用: from xlrd import open_workbook def cell_contents(sheet,row_x): result = [] for col_x in range(2,sheet.ncols): cell = sheet.cell(row_x,col_x) result.append((cell.ctype,cell,cell.value)) return result sheet = open_workbook('types.xls').sheet_by_index(0) print 'XL_CELL_TEXT',cell_contents(sheet,1) print 'XL_CELL_NUMBER',cell_contents(sheet,2) print 'XL_CELL_DATE',cell_contents(sheet,3) print 'XL_CELL_BOOLEAN',cell_contents(sheet,4) print 'XL_CELL_ERROR',cell_contents(sheet,5) print 'XL_CELL_BLANK',cell_contents(sheet,6) print 'XL_CELL_EMPTY',cell_contents(sheet,7) print sheet = open_workbook( 'types.xls',formatting_info=True ).sheet_by_index(0) print 'XL_CELL_TEXT',cell_contents(sheet,1) print 'XL_CELL_NUMBER',cell_contents(sheet,2) print 'XL_CELL_DATE',cell_contents(sheet,3) print 'XL_CELL_BOOLEAN',cell_contents(sheet,4) print 'XL_CELL_ERROR',cell_contents(sheet,5) print 'XL_CELL_BLANK',cell_contents(sheet,6) print 'XL_CELL_EMPTY',cell_contents(sheet,7) Names这些是很少使用但很强大的抽象方法,常用于查找Excel文件的内部信息。
它们有很多用途,xlrd能从它们之中获取信息。一个值得注意的例外是与sheet和宏命令相关的信息将会被忽略。
Names在Excel中是通过Insert > Name > Define操作创建的。如果你想使用xlrd来从Names中获取信息,在你选择的电子表格应用程序中精通names的定义和运用是一个不错的想法。
Types 类型一个Name可以涉及到:
CurrentInterestRate = 0.015
CurrentInterestRate = Sheet1!$B$4
MonthlySalesByRegion = Sheet2:Sheet5!$A$2:$M$100
Print_Titles = [row_header_ref, col_header_ref])
常数可以被获取。
绝对引用的坐标可以被获取,以便你稍后获取相关sheet的对应数据。
相对引用只有当你很熟悉被作为起源使用的单元格时是有用的。Excel文件中包含函数调用在内的公式和多重引用并不是有用的,也太难而无法评估。
xlrd中没有包含全部的计算引擎。
Scope 范围一个Name的Score可以是全局的,或者它只针对特定的sheet。一个Name的标识符在不同Scope内可以被重用。但有多个相同标识符的Name,根据scope使用最合适的一个。一个好例子是内置名为Print_Area;每个worksheet都可能有它们中的一个。
例:
一个单元格公式(1+rate)^20出现在Sheet1等价于1.015^20,出现在Sheet2等价于1.023^20,出现在其他Sheet等价于1.040^20。
惯例使用names的一般原因包括:
这里有个真实世界的案例:向总部报告。一个公司的总部制作了一个模版workbook。每个部门复制一份并填充内容。所有被提供的日期范围都定义了Names。当这些文件传回时,一个脚本用于验证这个部门是否损坏了这个workbook,这个Names用于获取数据来做进一步处理。使用names可以将这些范围解耦和,不管是总部设计模版的用户还是往模版里填充内容的部门用户 从这个脚本都只知道这些范围的names,而不知道具体的范围值。
在xlrd发布的examples目录中你会找到namesdemo.xls,有许多例子,大部分都是针对非苹果系统定义的names。也有个xlrdnamesAPIdemo.py文件展示了如何使用name查找字典,如何获取常数、引用和引用指向的数据。
格式化我们已经看到open_workbook方法有个参数从Excel文件加载信息。当这步完成,所有格式化信息都是可获得的,但是它是怎么实现的细节不再本书的范围内。
如果你想要复制格式化后的数据到一个新Excel文件中,参看xlutils.copy和xlutils.filter。 如果你想要检测格式化信息,你需要参考下面类的属性: xlrd.Book colour_map font_list format_list format_map
xlrd.sheet.Sheet cell_xf_index rowinfo_map colinfo_map computed_column_width standard_width
xlrd.sheet.Cell xf_index
Other Classes 另外,下面类是只用于表示格式化的信息:
操作大的Excel文件如果你在操作特别大的Excel文件,那么有两个你应该注意的xlrd特性:
下面的例子展示了一个大的workbook怎么去迭代被检查只匹配某一模式的sheet,并在内存中某个时间被卸载。 from xlrd import open_workbook book = open_workbook('simple.xls',on_demand=True) for name in book.sheet_names(): if name.endswith('2'): sheet = book.sheet_by_name(name) print sheet.cell_value(0,0) book.unload_sheet(name)
|
|
返回顶楼 | |
发表时间:2011-09-20
沙发,学习ing
|
|
返回顶楼 | |
发表时间:2011-10-05
谢谢。整理得非常不错。我很想知道,用xrld或者其它python的方法,往excel里插入一张图片或者链接呀?谢谢 |
|
返回顶楼 | |
发表时间:2011-10-12
hejibo 写道 谢谢。整理得非常不错。我很想知道,用xrld或者其它python的方法,往excel里插入一张图片或者链接呀?谢谢 你对xlrd理解有误解,xlrd是专门读取excel文件的,你要插入一张图片是写入,用xlwt或xlutils |
|
返回顶楼 | |
发表时间:2011-10-18
最后修改:2011-10-18
hejibo 写道
谢谢。整理得非常不错。我很想知道,用xrld或者其它python的方法,往excel里插入一张图片或者链接呀?谢谢
w = Workbook() ws = w.add_sheet('Image') ws.insert_bitmap('python.bmp', 2, 2) ws.insert_bitmap('python.bmp', 10, 2) w.save('image.xls') |
|
返回顶楼 | |
浏览 19791 次