source: CMIP6dreqbuild/trunk/src/workbook/utils_wb.py @ 336

Subversion URL: http://proj.badc.rl.ac.uk/svn/exarch/CMIP6dreqbuild/trunk/src/workbook/utils_wb.py@354
Revision 336, 9.9 KB checked in by mjuckes, 5 years ago (diff)

added workbook and framework docs

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