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

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

partial migration to dreq2

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