def add_ObjectN(N, metainf_manifest_xml_obj): """Add Object manifest:file-entry object to manifest.xml in META-INF of ods file""" NS = metainf_manifest_xml_obj.NS M = metainf_manifest_xml_obj.getroot() # just to reduce line lengths # put subdirectory object into manifest obj_name = 'Object %i' % N attribD = { NS('manifest:full-path'): obj_name + '/', NS('manifest:media-type'): "application/vnd.oasis.opendocument.chart" } mfe = ET.Element(NS('manifest:file-entry'), attrib=attribD) M.insert(N, mfe) # place in order # put xml files into subdirectory attribD = { NS('manifest:full-path'): obj_name + '/content.xml', NS('manifest:media-type'): "text/xml" } mfe = ET.Element(NS('manifest:file-entry'), attrib=attribD) M.insert(N * 3, mfe) # place in order attribD = { NS('manifest:full-path'): obj_name + '/styles.xml', NS('manifest:media-type'): "text/xml" } mfe = ET.Element(NS('manifest:file-entry'), attrib=attribD) M.insert(N * 3, mfe) # place in order
def new_elem(self, name, attribOD=None): """ Create a new Element object. name format can be 'table:table' OR '{urn:oasis:names:tc:opendocument:xmlns:table:1.0}table' (i.e. can be path format OR tab format) attribOD is an OrderedDict in order to preserve attribute order. """ tag = self.NS(name) #print( 'tag =',tag ) if attribOD: OD = self.NS_attrib(attribOD) my_new_elem = ET.Element(tag, attrib=OD) else: my_new_elem = ET.Element(tag) sL = my_new_elem.tag.split('}') if len(sL) == 2: name = sL[1] uri = sL[0][1:] self.qnameOD[my_new_elem.tag] = '%s:%s' % (self.nsOD[uri], name) for qname, v in list(my_new_elem.attrib.items()): sL = qname.split('}') if len(sL) == 2: name = sL[1] uri = sL[0][1:] self.qnameOD[qname] = '%s:%s' % (self.nsOD[uri], name) return my_new_elem
def __init__(self, plot_sheetname, num_chart, parent_obj, excel_colors=True): """Inits SpreadSheet with filename and blank content. NS: cleans up the namespace callouts of the xml Element Attributes:: plot_sheetname: name of data sheet """ self.i_color = 0 # index into color chart for next curve self.i_prim_color = 0 # index into colorL self.i_sec_color = 0 # index into color2L self.i_symbol_type = 0 # index into SYMBOL_TYPE_LIST if excel_colors: self.color_list = EXCEL_COLOR_LIST else: self.color_list = BIG_COLOR_HEXSTR_LIST NS = parent_obj.NS # Start building new xml Element to be new Sheet in spreadsheet attribD = {NS('table:name'): plot_sheetname} newsheet = ET.Element(NS('table:table'), attrib=attribD) table_shapes = ET.Element(NS('table:shapes')) #print( 'table_shapes.text =',table_shapes.text ) def NS_attrib(attD): D = {} for key, val in list(attD.items()): D[NS(key)] = val return D attribD = NS_attrib({ 'draw:z-index': "1", 'draw:id': "id0", 'draw:style-name': "a0", 'draw:name': "Chart 1", 'svg:x': "0in", 'svg:y': "0in", 'svg:width': "9.47551in", 'svg:height': "6.88048in", 'style:rel-width': "scale", 'style:rel-height': "scale" }) draw_frame = ET.Element(NS('draw:frame'), attrib=attribD) attribD = NS_attrib({ 'xlink:href': "Object %i/" % num_chart, 'xlink:type': "simple", 'xlink:show': "embed", 'xlink:actuate': "onLoad" }) draw_obj = ET.Element(NS('draw:object'), attrib=attribD) svg_title = ET.Element(NS('svg:title')) svg_desc = ET.Element(NS('svg:desc')) draw_frame.append(draw_obj) draw_frame.append(svg_title) draw_frame.append(svg_desc) table_shapes.append(draw_frame) tab_col = ET.Element( NS('table:table-column'), attrib={NS('table:number-columns-repeated'): "16384"}) tab_row = ET.Element( NS('table:table-row'), attrib={NS('table:number-rows-repeated'): "1048576"}) tab_cell = ET.Element( NS('table:table-cell'), attrib={NS('table:number-columns-repeated'): "16384"}) tab_row.append(tab_cell) newsheet.append(table_shapes) newsheet.append(tab_col) newsheet.append(tab_row) # make sure any added Element objects are in nsOD, rev_nsOD and qnameOD of parent_obj def add_tag(tag): sL = tag.split('}') uri = sL[0][1:] name = sL[1] parent_obj.qnameOD[tag] = parent_obj.nsOD[uri] + ':' + name def add_tags(obj): if hasattr(obj, 'tag'): add_tag(obj.tag) if hasattr(obj, 'attrib'): for q, v in list(obj.attrib.items()): add_tag(q) for parent in newsheet.iter(): add_tags(parent) for child in parent.getchildren(): add_tags(child) self.xmlSheetObj = newsheet self.plot_sheetname = '' self.data_sheetname = '' self.title = '' self.xlabel = '' self.ylabel = '' self.y2label = '' self.ycolL = None self.ycol2L = None self.logx = False self.logy = False self.log2y = False self.xcolL = [] self.ycolDataSheetNameL = [] self.xcol2L = [] self.ycol2_DataSheetNameL = [] self.showMarkerL = None self.showMarker2L = None self.markerTypeL = None self.markerType2L = None self.showLineL = None self.showLine2L = None self.lineThkL = None self.lineThk2L = None self.lineStyleL = None self.lineStyle2L = None self.set_of_line_styles = set() self.markerHtWdL = None self.markerHtWd2L = None self.showUnits = True self.colorL = None self.color2L = None self.labelL = None self.label2L = None
def __init__(self, data_sheetname, list_of_rows, parent_obj): """Inits SpreadSheet with filename and blank content. NS: cleans up the namespace callouts of the xml Element Attributes:: data_sheetname: name of data sheet nrows: number of rows including label and units rows ncols: max number of cols labelL: list of labels unitsL: list of units """ NS = parent_obj.NS self.data_sheetname = data_sheetname self.list_of_rows = list_of_rows # calc number of rows and columns in data self.nrows = len(list_of_rows) self.ncols = 0 for row in list_of_rows: self.ncols = max(self.ncols, len(row)) # make sure that row1 and row2 contain labels and units self.labelL = [] self.unitsL = [] for n in range(self.ncols): try: s = str(list_of_rows[0][n]).strip() except: s = 'Column %i' % (n + 1, ) self.labelL.append(s) try: s = str(list_of_rows[1][n]).strip() except: s = '' self.unitsL.append(s) # Start building new xml Element to be new Sheet in spreadsheet #print( nsmap ) attribD = { NS('table:name'): data_sheetname, NS('table:style-name'): "ta1" } newsheet = ET.Element(NS('table:table'), attrib=attribD) colD = { NS('table:style-name'): "co1", NS('table:number-columns-repeated'): "16384", NS('table:default-cell-style-name'): "ce1" } col_elm = ET.Element(NS('table:table-column'), attrib=colD) newsheet.append(col_elm) str_cellD = { NS('office:value-type'): "string", NS('table:style-name'): "ce1" } float_cellD = { NS('office:value-type'): "float", NS('table:style-name'): "ce1" } row_rep = 1048576 # max number of rows for row in list_of_rows: row_obj = ET.Element(NS('table:table-row'), attrib={NS('table:style-name'): "ro1"}) col_rep = 16384 # max number of columns for value in row: try: fval = float(value) float_cellD[NS('office:value')] = str(fval) D = float_cellD text_p = "%g" % fval except: D = str_cellD text_p = "%s" % value cell_obj = ET.Element(NS('table:table-cell'), attrib=D) text_obj = ET.Element(NS('text:p')) text_obj.text = text_p cell_obj.append(text_obj) row_obj.append(cell_obj) col_rep -= 1 # decrement max available columns remaining last_cell_obj = ET.Element( NS('table:table-cell'), attrib={NS('table:number-columns-repeated'): "%i" % col_rep}) row_obj.append(last_cell_obj) newsheet.append(row_obj) row_rep -= 1 # decrement max remaining number of rows last_row_obj = ET.Element(NS('table:table-row'), attrib={ NS('table:style-name'): "ro1", NS('table:number-rows-repeated'): "%i" % row_rep }) last_row_obj.append( ET.Element(NS('table:table-cell'), attrib={NS('table:number-columns-repeated'): "16384"})) newsheet.append(last_row_obj) # make sure any added Element objects are in nsOD, rev_nsOD and qnameOD of parent_obj # make sure any added Element objects are in nsOD, rev_nsOD and qnameOD of parent_obj def add_tag(tag): sL = tag.split('}') uri = sL[0][1:] name = sL[1] parent_obj.qnameOD[tag] = parent_obj.nsOD[uri] + ':' + name def add_tags(obj): if hasattr(obj, 'tag'): add_tag(obj.tag) if hasattr(obj, 'attrib'): for q, v in list(obj.attrib.items()): add_tag(q) for parent in newsheet.iter(): add_tags(parent) for child in parent.getchildren(): add_tags(child) self.xmlSheetObj = newsheet