source: CMIP6dreqbuild/trunk/src/framework/ingest/utils_wb.py @ 1027

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

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