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

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

01.00.08

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