我正在使用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
对应于overlay
的val
属性的默认值。
为了更详细地说明它,您可以遵循python-pptx层次结构,如下所示:overlay
是mapped到CT_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/