您的位置:首页 > 编程语言 > Python开发

Python之操作Excel文件

2016-07-21 10:35 295 查看
本操作都是基于xlrd和pyExcelerator库对excel文件进行操作的

#!/usr/bin/env python
# -*- encoding: utf-8 -*-
# __author__ = 'vinman'

import xlrd
import pyExcelerator
import os
import sys
reload(sys)
sys.setdefaultencoding('utf8')

class ExcelRead(object):
"""
通过外部库xlrd操作Excel表格文件
目前只有读操作(没有写操作)
默认是打开第一个Excel文件里面的第一个表
"""
def __init__(self, filename):
try:
self.workbook = xlrd.open_workbook(filename)
except:
print('No such file or directory: %s' % filename)
return
self.select_sheet_by_index(0)

@property
def get_sheets_count(self):
return self.workbook.nsheets

def select_sheet_by_index(self, num):
"""
通过下标索引选择表
"""
count = self.get_sheets_count
if num >= count:
print ('此Excel文件只有%s个表,没有索引为%s的表' % (count, num))
return False
self.sheet = self.workbook.sheets()[num]
# self.sheet = self.workbook.sheet_by_index(num)
return True

def select_sheet_by_name(self, sheetname):
"""
通过表名来选择表
"""
try:
self.sheet = sheet_by_name(sheetname)
return True
except XLRDError:
print (u'没有找到名为%s的表' % sheetname)
return False

@property
def get_rows_count(self):
"""
作为一个属性,不能使用函数的调用方式get_rows_count()
获取行数数
"""
return self.sheet.nrows

@property
def get_cols_count(self):
"""
作为一个属性,不能使用函数的调用方式get_cols_count()
获取列数
"""
return self.sheet.ncols

def get_row(self, row):
"""
获取一行的数据,行数是从1开始
返回一个列表
"""
if row < 1 or row > self.get_rows_count:
print (u'要获取的行参数有误')
return None
return self.sheet.row_values(row-1)

def get_col(self, col):
"""
获取一列的数据,列数是从1或'A'开始
返回一个列表
"""
if isinstance(col, str):
col = ord(col)
if col >= 65 and col <= 90:
col -= 64
else:
col -= 96
if col < 1 or col > self.get_cols_count:
print (u'要获取的列参数有误')
return None
return self.sheet.col_values(col-1)

def get_cell(self, row, col=None):
"""
获取单元格的值
excel.get_cell('C18')
excel.get_cell('c18')
excel.get_cell(18, 'C')
excel.get_cell(18, 'c')
excel.get_cell(18, 3)
"""
if col is None and isinstance(row, str):
col = row[0]
row = int(row[1:])
if row < 1 or row > self.get_rows_count:
print (u'要获取的单元格参数[行号]有误')
return None
if isinstance(col, str):
col = ord(col)
if col >= 65 and col <= 90:
col -= 64
else:
col -= 96
if col < 1 or col > self.get_cols_count:
print (u'要获取的列参数[列号]有误')
return None
return self.sheet.cell_value(row-1, col-1)
# return self.sheet.row(row-1)[col-1].value
# return self.sheet.col(col-1)[row-1].value

class ExcelWrite(object):
"""
通过外部库pyExcelerator操作Excel表格文件
目前只有写操作(没有读操作)
实例化对象可以传入文件名也可以不传入文件名,不传入就要显式调用save(filename)进行保存
传入或者保存的文件名不能是已存在的(为防止覆盖,对存在的文件不进行保存)
同名无效
"""
def __init__(self, filename=None):
self.workbook = None
self.filename = filename
self.sheet_list = []
self.isSave = False # 用来标识是否已经显式执行过save()了
self.isExist = False # 用来标识是否已经存在同名文件
if self.filename is None:
print (u'请显式调用save(filename)进行保存')
elif os.path.exists(self.filename):
print (u'文件%s已存在,为防止覆盖文件,请更换文件名' % self.filename)
self.filename = None
self.isExist = True
return
else:
print (u'无需显式调用save(filename)保存,对象在释放时会自动保存为%s' % self.filename)
self.create_workbook()

def __del__(self):
"""
析构函数,当没有显式执行过save()并且文件名非空且不是同名文件时会执行保存函数
"""
if self.filename is not None and self.isSave is False:
self.save()

def create_workbook(self):
"""
创建一个工作簿,在实例化中会自动创建
"""
if self.isExist:
return
if self.workbook is None:
self.workbook = pyExcelerator.Workbook()

def add_sheet(self, sheetname=None):
"""
添加一张表到工作簿
注:不能同名,可以不带名(默认为Sheet1,Sheet2,Sheet3...)
同名无效
"""
if self.workbook is None:
self.create_workbook()
isExist = False # 用来标识是否存在同名的Sheet,True表示存在
if sheetname is None:
sheetname = 'Sheet' + str(len(self.sheet_list)+1)
if sheetname in self.sheet_list:
print (u'已存在名为%s的Sheet,请更改sheet名' % sheetname)
isExist = True
sheet = Sheet(self.workbook, sheetname, isExist)
if isExist is False:
self.sheet_list.append(sheetname)
return sheet

def save(self, filename=None):
"""
保存工作簿到文件
同名无效
"""
if self.isExist:
return
if filename is None:
if self.filename is None:
print (u'请输入文件名进行保存')
return False
else:
filename = self.filename
else:
if os.path.exists(filename):
print (u'当前文件已存在,为防止覆盖文件,请更换文件名进行保存')
return False
if len(self.sheet_list) > 0:
self.workbook.save(filename)
print (u'保存成功,共创建了%d张表,实际保存在%s' % (len(self.sheet_list), filename))
self.isSave = True
return True
else:
print (u'没有创建工作表,无法进行保存')
self.isSave = True
return False
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Python excel