datatable.py 3.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. # Copyright (C) 2007 Søren Roug, European Environment Agency
  4. #
  5. # This is free software. You may redistribute it under the terms
  6. # of the Apache license and the GNU General Public License Version
  7. # 2 or at your option any later version.
  8. #
  9. # This program is distributed in the hope that it will be useful,
  10. # but WITHOUT ANY WARRANTY; without even the implied warranty of
  11. # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
  12. # GNU General Public License for more details.
  13. #
  14. # You should have received a copy of the GNU General Public
  15. # License along with this program; if not, write to the Free Software
  16. # Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
  17. #
  18. # Contributor(s):
  19. #
  20. from odf import table, text
  21. def valuetype(val):
  22. valuetype="string"
  23. if isinstance(val,str): valuetype="string"
  24. if isinstance(val,int): valuetype="float"
  25. if isinstance(val,float): valuetype="float"
  26. if isinstance(val,bool): valuetype="boolean"
  27. return valuetype
  28. class DataTable(object):
  29. def __init__(self, values=()):
  30. self.values = values
  31. self.datasourcehaslabels = "none"
  32. def _set_values(self, value):
  33. if isinstance(value, list) or isinstance(value, tuple):
  34. self.__dict__['values'] = value
  35. firstrow = value[0]
  36. if isinstance(firstrow, list) or isinstance(firstrow, tuple):
  37. self.numcols = len(firstrow)
  38. else:
  39. self.numcols = 1
  40. else:
  41. raise ValueError, "Value must be list or tuple"
  42. def __setattr__(self, name, value):
  43. if name == 'values':
  44. self._set_values(value)
  45. else:
  46. self.__dict__[name] = value
  47. def __call__(self):
  48. datatable = table.Table(name="local-table")
  49. if self.datasourcehaslabels in ('row','both'):
  50. t = table.TableHeaderColumns()
  51. t.addElement(table.TableColumn())
  52. datatable.addElement(t)
  53. t = table.TableColumns()
  54. if self.datasourcehaslabels in ('row','both'):
  55. t.addElement(table.TableColumn(numbercolumnsrepeated=str(self.numcols-1)))
  56. else:
  57. t.addElement(table.TableColumn(numbercolumnsrepeated=str(self.numcols)))
  58. datatable.addElement(t)
  59. if self.datasourcehaslabels in ('column','both'):
  60. t = table.TableHeaderRows()
  61. datatable.addElement(t)
  62. tr = table.TableRow()
  63. t.addElement(tr)
  64. content = self.values[0]
  65. for val in content:
  66. tc = table.TableCell(valuetype=valuetype(val))
  67. tr.addElement(tc)
  68. tc.addElement(text.P(text=str(val)))
  69. t = table.TableRows()
  70. datatable.addElement(t)
  71. rownum = 0
  72. for content in self.values:
  73. if rownum == 0 and self.datasourcehaslabels in ('column','both'):
  74. rownum += 1
  75. continue
  76. tr = table.TableRow()
  77. t.addElement(tr)
  78. for val in content:
  79. tc = table.TableCell(valuetype=valuetype(val), value=val)
  80. tr.addElement(tc)
  81. tc.addElement(text.P(text=str(val)))
  82. rownum += 1
  83. return datatable