1
# -*- coding: utf-8 -*-
4
from mx import DateTime
5
from tools.translate import _
8
# example to read a Excel XML file in consumption_calculation/wizard/wizard_import_rac.py
9
class SpreadsheetTools():
10
defaultns = 'urn:schemas-microsoft-com:office:spreadsheet'
11
namespaces = {'ss': defaultns}
12
xa = {'namespaces': namespaces}
14
def get(self, node, attr, default=None):
15
return node.get(etree.QName(self.defaultns, attr), default)
17
class SpreadsheetCell(SpreadsheetTools):
21
def __init__(self, node=None):
23
data = node.find(etree.QName(self.defaultns, 'Data'))
25
dtype = self.get(data, 'Type')
30
self.data = float(self.data)
33
self.data = int(self.data)
34
elif dtype == 'Boolean':
35
self.data = self.data in ('1', 'T', 't', 'True', 'true')
37
elif dtype == 'DateTime':
38
self.data = DateTime.ISO.ParseDateTime(self.data)
39
self.type = 'datetime'
40
elif dtype == 'String':
44
return "%s"%(self.data, )
47
return "%s(<%s> %s)" % (self.__class__, self.type, self.data)
50
class SpreadsheetRow(SpreadsheetTools):
52
def __init__(self, node):
61
return SpreadsheetRow(self.node.next())
65
returns the num. of cells
68
for cell in self.node.xpath('ss:Cell', **self.xa):
69
currindex = self.get(cell, 'Index')
73
index = int(currindex)
74
merged = self.get(cell, 'MergeAcross', 0)
84
for cell in self.node.xpath('ss:Cell', **self.xa):
85
currindex = self.get(cell, 'Index')
89
currindex = int(currindex)
90
for i in xrange(index+1, currindex):
91
yield SpreadsheetCell()
93
merged = self.get(cell, 'MergeAcross', 0)
94
yield SpreadsheetCell(cell)
95
for i in xrange(0, int(merged)):
96
yield SpreadsheetCell()
98
def gen_cell_list(self):
99
for cell in self.iter_cells():
100
self.cell_list.append(cell)
102
def __getattr__(self, attr):
104
if not self.cell_list:
106
return self.cell_list
109
def __getitem__(self, attr):
110
if not self.cell_list:
112
return self.cell_list[attr]
114
class SpreadsheetXML(SpreadsheetTools):
116
def __init__(self, xmlfile=False, xmlstring=False):
119
self.xmlobj = etree.parse(xmlfile)
121
self.xmlobj = etree.XML(xmlstring)
122
except etree.XMLSyntaxError:
123
raise osv.except_osv(_('Error'), _('Wrong format: it should be in Spreadsheet XML 2003'))
125
def getWorksheets(self):
127
for wb in self.xmlobj.xpath('//ss:Worksheet', **self.xa):
128
ret.append(self.get(wb, 'Name'))
131
def getRows(self,worksheet=1):
132
table = self.xmlobj.xpath('//ss:Worksheet[%d]/ss:Table[1]'%(worksheet, ), **self.xa)
133
return SpreadsheetRow(table[0].getiterator(etree.QName(self.defaultns, 'Row')))
136
if __name__=='__main__':
137
spreadML = SpreadsheetXML('/mnt/Tempo/TestJFB/test_dates.xml')
138
spreadML.getWorksheets()
139
# Iterates through all sheets
140
for ws_number in xrange(1, len(spreadML.getWorksheets())):
141
rows = spreadML.getRows(ws_number)
145
# number of cells: row.len()
146
# cells can be retrieve like a list: row.cells[0] or like an iterator:
147
for cell in row.iter_cells():
148
print "%s |"%cell.data,