以下是工作中用python来处理excel文件里的信号学习内容的代码
由于代码可读性很差,不建议作为excel通用处理类的参考
from collections import namedtuple
import xlrd
import xlwt
from xlwt.compat import basestring
class Excel(object):
# 1.初始化
def __init__(self,filename):
self.filename = filename
self.workbook = xlrd.open_workbook(self.filename)
self.sheets = self.workbook.sheet_names()
self.sheets_cache = {}
self.cells = []
self.vamip = {} # {"VAM1" : ip1, "VAM2" : ip2}
self.wk_vam_out = {} # 工位口对应的VAM和OUT {"wk1" : [(VAM1,1), (VAM2,1)]}
self.wk_names = [] # 工位口列表
self.init()
# 2.初始化函数
def init(self):
for name in self.sheets:
self.sheets_cache[name] = self.read_sheet(name)
for row_data in self.sheets_cache[SHEET_VAMOUT]:
if row_data.VAMNAME not in self.vamip:
self.vamip[row_data.VAMNAME] = row_data.VAMIP
vam_out = (row_data.VAMNAME,row_data.OUTPORT)
wk = row_data.OUTCABLE
if wk and wk not in self.wk_vam_out:
self.wk_vam_out[wk] = [vam_out]
elif wk and vam_out not in self.wk_vam_out[wk]:
self.wk_vam_out[wk].append(vam_out)
self.wk_names = self.wk_vam_out.keys()
for row_data in self.sheets_cache[SHEET_VAMIN]:
self.cells.append(row_data)
# 3.读取标签页
def read_sheet(self,sheet_name):
"""
# 读取excel标签页内容
:param sheet_name: sheet名字
:return: nametuple列表
"""
lines = []
if sheet_name == SHEET_VAMOUT:
title_cn = TITLE_OUT
elif sheet_name == SHEET_VAMIN:
title_cn = TITLE_IN
else:
return lines
sht = self.workbook.sheet_by_name(sheet_name)
nrows = sht.nrows
print(sheet_name,nrows)
titles = self.lst_strip(sht.row_values(0))
titles = [title_cn[field] for field in titles]
row = namedtuple("ROW",titles)
for row_idx in range(1,nrows):
data = sht.row_values(row_idx,start_colx=0,end_colx=len(titles))
data = self.lst_strip(data)
row_data = row(*data)
lines.append(row_data)
return lines
# 4.查询strip
def lst_strip(self,lst):
_lst = [item.strip() if isinstance(item,basestring) else item for item in lst]
_lst = [item if item else ''for item in _lst]
return _lst
# 5.获取sheet内容
def sheet(self,sheet_name):
"""
获取sheet内容
:param sheet_name:sheet名字
:return: nametuple列表
"""
if sheet_name not in self.sheets_cache:
self.sheets_cache[sheet_name] = self.read_sheet(sheet_name)
return self.sheets_cache[sheet_name]
# 6.vam列表
def cell_in_vam(self,vam_names):
"""
:param vam_names: VAM列表
:return: nametuple列表
"""
rows = []
for vam_name in vam_names:
for cell in self.cells:
if vam_name == cell.VAMNAME:
rows.append(cell)
# 7.vam名字
def vam_ip(self,vam_name):
"""
:param vam_name:VAM名字
:return: VAM IP
"""
return self.vamip[vam_name]
# 8.获取vam名字列表
def vams(self):
"""
获取所有vam名字列表
:return: 包含所有VAM的list
"""
return sorted(self.vamip.keys())
# 9.获取小区名字
def get_cell_by_cellname(self,cell_name):
"""
:param cell_name:小区名
:return: 包含小区信息的nametuple
"""
for cell in self.cells:
if cell.CELLNAME == cell_name:
return cell
# 10.获取小区信息
def get_cell_by_vamin(self,vam,inport):
"""
:param vam:vam名字
:param inport: IN口
:return: 包含小区信息的nametuple
"""
for cell in self.cells:
if cell.VAMNAME == vam and int(cell.INPORT) == int(inport):
return cell
return None
# 11.工位口
def get_vam_out_by_workstation(self,wk):
"""
:param wk:工位口
:return: [(VAM1,1),(VAM2,1)]
"""
ret = []
for wk_name in self.wk_names:
if wk not in wk_name:
continue
vam_out = self.wk_vam_out[wk_name]
for vo in vam_out:
if vo in ret:
continue
ret.append(vo)
return ret