Создать CSV с asp.net и открыть в Excel - PullRequest
0 голосов
/ 20 октября 2010

Я использую Asp.net для создания CSV-файла, который пользователь может открыть непосредственно в Excel. Я хочу, чтобы можно было показать всплывающее окно загрузки и чтобы пользователь мог выбрать «Открыть с помощью 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 или что бы он ни использовал, чтобы начать работать с ним. Как бы вы решили это? Спасибо!

1 Ответ

1 голос
/ 20 октября 2010

Не уверен, почему это так не работает - это работает для меня, но как минимум попробуйте процитировать данные:

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

Excel также может импортировать XML, Google "<? Mso-application progid =" Excel.Sheet "?>" Для формата. Или просто сохраните таблицу Excel в формате XML, чтобы увидеть пример. XML-файлы Excel могут называться «.xls», и они смогут открывать их напрямую.

Наконец, вы можете использовать NPOI в .NET для работы с электронными таблицами 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 для <Data> может быть «Строка» или «Число».

...