Python处理Excel(四):自定义类处理Excel数据

完整代码如下,有时间再总结细节:

#coding=utf-8
import xlrd
import xlwt
from xlutils.copy import copy
from copy import deepcopy

class DataOutput_Helper:
	'''It's a data structure about scenario.
	   there are many methods provioded to make output the excel data easily'''

	def __init__(self,project,gvalue,lvalue,ip,mode,paraName,inputP,outputP,formula,scen):
		self.__project=project
		self.__gvalue=gvalue
		self.__lvalue=lvalue
		self.__ip=ip
		self.__mode=mode
		self.__paraName=paraName
		self.__inputP=inputP
		self.__outputP=outputP
		self.__formula=formula
		self.__scen=scen
		print self.__scen

	def get_scen_num(self):
		return len(self.__scen.keys())
	def get_scen_name(self):
		return self.__scen.keys()
	def get_rawdata_by_index(self,scenName,index):
			return [self.__ip[index],self.__mode[index],self.__paraName[index],self.__inputP[index],self.__outputP[index],self.__formula[index],				self.__scen[scenName]['param'][index],self.__scen[scenName]['period'][index]]
	def get_data_num(self,scenName):
			m=0
			for n in range(len(self.__scen[scenName]['param'])):
				if self.__scen[scenName]['param'][n]!='' or self.__scen[scenName]['period'][n]!='':
					m+=1
			return m
	def get_project_name(self):
			return self.__project
	def get_data_by_index(self,scenName,index):

			if self.__scen[scenName]['param'][index]=='' and self.__scen[scenName]['period'][index]=='':
				return None
			elif self.__mode[index]>1:
				master=self.__ip[index]+str(self.__mode[index])
			elif self.__mode[index]==1:
				master=self.__ip[index]
			paralist=[]
			for n in self.__scen[scenName]['param'][index].split(','):
				paralist.append(n.split('='))
			formula_re=self.__formula[index]
			for n in range(len(paralist)):
				formula_re=formula_re.replace(paralist[n][0],str(paralist[n][1]))
			for n in range(len(self.__gvalue)):
				formula_re=formula_re.replace(self.__gvalue[n][0],str(self.__gvalue[n][1]))
			for n in range(len(self.__lvalue)):
				formula_re=formula_re.replace(self.__lvalue[n][0],str(self.__lvalue[n][1]))
			return [master,formula_re,round(eval(formula_re),2)]

class readexcel:

	def __init__(self,filename='scenario.xls'):
		self.__filename__=filename
		self.__book__=xlrd.open_workbook(	filename,formatting_info=True)
		self.__sheetnames__=[]#sheet名字
		self.__VPparam__=[]
		self.__VPperiod__=[]
		self.__VRparam__=[]
		self.__VRperiod__=[]
		self.__gvalue=[]
		self.__lvalue=[]
		for i in self.__book__.sheet_names():
			if i.lower()=='config'or i.lower()=='bw':
				sheet=self.__book__.sheet_by_name(i)
				for row in range(0,sheet.nrows):
					for col in range(0,sheet.ncols):
		                ###-----------读取config参数---------------------------
						#-------读取变量定位符project,#key,#value,#formx x(0-~)
						if sheet.cell_type(row,col)==xlrd.XL_CELL_TEXT and sheet.cell_value(row,col).lower()=='project':
							projectName=sheet.cell_value(row,col+1)
						elif sheet.cell_type(row,col)==xlrd.XL_CELL_TEXT and sheet.cell_value(row,col).lower()=='#key':
							#--------读取全局参数key-value对
							for key_row in range(row+1,sheet.nrows):
								if sheet.cell_value(key_row,col)!='':
									self.__gvalue.append([sheet.cell_value(key_row,col),sheet.cell_value(key_row,col+1)])
						elif sheet.cell_type(row,col)==xlrd.XL_CELL_TEXT and sheet.cell_value(row,col).lower()=='#form':
							#--------读取表格参数formx 自动判定宽度和高度
							formx_width=1
							formx_height=1

							for formx_col in range(col,sheet.ncols):
								if sheet.cell_value(row+2,formx_col)=='':
									formx_width=formx_col-col
									break
								elif formx_col==sheet.ncols-1:
									formx_width=formx_col-col+1
							#print 'w',formx_width
							for formx_row in range(row+1,sheet.nrows):
								if sheet.cell_value(formx_row,col)=='':
									formx_height=formx_row-row
									break
								elif formx_row==sheet.nrows-1:
									formx_height=formx_row-row
							#print 'h',formx_height
							#----------将表格数据读入__formx__
								if sheet.cell_value(formx_row,col+2)!='':
									self.__lvalue.append([sheet.cell_value(formx_row,col+2),sheet.cell_value(formx_row,col+1)])
				###-----------读取BW参数---------------------------
						elif sheet.cell_type(row,col)==xlrd.XL_CELL_TEXT and sheet.cell_value(row,col).lower()=='ip':
							ip=[]
							i=0
							for r in range(row+1,sheet.nrows):
								if sheet.cell_value(r,col)=='':
									ip.append(ip[i-1])
								else:
									ip.append(sheet.cell_value(r,col))
								i+=1
						elif sheet.cell_type(row,col)==xlrd.XL_CELL_TEXT and sheet.cell_value(row,col).lower()=='mode':
							mode=[]
							i=0
							for r in range(row+1,sheet.nrows):
								if sheet.cell_value(r,col)=='':
									mode.append('N/A')
								else:
									mode.append(sheet.cell_value(r,col))
								i+=1
						elif sheet.cell_type(row,col)==xlrd.XL_CELL_TEXT and sheet.cell_value(row,col).lower()=='param'and sheet.cell_value(row,col-1)=='Mode':
							paramName=[]
							i=0
							for r in range(row+1,sheet.nrows):
								if sheet.cell_value(r,col)=='':
									paramName.append('N/A')
								else:
									paramName.append(sheet.cell_value(r,col).split(','))
								i+=1
						elif sheet.cell_type(row,col)==xlrd.XL_CELL_TEXT and sheet.cell_value(row,col).lower()=='input':
							inputP=[]
							i=0
							for r in range(row+1,sheet.nrows):
								if sheet.cell_value(r,col)=='':
									inputP.append('N/A')
								else:
									inputP.append(sheet.cell_value(r,col))
								i+=1
						elif sheet.cell_type(row,col)==xlrd.XL_CELL_TEXT and sheet.cell_value(row,col).lower()=='output':
							outputP=[]
							i=0
							for r in range(row+1,sheet.nrows):
								if sheet.cell_value(r,col)=='':
									outputP.append('N/A')
								else:
									outputP.append(sheet.cell_value(r,col))
								i+=1
						elif sheet.cell_type(row,col)==xlrd.XL_CELL_TEXT and sheet.cell_value(row,col).lower()=='bw formula':
							formula=[]
							i=0
							for r in range(row+1,sheet.nrows):
								if sheet.cell_value(r,col)=='':
									formula.append('N/A')
								else:
									formula.append(sheet.cell_value(r,col))
								i+=1
						##***********************************Scen数据结构***************************************************##
						## 存储IP的结构:  1.Scen名字   2.参数  3.时间  {'name':{'param':[xx,xx,xx],'period':[xx,xx,xx]},.....}
						##Exp:{u'Video Recoding': {'period': [33.0, ], 'param': [u'arg1=3', ]}, }
					        ##
						##*************************************************************************************************##
						elif sheet.cell_type(row,col)==xlrd.XL_CELL_TEXT and sheet.cell_value(row,col).lower()=='#sce':
							scen={}
							for c in range(col+1,sheet.ncols):
										if sheet.cell_value(row,c)!='':
											for c1 in range(c,c+2):
													for r in range(row+2,sheet.nrows):
														if c1==c:
															self.__VPparam__.append(sheet.cell_value(r,c1))

														elif c1==c+1:
															self.__VPperiod__.append(sheet.cell_value(r,c1))

											scen.setdefault(sheet.cell_value(row,c),{}).__setitem__('param',self.__VPparam__[:])
											scen.setdefault(sheet.cell_value(row,c),{}).__setitem__('period',self.__VPperiod__[:])
											del self.__VPparam__[:]
											del self.__VPperiod__[:]

		#******************************绘制表格**************************************************************#

		self.__Wbook__=copy(self.__book__)
		#self.__Wbook__=xlwt.Workbook()
		xlwt.add_palette_colour('style1',22)
		self.__Wbook__.set_colour_RGB(22,189,183,107)
		xlwt.add_palette_colour('style2',23)
		self.__Wbook__.set_colour_RGB(23,25,25,112)
		xlwt.add_palette_colour('style3',24)
		self.__Wbook__.set_colour_RGB(24,240,230,140)
		style1 = xlwt.easyxf('pattern: pattern solid, fore_colour style1,back_colour black;'
					      'font: colour style2, bold True;'
						'borders: left 0x0d , right 0x0d, top 0x0d, bottom 0x0d;'
						'alignment: horz center,vert center')
		style2 = xlwt.easyxf(
					      'font: colour style2, bold False;'
						'borders: left 0x0d,left_colour black , right 0x0d, top 0x0d, bottom 0x0d;'
						'alignment: horz center,vert center')
		style3 = xlwt.easyxf('pattern: pattern solid, fore_colour style3,back_colour black;'
					      'font: colour style2, bold True;'
						'borders: left 0x0d , right 0x0d, top 0x0d, bottom 0x0d;'
						'alignment: horz center,vert center')

		bw=DataOutput_Helper(projectName,self.__gvalue,self.__lvalue,ip,mode,paramName,inputP,outputP,formula,scen)
		#print bw.get_scen_name()
		for n in bw.get_scen_name():#scen
			sheet=self.__Wbook__.add_sheet(n,cell_overwrite_ok=True)
			#构建表格,构建固定位置内容
			sheet.write(0,0,'Scenario\n'+n,style1)
			sheet.row(0).height=550
			sheet.col(0).width=4000
			sheet.col(4).width=4000
			sheet.write_merge(0,0,1,6,'BW Requirement',style1)

			for k in range(bw.get_data_num(n)):
				sheet.row(2+k).height=800
			sheet.write(1,1,'Master',style1)
			sheet.write_merge(1,1,2,3,'BW(MB/s)',style1)
			sheet.write(1,5,'Master',style1)
			sheet.write(1,6,'BW(MB/s)',style1)
			#print n
			total=0
			for m in range(bw.get_data_num(n)):#ip number
				#print m
				master,BW,Result=bw.get_data_by_index(n,m)
				print bw.get_data_by_index(n,m)
				for l in [1,5]:
					sheet.write(2+m,l,master,style3)
				sheet.write(2+m,2,BW,style3)
				sheet.write(2+m,6,'',style3)
				sheet.write(2+m,3,Result,style3)
				total=total+Result
			sheet.write_merge(1,bw.get_data_num(n)+2,0,0,bw.get_project_name()+'\n estimate \nBW(MB/s)',style2)
			sheet.write_merge(1,bw.get_data_num(n)+2,4,4,bw.get_project_name()+'\n simulation \nBW(MB/s)',style2)
			#填写Total
			for t in [1,5]:
				sheet.write(bw.get_data_num(n)+2,t,'Total',style3)
				sheet.write(bw.get_data_num(n)+2,t+1,'',style3)
			sheet.write(bw.get_data_num(n)+2,3,total,style3)#计算总和
			sheet.col(2).width=17000  #BW formula
		self.__Wbook__.save(filename)
n=readexcel()
时间: 2024-10-10 17:43:27

Python处理Excel(四):自定义类处理Excel数据的相关文章

Python 进阶(四)类的继承

继承一个类 如果已经定义了Person类,需要定义新的Student和Teacher类时,可以直接从Person类继承: class Person(object): def __init__(self, name, gender): self.name = name self.gender = gender 定义Student类时,只需要把额外的属性加上,例如score: class Student(Person): def __init__(self, name, gender, score)

EXCEL中自定义格式输入的数据怎么完整复制

在用设置单元格式里 自定义 输入数值 如图,B列的数据,我复制后,用选择性粘贴到别的地方,还是无法将75FG4Y2一起复制过去,只能复制过去FG 怎么办? ===>先把这些复制到一个记事本里,再复制回来. 原文地址:https://www.cnblogs.com/sinceret/p/11504178.html

导出excel(利用工具类导出excel)

/** * 添加导出功能 * @param creditPageResult * @param request * @param response */ @RequestMapping(value = "export") public void export(CreditPageResult creditPageResult, HttpServletRequest request, HttpServletResponse response) { creditPageResult.set

python基础教程总结6——类

1. 如何定义一个类 在进行python面向对象编程之前,先来了解几个术语:类,类对象,实例对象,属性,函数和方法. 类是对现实世界中一些事物的封装,定义一个类可以采用下面的方式来定义: [python] view plaincopy class className: block 注意类名后面有个冒号,在block块里面就可以定义属性和方法了.当一个类定义完之后,就产生了一个类对象.类对象支持两种操作:引用和实例化.引用操作是通过类对象去调用类中的属性或者方法,而实例化是产生出一个类对象的实例,

反射+自定义注解---实现Excel数据列属性和JavaBean属性的自动映射

简单粗暴,直奔主题.   需求:通过自定义注解和反射技术,将Excel文件中的数据自动映射到pojo类中,最终返回一个List<pojo>集合? 今天我只是通过一位使用者的身份来给各位分享一套超级可以的POI"工具",这套工具我只是第一个使用者,创作者是我的朋友,他喜好钻研底层和算法,擅长计算机软硬件,在我心里他一直是神一样的存在,每天晚上10点后我才能看到他,因为他每天需要加班,需要有更多时间能够学习,唉,这种毅力和耐力,我是真的羡慕,因为我也一直在努力,能够得到更多的东

python学习笔记-day7-2-【python从mysql数据库导数据到excel,读excel,修改excel】

这节说下如何用python把数据库里的数据导出到excel里,并如何读取excel, 修必excel等操作. 一.用python把数据库里的数据导出到excel里 1.导入如下的模块,没有的话需要安装 import pymysql #mysql连接模块import xlwt #写excel的第三方库 从数据库导数据,写到excel文件里 import pymysql,xlwt def export_excel(table_name): import pymysql host, user, pas

python 第三方包之xlwt 转换成excel

简介 xlrd是python的一个第三方模块,可以实现跨平台读Microsoft Excel文件.(它有一个兄弟叫xlwt,专注于写Excel文件.) 它并不像win2com那样借助COM技术来访问Excel,而是直接分析Excel文件格式,从中解析数据.因此你可以在任何支持python的平台上使用excel文件.这一点它比win2com要优秀得多. 另外,它对unicode支持的很好,这也是我青睐它的重要原因. 它的工作原理所限,我们不能期望它覆盖Excel全部的功能,访问到全部的数据. 比如

下载数据到Excel,工具类

使用反射将model数据下载到Excel中 package test.upload.utils; import java.lang.reflect.Method;import java.math.BigDecimal;import java.text.SimpleDateFormat;import java.util.Date;import java.util.List;import java.util.Map; import org.apache.poi.hssf.usermodel.HSSF

powerdesigner由excel导入到类图中

最近在使用pd过程中,遇到一个问题,就是类的字段,方法,类型在excel中整理好了,想导入到pd直接生成类图.网上有很多生成实体表的方法,于是自己模仿写了一个生成类图的,在pd中的工具--扩展--脚本,或者直接快捷键shift + ctrl + X 打开脚本窗口,执行以下代码即可 Option Explicit Dim mdl 'Set mdl = ActiveModelIf (mdl Is Nothing) Then MsgBox "There is no Active Model"