xlwt缺点:
- 版本
只能处理Excel97-2003或Excel 97之前版本的xls格式 - 存储数据过大
存储数据过大时,会报错Exception: String longer than 32767 characters
OpenPyXL可以解决以上情况,OpenPyXL缺点:
- 读取xls格式时load_workbook函数utf-8报错
下载:链接http://pan.baidu.com/s/1dFF8jVN 密码qkpp
安装:命令行进入setup.py目录下,运行以下命令python setup.py install
操作文件与表
import openpyxl
# 操作excel
wb = openpyxl.Workbook() #创建excel
wb2 = openpyxl.load_workbook(path) #打开现有的excel
# 创建表
ws = wb.active #正在运行的工作表
ws1 = wb.create_sheet() #末尾插入表
ws2 = wb.create_sheet(0) #插在第一个位置
ws3 = wb["New Title"] #根据名称获得表
ws4 = wb.get_sheet_by_name("New Title") #根据名称获取表
print wb.get_sheet_names() #得到所有工作表
# 为表命名
ws.title = "New Title" #创建时系统自定命名
#循坏所有的工作表
for sheet in wb:
print sheet.title
操作数据
一个工作表被创建时,其中不包含单元格,只有当单元格被获取时才被创建
openpyxl里第一行第一列索引为1,1(即从1开始,不是从0开始)
# 行列数
len(ws.rows) #行数
len(ws.columns) #列数
# 读
c = ws['A4']
c = ws.cell('A4')
c = ws.cell(row = 4, column = 2)
cell_range = ws['A1':'C2'] #使用切片获取多个单元格
#获取多个单元格并遍历
for row in ws.iter_rows('A1:C2'):
for cell in row:
print cell
#迭代文件中所有的行
for row in ws.rows: #取一行
for cell in row: #一行中一个一个取
print cell
#得带文件中所有的列
ws.colums
# 写
ws['A4'] = 4
# 有openpyxl.cell.Cell,可以直接为该单元赋值
c.value = 'Hello,world'
c.value = '15%' #其他类型
c.value = datetime.datetime.now()
保存
# 覆盖掉原文件
wb.save(path)
# True时文件保存为模板
wb = load_workbook('doc.xlsx')
wb.save('doc_template.xltx',as_template=True)
# False时文件或模板保存为文件
wb = load_workbook('doc.xltx')
wb = load_workbook('doc_template.xltx') #或者
wb.save('doc.xlsx',as_template.False)
异常错误
以上是网上用法集合,以下是博主遇到的一些问题,及解决方法
获取行数
len(sheet1.rows)
,报错TypeError: object of type 'generator' has no len()
#获取行数 rows = tuple(sheet1.rows) len(rows)
文件路径有中文,报错
IOError: [Errno 2] No such file or directory: '\xe9\x81\x93\xe8\xb7\xaf_POI.xlsx'
,读取错误#解决方案,中文部分在外面用u编码,使用%s传进路径,成功 TYPE = u'道路' #中文部分使用u编码 EXCEL_PATH = r'G:\workspace\python\arcpy\citywalker\%s_POI.xlsx'% TYPE #使用%s代替中文形成路径
常用方法
以下是博主用到的方法:
获取第一个sheet
excel = openpyxl.load_workbook(path) sheetnames = excel.get_sheet_names() name = sheetnames[0] sheet1 = excel.get_sheet_by_name(name)
获得行数
rows = tuple(sheet1.rows) len(rows)
获取第一列或列
# 获取第一列 for row in sheet1.rows: print row[0].value # 获取第一行 for col in sheet1.columns: print col[0].value # 获取第一行,法二 ncols = len( tuple(table.columns) ) for i in range(0, ncols): print table.cell(row = 1,column = i+1).value