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

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

update

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