2010-06-29 11 views
0

J'ai un classeur Excel qui est utilisé comme point de départ pour générer un formulaire remplissable par l'utilisateur dans notre système interne. Pour aider les utilisateurs à créer ce classeur, j'essaie d'ajouter une fonction de prévisualisation, qui prend cette feuille de calcul, fait de la magie VBA pour générer un fichier HTML, puis l'affiche dans leur navigateur.MSXML XHTML et CSS incorporé

J'ai fait la structure de base, en utilisant MSXML pour écrire du XHTML, jusqu'ici, tout va bien. Maintenant, je rencontre un problème avec l'incorporation de la feuille de style.

La feuille de style est contenue dans une chaîne dans le code VBA, et j'essaie de l'ajouter dans une balise <style> dans l'en-tête, ce qui est simple. Là où j'ai le problème, c'est que j'utilise des sélecteurs CSS dans la feuille de style, avec >, ce qui me cause des problèmes, puisque MSXML veut encoder cela comme une séquence d'échappement XML, brisant le CSS. J'ai essayé d'ajouter la feuille de style dans un bloc CDATA, mais le navigateur l'ignore.

tl; dr: Comment intégrer une feuille de style contenant > dans un fichier HTML généré avec MSXML?

EDIT: Voici un bloc de code qui reproduit ce comportement. Mettez-la dans un Sub dans Excel ou un programme en utilisant VBA de votre choix, exécuter et afficher la source:

Dim doc As DOMDocument 
Dim htmlRoot As IXMLDOMElement 
Dim bodyRoot As IXMLDOMElement 
Dim headRoot As IXMLDOMElement 
Dim style As IXMLDOMElement 

Set doc = New DOMDocument 
Set htmlRoot = doc.createElement("html") 
Set bodyRoot = doc.createElement("body") 
Set headRoot = doc.createElement("head") 

Set style = doc.createElement("style") 
style.appendChild doc.createTextNode(".section>.title{font-weight: bold;}") 
style.setAttribute "type", "text/css" 

headRoot.appendChild style 

htmlRoot.appendChild headRoot 
htmlRoot.appendChild bodyRoot 

doc.appendChild htmlRoot 

Dim fs As FileSystemObject 
Dim sh 
Dim tempFolder As String 
Set fs = New FileSystemObject 
Set sh = CreateObject("WScript.Shell") 
tempFolder = fs.GetSpecialFolder(TemporaryFolder) 

Dim fileName As String 
fileName = tempFolder + "\preview.html" 
doc.Save fileName 
sh.Run fileName 

Répondre

1

Au lieu d'essayer de stocker des caractères CSS qui seront interprétés comme du balisage XML, vous pouvez produire le XHTML en utilisant votre méthode existante, mais au lieu d'insérer le CSS en utilisant MSXML, insérez un espace réservé et remplacez-le après avoir terminé la construction du XHTML. Quelque chose comme ceci:

style.appendChild doc.createTextNode("{css}") 

' some more XHTML building here. 

Dim html As String 
Dim css As String 

css = ".section>.title{font-weight: bold;}" 
html = Replace(doc.Text, "{css}", css) 

' Save the html here... 

De cette façon, vous pouvez intégrer tout ce que vous voulez dans le XHTL, sans avoir à se soucier de MSXML essayant d'échapper pour vous.

+0

Pas exactement applicable, je construis directement le document XHTML, et n'utilise pas de XSLT. –

+0

@Matt S: J'ai mis à jour ma réponse. – Mike

+1

Cela a fonctionné. Maintenant je peux continuer à travailler sur cette abomination. –

0

La séquence d'échappement XML pour > est & gt; (au lieu de GreaterThan)

+0

Le problème est que MSXML remplace '>' par '>' qui n'est alors pas non échappé, ce qui brise le CSS. Mettre '>' dans le CSS produit '& >' dans le fichier résultant. –

+0

Pour la balise