source: CMIP6dreqbuild/trunk/src/framework/ingest/utils_wb.py @ 1012

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/src/framework/ingest/utils_wb.py@1012
Revision 1012, 10.0 KB checked in by mjuckes, 3 years ago (diff)

cleaned expts.py

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