2010-10-20 9 views
0

J'utilise Asp.net pour créer un fichier csv que l'utilisateur peut ouvrir directement dans Excel. Je veux permettre de montrer le popup de téléchargement et pour l'utilisateur de choisir "Ouvrir avec Excel" et qui ouvrira le fichier dans Excel.Créer csv avec asp.net et ouvrir dans excel

Le code pour créer le csv:

Response.Clear(); 
Response.AddHeader("content-disposition", string.Format("attachment; filename={0}.csv", "test")); 
Response.ContentType = "text/csv"; 
Response.Write("Year, Make, Model, Length\n1997, Ford, E350, 2.34\n2000, Mercury, Cougar, 2.38"); 
Response.End(); 

Excel doit comprendre que "l'année", "faire", etc doivent tous être différentes colonnes. Cela ne semble pas fonctionner avec le csv que je crée, tout est juste dans la même colonne. Il apparaît comme ceci:

http://oi54.tinypic.com/2evyb0k.jpg

La seule façon de le faire fonctionner avec Excel est d'utiliser le « Assistant Importation de texte ». Ensuite, tout se présente dans différentes colonnes comme il se doit. Comme je l'ai dit ce dont j'ai besoin est de créer une feuille de calcul (il n'a pas besoin d'être csv), il devrait être facile pour l'utilisateur d'ouvrir dans Excel ou tout ce qu'ils utilisent pour commencer à travailler avec elle. Comment résoudriez-vous cela? Merci!

Répondre

1

Je ne sais pas pourquoi il ne fonctionne pas comme ça - il fait pour moi, mais un essai minimum citant les données:

Response.Write("\"Year\", \"Make\", \"Model\", \"Length\"\n\"1997\", \"Ford\", \"E350\", \"2.34\"\n\"2000\", \"Mercury\", \"Cougar\", \"2.38\""); 

Excel peut également importer XML, google "< mso application progid? = "Excel.Sheet"? > "pour le format. Ou simplement enregistrer une feuille de calcul Excel comme XML pour voir un exemple. Les fichiers XML Excel peuvent être nommés ".xls" et pourront les ouvrir directement.

Enfin, vous pouvez utiliser NPOI .NET pour manipuler des feuilles de calcul Excel dans le format natif: http://npoi.codeplex.com/

Pour XML, vous pouvez également utiliser une classe wrapper je l'ai écrit qui encapsule cela dans un modèle simple objet C#: http://snipt.org/lLok/

Voici quelques pseudo-code pour l'utilisation de la classe:

XlsWorkbook book = new XlsWorkbook(); 
XlsWorksheet ws = new XlsWorksheet(); 
ws.Name = "Sheet Name"; 

XlsRow row; 
XlsCell cell; 

foreach (datarow in datasource) { 
    row = new XlsRow(); 
    foreach (datavalue in datarow) { 
    cell = new XlsCell(datavalue.ToString()); 
    cell.DataType = datavalue is numeric ? DataTypes.Numeric | DataTypes.String; 
    row.Cells.Add(cell); 
    } 
    ws.Rows.Add(row); 
} 
wkb.Worksheets.Add(ws); 
Response.Write(wkb.XmlOutput()); 

Ou tout simplement créer votre propre méthode, voici les bases.

Créer l'en-tête de cette façon:

System.Text.StringBuilder sb = new System.Text.StringBuilder(); 
    sb.Append("<?xml version=\"1.0\"?>\n"); 
    sb.Append("<?mso-application progid=\"Excel.Sheet\"?>\n"); 
    sb.Append(
     "<Workbook xmlns=\"urn:schemas-microsoft-com:office:spreadsheet\" "); 
    sb.Append("xmlns:o=\"urn:schemas-microsoft-com:office:office\" "); 
    sb.Append("xmlns:x=\"urn:schemas-microsoft-com:office:excel\" "); 
    sb.Append("xmlns:ss=\"urn:schemas-microsoft-com:office:spreadsheet\" "); 
    sb.Append("xmlns:html=\"http://www.w3.org/TR/REC-html40\">\n"); 
    sb.Append(
     "<DocumentProperties xmlns=\"urn:schemas-microsoft-com:office:office\">"); 
    sb.Append("</DocumentProperties>"); 
    sb.Append(
     "<ExcelWorkbook xmlns=\"urn:schemas-microsoft-com:office:excel\">\n"); 
    sb.Append("<ProtectStructure>False</ProtectStructure>\n"); 
    sb.Append("<ProtectWindows>False</ProtectWindows>\n"); 
    sb.Append("</ExcelWorkbook>\n"); 

De là, ajoutez à votre chaîne de sortie en créant des noeuds en utilisant cette structure de base:

<Worksheet ss:Name="SheetName"> 
    <Table> 
    <Row> 
     <Cell> 
     <Data ss:Type="DataType">Cell A1 Contents Go Here</Data> 
     </Cell> 
    </Row> 
    </Table> 
</Worksheet> 

Dans un <Row>, chaque élément <Cell> crée une nouvelle colonne. Ajoutez un nouveau <Row> pour chaque ligne de feuille de calcul. Le DataType pour <Data> peut être "String" ou "Number".

+0

Doit être un paramètre dans mon Excel 2007 alors que j'ai remarqué maintenant que d'autres fichiers CSV ne s'ouvre pas non plus .. Qu'est-ce qui peut causer ce problème dans Excel, des idées? – Martin

+0

Le problème était que j'avais besoin d'utiliser ";" au lieu de "," séparer les colonnes. Parce que "," est utilisé pour les nombres décimaux ici en Europe. Volonté ";" travailler dans tous les pays ou dois-je créer des versions différentes pour différents pays? – Martin

+0

Le point-virgule ne fonctionne pas ici aux États-Unis. Si la citation des valeurs (et l'utilisation de virgules) ne fonctionne pas, je passerais à XML. Le format est assez simple, je vais éditer ma réponse avec les bases. –

Questions connexes