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@1198
Revision 1149, 10.2 KB checked in by mjuckes, 2 years 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.