Exemple #1
0
def write_content_types(workbook):
    """Write the content-types xml."""
    seen = set()
    if workbook.vba_archive:
        root = fromstring(workbook.vba_archive.read(ARC_CONTENT_TYPES))
        register_namespace('', 'http://schemas.openxmlformats.org/package/2006/content-types')
        for elem in root.findall('{http://schemas.openxmlformats.org/package/2006/content-types}Override'):
            seen.add(elem.attrib['PartName'])
    else:
        root = Element('Types', {'xmlns': 'http://schemas.openxmlformats.org/package/2006/content-types'})
        SubElement(root, 'Override', {'PartName': '/' + ARC_THEME, 'ContentType': 'application/vnd.openxmlformats-officedocument.theme+xml'})
        SubElement(root, 'Override', {'PartName': '/' + ARC_STYLE, 'ContentType': 'application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml'})
        SubElement(root, 'Default', {'Extension': 'rels', 'ContentType': 'application/vnd.openxmlformats-package.relationships+xml'})
        SubElement(root, 'Default', {'Extension': 'xml', 'ContentType': 'application/xml'})
        SubElement(root, 'Default', {'Extension': 'png', 'ContentType': 'image/png'})
        SubElement(root, 'Override', {'PartName': '/' + ARC_WORKBOOK, 'ContentType': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml'})
        SubElement(root, 'Override', {'PartName': '/' + ARC_APP, 'ContentType': 'application/vnd.openxmlformats-officedocument.extended-properties+xml'})
        SubElement(root, 'Override', {'PartName': '/' + ARC_CORE, 'ContentType': 'application/vnd.openxmlformats-package.core-properties+xml'})
        SubElement(root, 'Override', {'PartName': '/' + ARC_SHARED_STRINGS, 'ContentType': 'application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml'})

    drawing_id = 1
    chart_id = 1

    for sheet_id, sheet in enumerate(workbook.worksheets):
        part_name = '/xl/worksheets/sheet%d.xml' % (sheet_id + 1)
        if part_name not in seen:
            SubElement(root, 'Override',
                       {'PartName': part_name,
                        'ContentType': 'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml'})
        if sheet._charts or sheet._images:
            part_name = '/xl/drawings/drawing%d.xml' % drawing_id
            if part_name not in seen:
                SubElement(root, 'Override',
                           {'PartName': part_name,
                            'ContentType': 'application/vnd.openxmlformats-officedocument.drawing+xml'})
            drawing_id += 1

            for chart in sheet._charts:
                part_name = '/xl/charts/chart%d.xml' % chart_id

                if part_name not in seen:
                    SubElement(root, 'Override',
                               {'PartName': part_name,
                                'ContentType': 'application/vnd.openxmlformats-officedocument.drawingml.chart+xml'})
                    chart_id += 1
                    if chart._shapes:
                        part_name = '/xl/drawings/drawing%d.xml' % drawing_id
                        if part_name not in seen:
                            SubElement(root, 'Override',
                                       {'PartName': part_name,
                                        'ContentType': 'application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml'})
                        drawing_id += 1

    return get_document_content(root)
Exemple #2
0
def write_content_types(workbook):
    """Write the content-types xml."""
    seen = set()
    if workbook.vba_archive:
        root = fromstring(workbook.vba_archive.read(ARC_CONTENT_TYPES))
        register_namespace(
            '', 'http://schemas.openxmlformats.org/package/2006/content-types')
        for elem in root.findall(
                '{http://schemas.openxmlformats.org/package/2006/content-types}Override'
        ):
            seen.add(elem.attrib['PartName'])
    else:
        root = Element(
            'Types', {
                'xmlns':
                'http://schemas.openxmlformats.org/package/2006/content-types'
            })
        SubElement(
            root, 'Override', {
                'PartName':
                '/' + ARC_THEME,
                'ContentType':
                'application/vnd.openxmlformats-officedocument.theme+xml'
            })
        SubElement(
            root, 'Override', {
                'PartName':
                '/' + ARC_STYLE,
                'ContentType':
                'application/vnd.openxmlformats-officedocument.spreadsheetml.styles+xml'
            })
        SubElement(
            root, 'Default', {
                'Extension':
                'rels',
                'ContentType':
                'application/vnd.openxmlformats-package.relationships+xml'
            })
        SubElement(root, 'Default', {
            'Extension': 'xml',
            'ContentType': 'application/xml'
        })
        SubElement(root, 'Default', {
            'Extension': 'png',
            'ContentType': 'image/png'
        })
        SubElement(
            root, 'Override', {
                'PartName':
                '/' + ARC_WORKBOOK,
                'ContentType':
                'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet.main+xml'
            })
        SubElement(
            root, 'Override', {
                'PartName':
                '/' + ARC_APP,
                'ContentType':
                'application/vnd.openxmlformats-officedocument.extended-properties+xml'
            })
        SubElement(
            root, 'Override', {
                'PartName':
                '/' + ARC_CORE,
                'ContentType':
                'application/vnd.openxmlformats-package.core-properties+xml'
            })
        SubElement(
            root, 'Override', {
                'PartName':
                '/' + ARC_SHARED_STRINGS,
                'ContentType':
                'application/vnd.openxmlformats-officedocument.spreadsheetml.sharedStrings+xml'
            })

    drawing_id = 1
    chart_id = 1

    for sheet_id, sheet in enumerate(workbook.worksheets):
        part_name = '/xl/worksheets/sheet%d.xml' % (sheet_id + 1)
        if part_name not in seen:
            SubElement(
                root, 'Override', {
                    'PartName':
                    part_name,
                    'ContentType':
                    'application/vnd.openxmlformats-officedocument.spreadsheetml.worksheet+xml'
                })
        if sheet._charts or sheet._images:
            part_name = '/xl/drawings/drawing%d.xml' % drawing_id
            if part_name not in seen:
                SubElement(
                    root, 'Override', {
                        'PartName':
                        part_name,
                        'ContentType':
                        'application/vnd.openxmlformats-officedocument.drawing+xml'
                    })
            drawing_id += 1

            for chart in sheet._charts:
                part_name = '/xl/charts/chart%d.xml' % chart_id

                if part_name not in seen:
                    SubElement(
                        root, 'Override', {
                            'PartName':
                            part_name,
                            'ContentType':
                            'application/vnd.openxmlformats-officedocument.drawingml.chart+xml'
                        })
                    chart_id += 1
                    if chart._shapes:
                        part_name = '/xl/drawings/drawing%d.xml' % drawing_id
                        if part_name not in seen:
                            SubElement(
                                root, 'Override', {
                                    'PartName':
                                    part_name,
                                    'ContentType':
                                    'application/vnd.openxmlformats-officedocument.drawingml.chartshapes+xml'
                                })
                        drawing_id += 1

    return get_document_content(root)
def write_worksheet(worksheet, string_table, style_table):
    """Write a worksheet to an xml file."""
    if worksheet.xml_source:
        vba_root = fromstring(worksheet.xml_source)
        register_namespace("r", "http://schemas.openxmlformats.org/officeDocument/2006/relationships")
        register_namespace("", "http://schemas.openxmlformats.org/spreadsheetml/2006/main")
    else:
        vba_root = None
    xml_file = StringIO()
    doc = XMLGenerator(out=xml_file, encoding='utf-8')
    start_tag(doc, 'worksheet',
            {'xml:space': 'preserve',
            'xmlns': 'http://schemas.openxmlformats.org/spreadsheetml/2006/main',
            'xmlns:r': 'http://schemas.openxmlformats.org/officeDocument/2006/relationships'})
    if vba_root is not None:
        codename = vba_root.find('{http://schemas.openxmlformats.org/spreadsheetml/2006/main}sheetPr').get('codeName', worksheet.title)
        start_tag(doc, 'sheetPr', {"codeName": codename})
    else:
        start_tag(doc, 'sheetPr')
    tag(doc, 'outlinePr',
            {'summaryBelow': '%d' % (worksheet.show_summary_below),
            'summaryRight': '%d' % (worksheet.show_summary_right)})
    if worksheet.page_setup.fitToPage:
        tag(doc, 'pageSetUpPr', {'fitToPage':'1'})
    end_tag(doc, 'sheetPr')
    tag(doc, 'dimension', {'ref': '%s' % worksheet.calculate_dimension()})
    write_worksheet_sheetviews(doc, worksheet)
    tag(doc, 'sheetFormatPr', {'defaultRowHeight': '15'})
    write_worksheet_cols(doc, worksheet)
    write_worksheet_data(doc, worksheet, string_table, style_table)
    if worksheet.auto_filter:
        tag(doc, 'autoFilter', {'ref': worksheet.auto_filter})
    write_worksheet_mergecells(doc, worksheet)
    write_worksheet_datavalidations(doc, worksheet)
    write_worksheet_hyperlinks(doc, worksheet)

    options = worksheet.page_setup.options
    if options:
        tag(doc, 'printOptions', options)

    margins = worksheet.page_margins.margins
    if margins:
        tag(doc, 'pageMargins', margins)

    setup = worksheet.page_setup.setup
    if setup:
        tag(doc, 'pageSetup', setup)

    if worksheet.header_footer.hasHeader() or worksheet.header_footer.hasFooter():
        start_tag(doc, 'headerFooter')
        if worksheet.header_footer.hasHeader():
            tag(doc, 'oddHeader', None, worksheet.header_footer.getHeader())
        if worksheet.header_footer.hasFooter():
            tag(doc, 'oddFooter', None, worksheet.header_footer.getFooter())
        end_tag(doc, 'headerFooter')

    if worksheet._charts or worksheet._images:
        tag(doc, 'drawing', {'r:id':'rId1'})

    # if the sheet has an xml_source field then the workbook must have
    # been loaded with keep-vba true and we need to extract any control
    # elements.
    if vba_root is not None:
        for t in ('{http://schemas.openxmlformats.org/spreadsheetml/2006/main}legacyDrawing',
                  '{http://schemas.openxmlformats.org/spreadsheetml/2006/main}controls'):
            for elem in vba_root.findall(t):
                xml_file.write(re.sub(r' xmlns[^ >]*', '', tostring(elem).decode("utf-8")))

    breaks = worksheet.page_breaks
    if breaks:
        start_tag(doc, 'rowBreaks', {'count': str(len(breaks)), 'manualBreakCount': str(len(breaks))})
        for b in breaks:
            tag(doc, 'brk', {'id': str(b), 'man': 'true', 'max': '16383', 'min': '0'})
        end_tag(doc, 'rowBreaks')




    end_tag(doc, 'worksheet')
    doc.endDocument()
    xml_string = xml_file.getvalue()
    xml_file.close()
    return xml_string
Exemple #4
0
def write_worksheet(worksheet, string_table, style_table):
    """Write a worksheet to an xml file."""
    if worksheet.xml_source:
        vba_root = fromstring(worksheet.xml_source)
        register_namespace(
            "r",
            "http://schemas.openxmlformats.org/officeDocument/2006/relationships"
        )
        register_namespace(
            "", "http://schemas.openxmlformats.org/spreadsheetml/2006/main")
    else:
        vba_root = None
    xml_file = StringIO()
    doc = XMLGenerator(out=xml_file, encoding='utf-8')
    start_tag(
        doc, 'worksheet', {
            'xml:space':
            'preserve',
            'xmlns':
            'http://schemas.openxmlformats.org/spreadsheetml/2006/main',
            'xmlns:r':
            'http://schemas.openxmlformats.org/officeDocument/2006/relationships'
        })
    if vba_root is not None:
        codename = vba_root.find(
            '{http://schemas.openxmlformats.org/spreadsheetml/2006/main}sheetPr'
        ).get('codeName', worksheet.title)
        start_tag(doc, 'sheetPr', {"codeName": codename})
    else:
        start_tag(doc, 'sheetPr')
    tag(
        doc, 'outlinePr', {
            'summaryBelow': '%d' % (worksheet.show_summary_below),
            'summaryRight': '%d' % (worksheet.show_summary_right)
        })
    if worksheet.page_setup.fitToPage:
        tag(doc, 'pageSetUpPr', {'fitToPage': '1'})
    end_tag(doc, 'sheetPr')
    tag(doc, 'dimension', {'ref': '%s' % worksheet.calculate_dimension()})
    write_worksheet_sheetviews(doc, worksheet)
    tag(doc, 'sheetFormatPr', {'defaultRowHeight': '15'})
    write_worksheet_cols(doc, worksheet)
    write_worksheet_data(doc, worksheet, string_table, style_table)
    if worksheet.auto_filter:
        tag(doc, 'autoFilter', {'ref': worksheet.auto_filter})
    write_worksheet_mergecells(doc, worksheet)
    write_worksheet_datavalidations(doc, worksheet)
    write_worksheet_hyperlinks(doc, worksheet)

    options = worksheet.page_setup.options
    if options:
        tag(doc, 'printOptions', options)

    margins = worksheet.page_margins.margins
    if margins:
        tag(doc, 'pageMargins', margins)

    setup = worksheet.page_setup.setup
    if setup:
        tag(doc, 'pageSetup', setup)

    if worksheet.header_footer.hasHeader(
    ) or worksheet.header_footer.hasFooter():
        start_tag(doc, 'headerFooter')
        if worksheet.header_footer.hasHeader():
            tag(doc, 'oddHeader', None, worksheet.header_footer.getHeader())
        if worksheet.header_footer.hasFooter():
            tag(doc, 'oddFooter', None, worksheet.header_footer.getFooter())
        end_tag(doc, 'headerFooter')

    if worksheet._charts or worksheet._images:
        tag(doc, 'drawing', {'r:id': 'rId1'})

    # if the sheet has an xml_source field then the workbook must have
    # been loaded with keep-vba true and we need to extract any control
    # elements.
    if vba_root is not None:
        for t in (
                '{http://schemas.openxmlformats.org/spreadsheetml/2006/main}legacyDrawing',
                '{http://schemas.openxmlformats.org/spreadsheetml/2006/main}controls'
        ):
            for elem in vba_root.findall(t):
                xml_file.write(
                    re.sub(r' xmlns[^ >]*', '',
                           tostring(elem).decode("utf-8")))

    breaks = worksheet.page_breaks
    if breaks:
        start_tag(doc, 'rowBreaks', {
            'count': str(len(breaks)),
            'manualBreakCount': str(len(breaks))
        })
        for b in breaks:
            tag(doc, 'brk', {
                'id': str(b),
                'man': 'true',
                'max': '16383',
                'min': '0'
            })
        end_tag(doc, 'rowBreaks')

    end_tag(doc, 'worksheet')
    doc.endDocument()
    xml_string = xml_file.getvalue()
    xml_file.close()
    return xml_string