2010-08-27 8 views
0

En ce qui concerne this post J'ai beaucoup travaillé avec Open XML de Word et les bibliothèques disponibles. Ce qui semble être inconnu de la plupart, c'est qu'il existe un grand resources pour la programmation du format Open XML pour Word (et je ne veux pas écrire manuellement du XML dans le flux de fichiers!).Open XML - Format incorrect

Ma question concerne ce que je fais. Fondamentalement, je crée manuellement une fusion et publipostage. Maintenant, l'opération de fusion et publipostage fonctionne correctement, ce qui ne fonctionne pas correctement, cependant, place les champs de fusion et publipostage dans le document. Voilà ce que je fais:

string mergeFieldName = m.Value.Replace("[", string.Empty).Replace("]", string.Empty); 
Body body = new Body(); 
DocumentFormat.OpenXml.Wordprocessing.Paragraph p = new DocumentFormat.OpenXml.Wordprocessing.Paragraph(); 
SimpleField simpleField = new SimpleField() { Instruction = " MERGEFIELD " + mergeFieldName + " " }; 
Run run = new Run(); 
RunProperties runProperties = new RunProperties(); 
NoProof noProof = new NoProof(); 
runProperties.Append(noProof); 
Text text = new Text("«" + mergeFieldName + "»"); 
run.Append(runProperties); 
run.Append(text); 
simpleField.Append(run); 
p.Append(simpleField); 
body.Append(p); 

docXml.InnerXml = docXml.InnerXml.Replace(m.Value, body.InnerXml); 

La m variables est en fait un objet Match basé sur mon expression régulière tout correspondant entre crochets. (Vous pourriez vous demander pourquoi je fais ce que je suis - ce n'est pas pertinent ici)

Mon problème est le XML résultant est invalide parce que je donne les résultats suivants:

<w:p w:rsidR="00945DC1" w:rsidRDefault="006878CA"> 
    <w:r> 
    <w:t xml:space="preserve"> 
     <w:p xmlns:w="http://schemas.openxmlformats.org/wordprocessingml/2006/main"> 
     <w:fldSimple w:instr=" MERGEFIELD FullName "> 
      <w:r> 
      <w:rPr> 
       <w:noProof /> 
      </w:rPr> 
      <w:t>«FullName»</w:t> 
      </w:r> 
     </w:fldSimple> 
     </w:p> 
    </w:t> 
    </w:r> 
</w:p> 

Et voici un exemple de le travail XML à partir d'un document créé manuellement:

<w:p w:rsidR="001B2242" w:rsidRDefault="001B2242"> 
    <w:r> 
    <w:tab/> 
    </w:r> 
    <w:fldSimple w:instr=" MERGEFIELD &quot;SalutationName&quot; "> 
    <w:r> 
     <w:rPr> 
     <w:noProof/> 
     </w:rPr> 
     <w:t>«SalutationName»</w:t> 
    </w:r> 
    </w:fldSimple> 
</w:p> 

l'erreur réelle que je reçois est « le fichier ne peut pas être ouvert car il y a des problèmes avec le contenu ». Si je n'écris pas les champs de fusion et publipostage, charge le document, puis insère des champs de fusion et publipostage, cela fonctionne. Donc, la fusion et le publipostage sont corrects, seuls les champs de fusion et publipostage ne sont pas corrects. (Voir mon article référencé pour savoir comment extraire le courrier).

Des idées sur celui-ci?

Vive

Répondre

0

Ce que je vois est que vous remplacez mal. Vous mettez le nouveau XML que vous créez à l'intérieur d'aw: t tag qui est une balise de texte Si je ne me trompe pas

Ignorez la création Body et remplacez le InnerXml du paragraphe p par le innerXml de m.Values ​​parent . C'est-à-dire si je comprends bien cela.

Questions connexes