本文章的主要目的在于:
- import xlrd
- book = xlrd.open_workbook("myfile.xls") # 打开文件
- print("The number of worksheets is {0}".format(book.nsheets)) # nsheets 是Excel中有多少个sheet
- print("Worksheet name(s): {0}".format(book.sheet_names())) # sheets的名字
- sh = book.sheet_by_index(0) # 拿到第一个sheet ** 注意xlrd中开始都是从0
- print("{0} {1} {2}".format(sh.name, sh.nrows, sh.ncols)) # 本sheet的名字,行数,列数
- print("Cell D30 is {0}".format(sh.cell_value(rowx=29, colx=3))) # d30单元格中的值
- for rx in range(sh.nrows):
- print(sh.row(rx)) # 遍历每一行,打印每一个值。每个row是一个列表
wb = xlrd.open_workbook("myfile.xls")
其中还有一个重要参数:formatting_info,该参数默认为 False,当打开时会保留 xls 文件的格式和样式信息。在 row_values 中有体现。在 xlutils 中用的更多。
file_contents:第二种打开方式。顾名思义是文件的二进制流,最大的用处在于服务端接收到文件后无需转存直接进行读取操作。例子:
wb = xlrd.open_workbook(file_contents=f.read(), formatting_info=True) # f 是打开的文件句柄
wb = xlrd.open_workbook(file_contents=request.FILE.get('file',''), formatting_info=True) # 模拟视图函数
sh = book.sheet_by_index(0)
- ws = wb.get_sheet(0)
- ws = wb.sheet_by_name('sheet1')
- ws = wb.get_sheets()[0]
- ws = wb._sheet_list[0] # 当以file_content方式打开上边的方式都会报错,因为已经把所有sheets load进来了。
- ws.row_values(row_num) #另一个常用的遍历方式,获得某一行的单元格数据。
merged_cells 是一个列表来展示所有被合并的单元格。比如:[(0, 1, 0, 3), (1, 2, 0, 3)]
这里诡异的是:其中的数字表示的以文件左上角为 0,0 的坐标上的数值。使用需注意。
最后:xlrd 比较古老,本来只支持 xls 格式的 Excel 文件,现在也能读取 xlsx 文件的数据,但是不能使用 formatting_info 功能。
- import xlwt
- wb = xlwt.Workbook()
- ws = wb.add_sheet('sheet1') # sheet1 是第一个sheet的名称
- ws.write(0, 0, 'test', style1) # 在第0行的第0列写入 其中的style1是下面介绍的样式
- ws.write_merge(1, 2, 0, 25, u'合并单元格', style1) # 将第一行中的25列个单元格合并写入
- wb.save('test2.xls')
- # wb.save('test.xlsx') # 可以生成xlsx文件
写一个 Excel 文件需要的参数上面不是很多,但是往往在样式设计上要求较高。
- alignment = xlwt.Alignment() # 初始化一个居中对象
- alignment.horz = xlwt.Alignment.HORZ_CENTER # 水平和左右的居中
- alignment.vert = xlwt.Alignment.VERT_CENTER
- borders = xlwt.Borders()
- borders.left = 1 # 边框的宽度
- borders.right = 1
- borders.top = 1
- borders.bottom = 1
- borders.bottom_colour = 0x3A # 具体的颜色设计可百度255中颜色的十六进制的表示
- pattern = xlwt.Pattern()
- pattern.pattern = Pattern.SOLID_PATTERN # 设置其模式为实型
- pattern.pattern_fore_colour = 22 # 这里的22位灰
- fn1 = xlwt.Font()
- fn1.bold = False # 加粗
- fn1.name = u'宋体' # 字体
- fn1.height = 280 # 大小 字体的大小会影响到行高
- hang1 = ws.col(0) # 拿到一列并设置宽度
- hang1.width = 256 * 20
- tall_style = xlwt.easyxf('font:height 400;')
- hang_sale = ws.row(0) # 拿到一行设置高度
- hang_sale.set_style(tall_style)
将上述的样式封装成一个 style。
style1 = xlwt.XFStyle()
style1.font = fn1 # 同理其他的样式以这种方式设置
在 Excel 表格的模块中本质上都不支持的 Excel 的直接修改,都是先读取后写入的形式来实现。故在修改的过程中会出现诸多的 bug,比如样式的丢失。
- from xlutils.copy import copy
- rb = open_workbook('test.xls)
- wb = copy(rb)
之后的操作便于 xlwt 别无差别了。但是在修改的时候一般都不想主动的修改 Excel 的样式。这里,xlrd 中的 formatting_info 参数便很关键了。即使如此,在我的实践中仍存在某些单元格的边框的样式自动丢失的情况,有待解决!
总结:上述的三兄弟是比较常用的 Excel 处理模块,若是没有太高的需求一般足够用了。但是这三兄弟目前只是更加针对 xls 文件,其实在格式转化 xlsx 文件的时候无能为力。要是遇到像 xlsx 文件的修改等需求的时候,xlutils 会将 xlsx 源文件输出成为没有任何格式的 xlsx 文件。所以下面介绍 openpyxl 模块是只使用于 xlsx。(xls 读都读不了)
- book = openpyxl.load_workbook('2.xlsx')
- ws = book.worksheets[0]
- aa = ws.rows
- print next(aa)[0].value # 也可以用等于进行设置值
- book.save('test.xlsx')
openpyxl 的用法大致和 xl 三兄弟一致,但是在功能上要多一些,所以效率上要差一些。在只进行读取操作的时候可以加上 read_only 的参数。
如开头链接给出的对比一样,功能最完善的自然是 Windows 的 api 了。毕竟这个东西就是人家出的。但是缺点也是最明显的:
1. 无法跨平台,只适用 Windows 系统,还得有 Excel 程序。
2. 过程中占用 Excel 程序,不注意会造成和 wps 等程序的冲突。
3. 十分缓慢
- from win32com.client import Dispatch, DispatchEx
- xlApp = Dispatch('Excel.Application') # 会在打开Excel的基础上进行,没有就打开
- xlBook = xlApp.Workbooks.Open(r'C:\Users\PycharmProjects\windOFapi\1242.xlsx', ) # 这里要写全路径,否则加载到Windows系统中报错
- sht = xlBook.Worksheets('sheet1')
- req = sht.Cells(4, 3).value
- print req
下面的两个 openpyxl 和 pywin32 模块用的较少,掌握不多,不敢多写。
来源: http://www.cnblogs.com/khal-Cgg/p/7281167.html