source: CMIP6dreqbuild/trunk/src/framework/utils_wb.py @ 818

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

adding missing file

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