用asp.net创建csv并在excel中打开

时间:2010-10-20 13:40:29

标签: asp.net excel csv spreadsheet

我正在使用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需要了解“Year”,“Make”等应该都是不同的列。这似乎与我正在创建的csv无关,一切都在同一列中。它显示如下:

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

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

正如我所说的,我需要的是创建一个电子表格(它不需要是csv),用户可以很容易地在excel中打开或者用它来开始使用它。你怎么解决这个问题?谢谢!

1 个答案:

答案 0 :(得分:1)

不确定为什么它不起作用 - 它对我有用,但至少尝试引用数据:

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

Excel也可以导入XML,谷歌“<?mso-application progid =”Excel.Sheet“?>”对于格式。或者只是将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>

<Row>中,每个<Cell>元素都会创建一个新列。为每个电子表格行添加新的<Row>DataType的{​​{1}}可以是“字符串”或“数字”。