Comment modifier le xml d'un objet pptx.oxml.xmlchemy.XmlString à un index d'élément particulier?

Nov 04 2020

La table (1x2) dans python-pptxa un tr objectavec le XML suivant (abrégé):

<a:tr xmlns:a="http://schemas.openxmlformats.org/drawingml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:p="http://schemas.openxmlformats.org/presentationml/2006/main" h="777240">
  <a:tc>
    <a:txBody>
      <a:bodyPr/>
      <a:lstStyle/>
      ...
    </a:txBody>
    <a:tcPr anchor="ctr">
      ...
    </a:tcPr>
  </a:tc>
  <a:tc>
    <a:txBody>
      <a:bodyPr/>
      <a:lstStyle/>
      ...
    </a:txBody>
    <a:tcPr anchor="ctr">
      ...
    </a:tcPr>
  </a:tc>
  <a:extLst>
    <a:ext uri="{0D108BD9-81ED-4DB2-BD59-A6C34878D82A}">
      <a16:rowId xmlns:a16="http://schemas.microsoft.com/office/drawing/2014/main" val="2729466849"/>
    </a:ext>
  </a:extLst>
</a:tr>

Exécution du code suivant (lors de l'ajout d'une nouvelle colonne):

prs_obj = pptx.Presentation(filepath)
tab = prs_obj.slides[0].shapes[0].table
for tr in tab._tbl.tr_lst:
    new_tc = copy.deepcopy(tr.tc_lst[-1])
    tr.append(new_tc)

Ajoute une nouvelle cellule après la <a:extLst> ...</a:exLst>balise xml (et rend PowerPoint incapable d'afficher le contenu de la cellule). Au lieu de cela, je veux insérer un autre <a:tc>élément après les deux cellules précédentes, mais AVANT <a:extLst>.

Tous les tutoriels que j'ai lus sur xml partent du principe que vous avez un fichier xml que vous pouvez analyser, c'est tree = ET.parse(file)-à- dire que tr.xml n'est pas un fichier analysable, c'est un 'pptx.oxml.xmlchemy.XmlString'objet.

Réponses

1 scanny Nov 04 2020 at 16:33

Le XML est déjà analysé. Tout ce dont vous avez besoin ici est:

tr.tc_lst[-1].addnext(new_tc)

au lieu de:

tr.append(new_tc)

C'est juste l'une des autres méthodes de la lxml._Elementclasse, que tous les python-docxéléments sous-classe.