我正在使用Office 2007。
我发现是否要在Office2007中显示图例与图表重叠。
XML应该如下所示。

`-<c:legend>
   <c:overlay val="1"/>`


但是无论我使用python-pptx'chart.legend.include_in_layout = True'的API还是将其保留为默认设置。生成的XML将始终如下所示。

`-<c:legend>
   <c:overlay/>`


如果没有val = 1,则office2007将无法正确显示格式。
如何强制python-pptx写val = 1?谢谢。

最佳答案

说明

简而言之,未明确设置True值(与False相反),因为True对应于overlayval属性的默认值。

为了更详细地说明它,您可以遵循python-pptx层次结构,如下所示:overlaymappedCT_Boolean(所有重叠的oxml元素都从CT_Boolean实例化)。然后,通过val映射实际的OptionalAttribute参数,并使用默认值True进行定义:

class CT_Boolean(BaseOxmlElement):
    """
    Common complex type used for elements having a True/False value.
    """
    val = OptionalAttribute('val', XsdBoolean, default=True)


现在,将可选属性设置为其默认值时,实际上会跳过/删除它,如您所见here if value == self._default

class OptionalAttribute(BaseAttribute):
    """
    Defines an optional attribute on a custom element class. An optional
    attribute returns a default value when not present for reading. When
    assigned |None|, the attribute is removed.
    """

    @property
    def _setter(self):
        def set_attr_value(obj, value):
            if value == self._default:
                if self._clark_name in obj.attrib:
                    del obj.attrib[self._clark_name]
                return
            str_value = self._simple_type.to_xml(value)
            obj.set(self._clark_name, str_value)
        return set_attr_value


修复-提供自定义CT_Boolean类

在需要使用叠加层之前,将这些行添加到某处。它将使用自定义的overlay类覆盖python-pptx CT_Boolean_NoDefault映射:

from pptx.oxml import register_element_cls
from pptx.oxml.xmlchemy import BaseOxmlElement, OptionalAttribute
from pptx.oxml.simpletypes import XsdBoolean


class CT_Boolean_NoDefault(BaseOxmlElement):
    """
    Common complex type used for elements having a True/False value with no
    default value.
    """
    val = OptionalAttribute('val', XsdBoolean)

register_element_cls('c:overlay', CT_Boolean_NoDefault)


这对我有用,最后我得到了:

<c:legend>
    <c:overlay val="1"/>
</c:legend>


修复-永久修改python-pptx

不建议这样做,但您可能想修改python-pptx,而不是从上面为运行的每个脚本添加解决方案。

首先,将以下内容添加到pptx/oxml/chart/shared.py中,它定义了一个没有默认值的新bool类:

class CT_Boolean_NoDefault(BaseOxmlElement):
    """
    Common complex type used for elements having a True/False value.
    """
    val = OptionalAttribute('val', XsdBoolean)


其次,修改pptx/oxml/__init__.py以添加新的bool类:

from .chart.shared import (
    CT_Boolean, CT_Double, CT_Layout, CT_LayoutMode, CT_ManualLayout,
    CT_NumFmt, CT_Tx, CT_UnsignedInt, CT_Boolean_NoDefault
)


第三,修改pptx/oxml/__init__.py以将overlay元素的映射更改为新的bool类:

register_element_cls('c:overlay', CT_Boolean_NoDefault)


更好的解决方案

如果您有时间,请提交票证here,这样它可能会成为永久解决方案。如果@scanny有时间,他会阅读。也许对此也有一些更好的解决方案,而我完全错过了一些东西。

关于python - Python-pptx:“显示图例与图表重叠”,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/42731073/

10-12 15:05