【问题标题】:Create csv with asp.net and open in excel用asp.net创建csv并在excel中打开
【发布时间】:2010-10-20 13:40:28
【问题描述】:

我正在使用 Asp.net 创建一个用户可以直接在 excel 中打开的 csv 文件。我希望能够显示下载弹出窗口并让用户选择“使用 Excel 打开”,这将在 excel 中打开文件。

创建 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 需要了解“年份”、“制造”等都应该是不同的列。这似乎不适用于我正在创建的 csv,所有内容都在同一列中。它显示如下:

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

让它与 excel 一起使用的唯一方法是使用“文本导入向导”。然后所有内容都会显示在不同的列中。

正如我所说,我需要的是创建一个电子表格(它不需要是 csv),它应该很容易让用户在 excel 或他们用来开始使用它的任何东西中打开。你会如何解决这个问题?谢谢!

【问题讨论】:

    标签: asp.net excel csv spreadsheet


    【解决方案1】:

    不知道为什么它不能那样工作 - 它对我有用,但至少尝试引用数据:

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

    Excel也可以导入XML,格式google ""。或者只是将 Excel 电子表格另存为 XML 以查看示例。 Excel XML文件可以命名为“.xls”,可以直接打开。

    最后,您可以在 .NET 中使用 NPOI 以原生格式操作 excel 电子表格:http://npoi.codeplex.com/

    对于 XML,您还可以使用我编写的包装类,将其封装在一个简单的 C# 对象模型中:http://snipt.org/lLok/

    以下是使用该类的一些伪代码:

    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());
    

    或者只是创建自己的方法,这里是基础知识。

    以这种方式创建标题:

        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");
    

    从那里,通过使用此基本结构创建节点来添加到您的输出字符串:

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

    &lt;Row&gt; 中,每个&lt;Cell&gt; 元素都会创建一个新列。为每个电子表格行添加一个新的&lt;Row&gt;&lt;Data&gt;DataType 可以是“字符串”或“数字”。

    【讨论】:

    • 必须是我的 Excel 2007 中的一个设置,因为我现在注意到其他 csv 文件也无法打开。在 Excel 中什么可能导致这个问题,有什么想法吗?
    • 问题是我需要使用“;”而不是“,”来分隔列。因为“,”在欧洲用于十进制数。将要 ”;”在所有国家/地区工作还是需要为不同国家/地区创建不同的版本?
    • 分号在我们这里不起作用。如果引用值(并使用逗号)不起作用,我会切换到 XML。格式很简单,我将用基础知识来编辑我的回复。
    猜你喜欢
    • 2012-10-09
    • 2011-06-26
    • 2014-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-01-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多