source: CMIP6dreqbuild/trunk/src/framework/ing02/utils_wb.py @ 1149

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/src/framework/ing02/utils_wb.py@1206
Revision 1149, 10.2 KB checked in by mjuckes, 22 months ago (diff)

release cand

Line 
1import string, itertools
2import xlrd, string, shelve, os, re, sys
3import collections
4import xlutils, xlwt
5import xlutils.copy
6import xlutils.styles
7import copy
8####
9
10nt__deckrq = collections.namedtuple( 'dckrq', ['control','AMIP','abrupt4xCO2','rq_1pctCO2','historical'] )
11dd_rq = collections.defaultdict( dict )
12dd_tbl = collections.defaultdict( int )
13def uniCleanFunc(ss,jsFilt=False):
14      if type(ss) in [type('x'),type(u'x')]:
15          ss = string.replace( ss, u'\u2013', '-' )
16          ss = string.replace( ss, u'\u2010', '-' )
17          ss = string.replace( ss, u'\u2018', "'" )
18          ss = string.replace( ss, u'\u201c', "'" )
19          ss = string.replace( ss, u'\u201d', "'" )
20          ss = string.replace( ss, u'\u2019', "'" )
21          ss = string.replace( ss, u'\u2009', " " )
22          ss = string.replace( ss, u'\u2026', '...' )
23          ss = string.replace( ss, u'\u25e6', 'o' )
24          ss = string.replace( ss, u'\xfc', 'u' )
25          ss = string.replace( ss, u'\xad', '-' )
26          ss = string.replace( ss, u'\xb1', '+-' )
27          ss = string.replace( ss, u'\xb2', '2' )
28          ss = string.replace( ss, u'\xb0', 'o' )
29          ss = string.replace( ss, u'\xb3', '3' )
30          if jsFilt:
31            ss = string.replace( ss, '"', "'" )
32            ss = string.replace( ss, '\n', ";;" )
33          return ss
34      else:
35          return ss
36   
37
38class wbcp(object):
39  def __init__( self, inbook=None ):
40    self.book = xlrd.open_workbook(inbook,formatting_info=True)
41    self.sns = self.book.sheet_names()
42    self.wb = xlutils.copy.copy(self.book)
43    ##self.book = xlrd.open_workbook(inbook,formatting_info=True)
44    self.plain = xlwt.easyxf('')
45    self.styles = xlutils.styles.Styles(self.book)
46
47
48  def styleUpdate(self,other):
49    self.styles.cell_styles.update( other.styles.cell_styles )
50  def _getOutCell(self, rowIndex, colIndex,stbk=None):
51    """ HACK: Extract the internal xlwt cell representation. """
52   
53    if stbk == None:
54      this = self
55    else:
56      this = stbk
57    row = this.currentSo._Worksheet__rows.get(rowIndex)
58
59    if not row: return None
60
61    cell = row._Row__cells.get(colIndex)
62    return cell
63
64  def rowValues(self, i, f=None, uniClean=False, jsFilt=False ):
65    if f == None:
66      v1 = map( lambda x: x.value, self.currentSi.row(i) )
67    else:
68      v1 = map( lambda x: f(x.value), self.currentSi.row(i) )
69    if not uniClean:
70      return v1
71    else:
72      return map( lambda x: uniCleanFunc(x,jsFilt=jsFilt), v1 )
73
74  def putValue2(self, row, col, value,sti=None,stj=None,stbk=None,style=0):
75    """ Change cell value without changing formatting. """
76    # HACK to retain cell style.
77    if sti == None:
78      sti = col
79    if stj == None:
80      stj = row
81    self.previousCell = self._getOutCell( stj,sti,stbk=stbk )
82    # END HACK, PART I
83
84    if style==0:
85      self.currentSo.write(row, col, value)
86    else:
87      self.currentSo.write(row, col, value,style=style)
88
89    # HACK, PART II
90
91    do_style = False
92    if self.previousCell and style==0 and do_style:
93        self.newCell = self._getOutCell( row, col)
94        if self.newCell:
95          if stbk == None:
96            self.newCell.xf_idx = self.previousCell.xf_idx
97          else:
98            self.newCell.xf_idx = self.previousCell.xf_idx
99            ##nn = len( self.styles.cell_styles.keys() )
100            ##print stj,sti,self.previousCell.xf_idx, nn
101            ##self.styles.cell_styles[nn] = stbk.styles.cell_styles.items()[self.previousCell.xf_idx]
102            ##self.newCell.xf_idx = nn
103    # END HACK
104
105  def focus( self, name, old=None ):
106    if old == None:
107      oname = name
108      new=False
109    else:
110      oname = old
111      new = True
112   
113    if oname not in self.sns:
114      print '%s not in %s' % (oname,str(self.sns) )
115      raise
116   
117    self.currentIndex = self.sns.index(oname)
118    self.currentSi = self.book.sheet_by_name( oname )
119
120    if new:
121      self.currentSo = self.get_sheet_by_name( name )
122    else:
123      self.currentSo = self.wb.get_sheet( self.currentIndex )
124
125  def putValue(self,i,j,value,sti=None,stj=None):
126    ##self.currentSi.write(i,j,value,self.plain)
127    if sti == None:
128      sti = i
129    if stj == None:
130      stj = j
131    cell_style = self.styles[self.currentSi.cell(sti,stj)]
132    self.currentSo.write(i,j,value,cell_style)
133
134  def write(self,file='output.xls'):
135    self.wb.save( file )
136
137
138  def get_sheet_by_name(self, name):
139    """Get a sheet by name from xlwt.Workbook, a strangely missing method.
140    Returns None if no sheet with the given name is present.
141    http://stackoverflow.com/questions/14587271/accessing-worksheets-using-xlwt-get-sheet-method dhdaines
142    """
143    # Note, we have to use exceptions for flow control because the
144    # xlwt API is broken and gives us no other choice.
145    try:
146        sheets = []
147        for idx in itertools.count():
148            sheet = self.wb.get_sheet(idx)
149            sheets.append( sheet.name )
150            if sheet.name == name:
151                return sheet
152    except:
153        print '################# failed to find sheet: %s ############' % name
154        return None
155
156  def copy_sheet(self, source_index, new_name): 
157    '''
158    self.wb      == source + book in use
159    source_index == index of sheet you want to copy (0 start)
160    new_name     == name of new copied sheet
161    return: copied sheet
162    Original code: https://groups.google.com/forum/#!topic/python-excel/gafa0rP3KyU [John Machin]
163    '''
164
165    source_worksheet = self.wb.get_sheet(source_index)
166    copied_sheet = copy.deepcopy(source_worksheet) 
167    copied_workbook = copied_sheet._Worksheet__parent
168
169    self.wb._Workbook__worksheets.append(copied_sheet)
170
171    copied_sheet.set_name(new_name)
172    self.wb._Workbook__sst = copied_workbook._Workbook__sst
173    self.wb._Workbook__styles = copied_workbook._Workbook__styles
174    return copied_sheet
175
176class tupsort:
177   def __init__(self,k=0):
178     self.k = k
179   def cmp(self,x,y):
180     return cmp( x[self.k], y[self.k] )
181
182def uniquify( ll ):
183  ll.sort()
184  l0 = [ll[0],]
185  for l in ll[1:]:
186    if l != l0[-1]:
187      l0.append(l)
188  return l0
189
190class workbook(object):
191  def __init__(self,file):
192    assert os.path.isfile(file), 'File %s not found' % file
193    self.book = xlrd.open_workbook( file )
194    self.sns = self.book.sheet_names()
195
196clabs = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"
197def clab(n):
198  i = n/26
199  assert i < 26, 'Not ready for row number greater than 26*26'
200  if i == 0:
201    return clabs[n]
202  else:
203    return clabs[i-1] + clabs[ n - i*26]
204
205def getRow(sht):
206  ee = {}
207  for i in range(sht.nrows):
208    if sht.row(i)[0].ctype == 2 and str( sht.row(i)[0].value ) != '0.0':
209      l = map( lambda x: str( x.value ), sht.row(i) )
210      ##k = string.replace( l[5], ' ','')
211      k = l[5]
212      try:
213        ee[k] = l
214      except:
215        print l
216        raise
217  return ee
218   
219def outvSer( ov ):
220  ll = []
221  for i in ov:
222    ll.append( '%s|%s|%s' % tuple( map( str, i) ) )
223  return string.join(ll, '; ' )
224 
225
226class cpsh(object):
227
228  def __init__(self,wk0,mip,path,kk=3,oo=None):
229    self.oo = oo
230    self.nn = 0
231    self.kk = kk
232    wk = wbcp( path )
233    wk0.focus( u'New variables')
234    self.wk = wk
235    self.mip = mip
236    self.nvgs = []
237    for s in wk.sns:
238      if s not in ['Objectives','Experiments','Experiment Groups','Request scoping','New variables','__lists__']:
239        self.nvgs.append(s)
240    self.outv = collections.defaultdict(list)
241    for s in self.nvgs:
242      thiss = wk.book.sheet_by_name( s )
243      for k in range(4,thiss.nrows):
244        r = thiss.row(k)
245        v = r[1].value
246        t = r[2].value
247        f = r[3].value
248        s = r[5].value
249        m = r[7].value
250        if t[:3] == 'new':
251          self.outv[v].append( (f,s,m) )
252    this = wk.book.sheet_by_name(u'New variables')
253    ee = collections.defaultdict( list )
254    for i in range(3,this.nrows):
255      r = this.row(i)
256      if r[0].value == "**end**":
257        break
258      v = r[0].value
259      ee[v].append(i)
260
261    for i in range(3,this.nrows):
262      r = this.row(i)
263      if r[0].value == "**end**":
264        break
265
266      v = r[0].value
267      l = r[4].value
268      novar = v == '' and l == ''
269      omitOld = True
270      omit = False
271      if vdict.has_key(v) and omitOld:
272        omit = True
273
274      if not omit:
275        if not novar:
276          wk0.putValue2( self.kk, 0, mip )
277          s = r[1].value
278          if s in ['','?']:
279            chk = 0
280          elif esn.has_key(s):
281            chk = 1
282          elif esna.has_key(s):
283            chk = 2
284          else:
285            chk = -1
286          wk0.putValue2( self.kk, 1, chk )
287          self.nn += 1
288          htmlline = "<td>%s</td>" % mip
289        else:
290          chk = 0
291          htmlline = "<td></td>"
292     
293        j = 3
294        jo = 1
295        wk0.putValue2( self.kk, 3, outvSer( self.outv[v] ) )
296        for x in r:
297          if j == 3:
298            v = x.value
299            v0 = x.value
300            if str(v0) != "":
301              if len(ee[v0]) != 1:
302                 v += '!'
303              if vdict.has_key(v0):
304                 v += '**'
305            wk0.putValue2( self.kk, j+jo, v )
306          else:
307            wk0.putValue2( self.kk, j+jo, x.value )
308          if j in [3,7]:
309            htmlline += "<td>%s</td>\n" % x.value
310          elif j == 4:
311            if chk == -1:
312              htmlline += "<td>?%s?</td>\n" % x.value
313            else:
314              htmlline += "<td>%s</td>\n" % x.value
315          elif j == 8:
316            y = x.value
317          elif j == 9:
318            htmlline += '<td><span title="%s">%s</span></td>\n' % (x.value,y)
319          j += 1
320        self.kk += 1
321        if not novar:
322          if mip == "SIMIP":
323            print htmlline
324          htmlline = string.replace( htmlline, u'\u2013', '-' )
325          htmlline = string.replace( htmlline, u'\u2018', "'" )
326          htmlline = string.replace( htmlline, u'\u2019', "'" )
327          htmlline = string.replace( htmlline, u'\u2026', '...' )
328          htmlline = string.replace( htmlline, u'\u25e6', 'o' )
329          htmlline = string.replace( htmlline, u'\xb2', '2' )
330          htmlline = string.replace( htmlline, u'\xb3', '3' )
331          if self.oo != None:
332            self.oo.write( "<tr>%s</tr>" % str(htmlline) + '\n' )
333
334
335  def parseRQ(self):
336    this = self.wk.book.sheet_by_name(u'Request scoping')
337    for i in range(6,this.nrows):
338      r = this.row(i)
339      mipt = r[0].value
340      s = r[1].value
341      if mipt[:4]  in ['SPEC','CORD', 'CCMI'] and s != 'none':
342        print self.mip,mipt
Note: See TracBrowser for help on using the repository browser.