web-dev-qa-db-fra.com

Formater la cellule du tableau HTML pour que Excel formate le texte?

Je crée un tableau HTML qui sera ouvert en tant que feuille de calcul dans Excel. Quelle balise HTML ou style CSS puis-je utiliser pour "dire" à Excel d'afficher le contenu de la cellule sous forme de texte?

33
dmr

Vous pouvez appliquer une mise en forme aux cellules pour les nombres, le texte, les dates, etc.

Voir ma réponse précédente à ce sujet: HTML vers Excel: comment dire à Excel de traiter les colonnes comme des nombres?

(extrait ajusté)

Si vous ajoutez une classe CSS à votre page:

.num {
  mso-number-format:General;
}
.text{
  mso-number-format:"\@";/*force text*/
}

Et giflez ces classes sur vos TD, ça marche?

<td class="num">34</td>
<td class="num">17.0</td>
<td class="text">067</td>
100
scunliffe

Il y a un problème avec cette solution (style CSS avec format numérique). Excel donne l'erreur "Number Stored as text" qui peut être gênant dans certains cas. Pour éviter ce problème, il est possible d'utiliser le caractère ZERO WIDTH SPACE (# 8203;) au début du champ.

13
Raposo

Vous pouvez également résoudre le problème en ajoutant espace insécable: &nbsp; avant la valeur de <td> élément.
Exemple: <td>&nbsp;0:12:12.185</td>
Au lieu de: <td>0:12:12.185</td>

7
WhiteOne

Je n'ai pas assez de représentant pour commenter ou voter, mais la réponse de Raposo a très bien fonctionné pour moi. Notre système importe les rapports SSRS et les exécute en mode local. Il stocke la ou les requêtes DataSet dans la base de données et les extrait lors de l'exécution. Cependant, pour les exportations Excel, il exécute simplement les données résultantes de la requête dans un objet DataGrid et les écrit directement dans le flux au format HTML, en définissant l'extension sur .xls. Mettre la solution de Raposo dans la requête DataSet du rapport:

SELECT someColumn = '&#8203;' + someColumn 
FROM, etc.

et le supprimer dans l'expression du champ SSRS:

=Replace(Fields!someColumn.Value, "&#8203;", "")

est la seule chose que j'ai trouvée qui fonctionne. Merci!

J'ai trouvé cinq solutions à ce problème:

  1. Formatez le champ sous forme de texte comme décrit par scunliffe. Cela a le problème du triangle vert comme l'a déclaré Raposo.

  2. Utilisez # 8203; comme décrit par Raposo. Cela a le problème que la valeur n'est pas vraiment un nombre. Cela pourrait être un problème si les données sont extraites d'un système pour traitement.

  3. Ajoutez le TD as <td> = "067" </td>. Cela a le même problème que # 2.

  4. Ajoutez le TD as <td> = text (067, "000") </td>. Cela a également le même problème que # 2.

  5. Utilisez une classe CSS de .text3 {mso-number-format: "000";} et ajoutez cette classe au TD. C'est ma solution préférée mais elle a le problème d'exiger plusieurs classes si vous avez des nombres de longueurs différentes. Si vous écrivez votre en-tête, puis parcourez vos données, vous devez ajouter toutes les classes possibles avant de savoir de celles dont vous aurez besoin. Mais cela a l'avantage que le texte est vraiment un nombre et qu'il n'y a pas de triangle vert.

2
Stephen

Superbe solution! Je l'ai fait comme ci-dessous

HttpContext.Current.Response.Write("<style>  .txt " + "\r\n" + " {mso-style-parent:style0;mso-number-format:\"" + @"\@" + "\"" + ";} " + "\r\n" + "</style>");
HttpContext.Current.Response.Write("<Td class='txt'>&#8203;");
HttpContext.Current.Response.Write(Coltext);
HttpContext.Current.Response.Write("</Td>");

et ça marche bien pour moi

2
Muhammad Yousaf

Essayez d'ajouter un devis unique avant votre valeur:

'

Donc ta cellule deviendrait

<td>'007</td>

C'était la seule solution qui fonctionnait pour moi. Non de la résidence a travaillé pour "Open Office" et "Libre Office", où ma solution fonctionne. Et la meilleure partie est que si vous copiez la valeur, elle ne copiera pas le devis unique.

0
ANDiTKO