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
Pas exactement applicable, je construis directement le document XHTML, et n'utilise pas de XSLT. –
@Matt S: J'ai mis à jour ma réponse. – Mike
Cela a fonctionné. Maintenant je peux continuer à travailler sur cette abomination. –