Генерация файла Excel в [закрытом] ASP.NET

99
задан pnuts 20 March 2015 в 23:30
поделиться

23 ответа

Профессионалы CSV

:

  • Простой

Недостатки:

  • Это не может работать в других локалях или в различных конфигурациях Excel (т.е. Разделитель элементов списка)
  • не Может применить форматирование, формулы, и т.д.

Профессионалы HTML

:

  • Все еще довольно Простой
  • Поддержки простое форматирование и формулы

Недостатки:

  • необходимо назвать файл как xls, и Excel может предупредить Вас об открытии non native Excel file
  • One worksheet per workbook

OpenXML (Office 2007.XLSX)

Pros:

  • Native формат
  • Excel Поддерживает все функции Excel
  • , не Делают , требуют , копия установки Excel
  • Может генерировать Сводные таблицы
  • , Может быть сгенерирован с помощью проекта EPPlus

с открытым исходным кодом Недостатки:

  • Ограниченная совместимость вне Excel 2007 (не должна быть проблема в наше время)
  • Сложный, если Вы не используете сторонний компонент

SpreadSheetML (открытый формат XML)

Профессионалы:

  • Простой по сравнению с собственными форматами Excel
  • Поддерживает большинство функций Excel: форматирование, стили, формулы, несколько листов на рабочую книгу
  • Excel не должен быть установлен для использования его
  • , Никакие сторонние необходимые библиотеки - просто не выписывают документы xml
  • , может быть открыт Недостатками Excel XP/2003/2007

:

  • Отсутствие хорошей документации
  • Не поддерживаемый в более старых версиях Excel (пред2000)
  • , Только для записи, в этом, как только Вы открываете его и вносите изменения от Excel, это преобразовывается в собственный Excel.

XLS (сгенерированный сторонним компонентом)

Профессионалы:

  • Генерируют собственный файл Excel со всем форматированием, формулами, и т.д.

Недостатки:

  • Стоившие деньги
  • Добавляют зависимости

профессионалы COM Interop

:

  • Пользуется собственными библиотеками Microsoft
  • поддержка Read собственных документов

Недостатки:

  • Очень медленный
  • проблемы соответствия Зависимости/версии
  • Параллелизм/проблемы целостности данных для веб-использования при чтении
  • Очень медленный
  • Масштабирующиеся проблемы для веб-использования (отличающийся от параллелизма): потребность создать много экземпляров тяжелого приложения Excel на сервере
  • Требует, чтобы Windows
  • Did I упомянул, что это медленно?
131
ответ дан Joel Coehoorn 24 November 2019 в 05:02
поделиться

Если необходимо использовать Excel вместо файла CSV, необходимо будет использовать автоматизацию OLE на Excel, инстанцируют один сервер. Самый легкий способ сделать это должно иметь шаблонный файл и программно заполнить его с данными. Вы сохраняете его в другой файл.

Подсказки:

  • не делают этого в интерактивном режиме. Сделайте, чтобы пользователь начал процесс и затем отправил страницу со ссылкой на файл. Это смягчает потенциальные проблемы производительности, в то время как электронная таблица сгенерирована.
  • Использование шаблон, поскольку я описал прежде. Это облегчает изменять его.
  • Удостоверяются, что Excel установлен не открыться диалоговые окна. На веб-сервере это подвесит целый экземпляр Excel.
  • Сохраняют экземпляр Excel на отдельном сервере, предпочтительно позади брандмауэра, таким образом, он не представлен как потенциальная дыра в системе безопасности.
  • Следят за использованием ресурсов. Генерация spreadhseet по интерфейсу автоматизации OLE (PIA's просто контейнеры по этому) является довольно тяжелым процессом. Если необходимо масштабировать это к высоким объемам данных, Вы, возможно, должны быть несколько умными со своей архитектурой.

Некоторые 'типы пантомимы использования для обманывания Excel в открытие HTML-таблицы' подходы работали бы, если Вы не возражаете против формата файла, являющегося немного основным. Эти подходы также обманывают ЦП тяжелая работа прочь на клиент. Если Вы хотите прекрасное-graned управление форматом электронной таблицы, необходимо будет, вероятно, использовать сам Excel для генерации файла, как описано выше.

-5
ответ дан ConcernedOfTunbridgeWells 24 November 2019 в 05:02
поделиться

Я просто создал бы файл CSV на основе данных, потому что я вижу, что как самое чистое, и Excel имеет хорошую поддержку его. Но если Вы требуете более гибкого формата, я уверен, что существуют некоторые сторонние инструменты для генерации реальных файлов Excel.

0
ответ дан GEOCHET 24 November 2019 в 05:02
поделиться

Одна из проблем, которые я имею, натыкалась на использование одного из решений, предложенных, выше которого подобны , этот ответ - то, что при выставлении содержания как вложения (что я нашел, чтобы быть самым чистым решением для браузеров немс), затем откройте его в Excel 2000-2003, его типом является "Excel Web Page" и не собственный документ Excel.

Тогда необходимо объяснить пользователям, как использовать, "Сохраняют как тип" из Excel для преобразования его в документ Excel. Это - боль, если пользователи должны отредактировать этот документ и затем повторно загрузить его на Ваш сайт.

Моя рекомендация состоит в том, чтобы использовать CSV. Это просто и если пользователи действительно открывают его из Excel, Excel, по крайней мере, запрашивает их сохранять он в его собственном формате.

0
ответ дан Community 24 November 2019 в 05:02
поделиться

Можно, конечно, всегда идти для третьего лица компоненты. Лично, у меня был хороший опыт с Spire.XLS http://www.e-iceblue.com/xls/xlsintro.htm

, компонент довольно прост в использовании в рамках Вашего приложения:

        Workbook workbook = new Workbook();

        //Load workbook from disk.
        workbook.LoadFromFile(@"Data\EditSheetSample.xls");
        //Initailize worksheet
        Worksheet sheet = workbook.Worksheets[0];

        //Writes string
        sheet.Range["B1"].Text = "Hello,World!";
        //Writes number
        sheet.Range["B2"].NumberValue = 1234.5678;
        //Writes date
        sheet.Range["B3"].DateTimeValue = System.DateTime.Now;
        //Writes formula
        sheet.Range["B4"].Formula = "=1111*11111";

        workbook.SaveToFile("Sample.xls");
0
ответ дан Nasir 24 November 2019 в 05:02
поделиться

Принятие, которое это для интранет, где можно установить полномочия и передать под мандат IE, можно генерировать сторону клиента рабочей книги с JScript/VBScript ведущий Excel . Это дает Вам собственное форматирование Excel без стычки попытки автоматизировать Excel на сервере.

я не уверен, что действительно больше рекомендовал бы этот подход кроме справедливо нишевых сценариев, но это было довольно распространено во время классических расцветов ASP.

0
ответ дан Mark Brackett 24 November 2019 в 05:02
поделиться

Лучший метод я видел отчеты Excel, должен выписать данные в XML с расширением XML и передать его потоком клиентам с корректным типом контента. (application/xls)

Это работает на любой отчет, который требует основного форматирования и позволяет Вам выдерживать сравнение с существующими электронными таблицами при помощи текстовых инструментов сравнения.

0
ответ дан Bravax 24 November 2019 в 05:02
поделиться

Единственный пуленепробиваемый способ избежать "Похоже, что эти числа хранятся, поскольку текст" зеленые треугольники должен использовать Открыть формат XML. Стоит использовать его, только избежать неизбежных зеленых треугольников.

0
ответ дан hova 24 November 2019 в 05:02
поделиться

у человека, в .net, я предполагаю Вас, мог быть компонент, который мог сделать это, но у классического asp я уже сделал его составляющий таблицу HTML и изменяющий пантомиму tipe страницы к vnd/msexcel. Я предполагаю, что, если Вы используете gridview и изменяете тип пантомимы, возможно, он должен работать, потому что gridview является таблицей HTML.

0
ответ дан 24 November 2019 в 05:02
поделиться

Я любой идет путем CSV (как описано выше), или чаще в эти дни, я использую Infragistics NetAdvantage для генерации файла. (Очень подавляющее большинство времени, где Infragistics находится в игре, мы просто экспортируем существующий UltraWebGrid, который является по существу решением с одним LOC, если дополнительные тонкие настройки форматирования не необходимы. Мы могли вручную генерировать файл Excel/сильного удара также, но редко существует потребность к.)

0
ответ дан John Rudy 24 November 2019 в 05:02
поделиться

CSV является самым легким путем. Большую часть времени это связано с Excel. Иначе необходимо использовать API автоматизации или формат XML. API и XML не это трудно для использования.

информация о генерации XML для Excel

0
ответ дан Ken 24 November 2019 в 05:02
поделиться

При заполнении GridView данными, можно использовать эту функцию для получения отформатированных данных HTML, но указание на браузер это - файл Excel.

 Public Sub ExportToExcel(ByVal fileName As String, ByVal gv As GridView)

        HttpContext.Current.Response.Clear()
        HttpContext.Current.Response.AddHeader("content-disposition", String.Format("attachment; filename={0}", fileName))
        HttpContext.Current.Response.ContentType = "application/ms-excel"

        Dim sw As StringWriter = New StringWriter
        Dim htw As HtmlTextWriter = New HtmlTextWriter(sw)
        Dim table As Table = New Table

        table.GridLines = gv.GridLines

        If (Not (gv.HeaderRow) Is Nothing) Then
            PrepareControlForExport(gv.HeaderRow)
            table.Rows.Add(gv.HeaderRow)
        End If

        For Each row As GridViewRow In gv.Rows
            PrepareControlForExport(row)
            table.Rows.Add(row)
        Next

        If (Not (gv.FooterRow) Is Nothing) Then
            PrepareControlForExport(gv.FooterRow)
            table.Rows.Add(gv.FooterRow)
        End If

        table.RenderControl(htw)

        HttpContext.Current.Response.Write(sw.ToString)
        HttpContext.Current.Response.End()

    End Sub


    Private Sub PrepareControlForExport(ByVal control As Control)

        Dim i As Integer = 0

        Do While (i < control.Controls.Count)

            Dim current As Control = control.Controls(i)

            If (TypeOf current Is LinkButton) Then
                control.Controls.Remove(current)
                control.Controls.AddAt(i, New LiteralControl(CType(current, LinkButton).Text))

            ElseIf (TypeOf current Is ImageButton) Then
                control.Controls.Remove(current)
                control.Controls.AddAt(i, New LiteralControl(CType(current, ImageButton).AlternateText))

            ElseIf (TypeOf current Is HyperLink) Then
                control.Controls.Remove(current)
                control.Controls.AddAt(i, New LiteralControl(CType(current, HyperLink).Text))

            ElseIf (TypeOf current Is DropDownList) Then
                control.Controls.Remove(current)
                control.Controls.AddAt(i, New LiteralControl(CType(current, DropDownList).SelectedItem.Text))

            ElseIf (TypeOf current Is CheckBox) Then
                control.Controls.Remove(current)
                control.Controls.AddAt(i, New LiteralControl(CType(current, CheckBox).Checked))

            End If

            If current.HasControls Then
                PrepareControlForExport(current)
            End If

            i = i + 1

        Loop

    End Sub
1
ответ дан Eduardo Campañó 24 November 2019 в 05:02
поделиться

Вот отчет что получения по запросу из хранимой процедуры. Результаты экспортируются в Excel. Это использует ADO вместо ADO.NET и причины, почему эта строка

oSheet.Cells(2, 1).copyfromrecordset(rst1)

, Это делает большую часть работы и не доступно в ado.net.

‘Calls stored proc in SQL Server 2000 and puts data in Excel and ‘formats it

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click

        Dim cnn As ADODB.Connection
        cnn = New ADODB.Connection
        cnn.Open("Provider=SQLOLEDB;data source=xxxxxxx;" & _
          "database=xxxxxxxx;Trusted_Connection=yes;")

        Dim cmd As New ADODB.Command


        cmd.ActiveConnection = cnn


        cmd.CommandText = "[sp_TomTepley]"
        cmd.CommandType = ADODB.CommandTypeEnum.adCmdStoredProc
        cmd.CommandTimeout = 0
        cmd.Parameters.Refresh()


        Dim rst1 As ADODB.Recordset
        rst1 = New ADODB.Recordset
        rst1.Open(cmd)

        Dim oXL As New Excel.Application
        Dim oWB As Excel.Workbook
        Dim oSheet As Excel.Worksheet

        'oXL = CreateObject("excel.application")
        oXL.Visible = True
        oWB = oXL.Workbooks.Add
        oSheet = oWB.ActiveSheet

        Dim Column As Integer
        Column = 1

        Dim fld As ADODB.Field
        For Each fld In rst1.Fields

            oXL.Workbooks(1).Worksheets(1).Cells(1, Column).Value = fld.Name
            oXL.Workbooks(1).Worksheets(1).cells(1, Column).Interior.ColorIndex = 15
            Column = Column + 1

        Next fld

        oXL.Workbooks(1).Worksheets(1).name = "Tom Tepley Report"
        oSheet.Cells(2, 1).copyfromrecordset(rst1)
        oXL.Workbooks(1).Worksheets(1).Cells.EntireColumn.AutoFit()


        oXL.Visible = True
        oXL.UserControl = True

        rst1 = Nothing

        cnn.Close()
        Beep()

    End Sub
2
ответ дан Siddharth Rout 24 November 2019 в 05:02
поделиться

Я сделал это пару раз и каждый раз, когда самый легкий путь состоял в том, чтобы просто возвратить CSV (Запятая Разделенное Значение) файл. Excel импортирует его отлично, и это относительно быстро, чтобы сделать.

2
ответ дан Mark Allen 24 November 2019 в 05:02
поделиться

мы экспортируем данные из datagrid для выделений все время. При преобразовании его в HTML, затем пишущий в файл

Response.ContentType = "application/vnd.ms-excel"
    Response.Charset = ""
    Response.AddHeader("content-disposition", "fileattachment;filename=YOURFILENAME.xls")
    Me.EnableViewState = False
    Dim sw As System.IO.StringWriter = New System.IO.StringWriter
    Dim hw As HtmlTextWriter = New HtmlTextWriter(sw)
    ClearControls(grid)
    grid.RenderControl(hw)
    Response.Write(sw.ToString())
    Response.End()

Excel, которым единственный глюк с этим методом был то, что много наших сеток имело кнопки или ссылки в них так, Вам нужно это также:

'needed to export grid to excel to remove link button control and represent as text
Private Sub ClearControls(ByVal control As Control)
    Dim i As Integer
    For i = control.Controls.Count - 1 To 0 Step -1
        ClearControls(control.Controls(i))
    Next i

    If TypeOf control Is System.Web.UI.WebControls.Image Then
        control.Parent.Controls.Remove(control)
    End If

    If (Not TypeOf control Is TableCell) Then
        If Not (control.GetType().GetProperty("SelectedItem") Is Nothing) Then
            Dim literal As New LiteralControl
            control.Parent.Controls.Add(literal)
            Try
                literal.Text = CStr(control.GetType().GetProperty("SelectedItem").GetValue(control, Nothing))
            Catch
            End Try
            control.Parent.Controls.Remove(control)
        Else
            If Not (control.GetType().GetProperty("Text") Is Nothing) Then
                Dim literal As New LiteralControl
                control.Parent.Controls.Add(literal)
                literal.Text = CStr(control.GetType().GetProperty("Text").GetValue(control, Nothing))
                control.Parent.Controls.Remove(control)
            End If
        End If
    End If
    Return
End Sub

я нашел, что где-нибудь, это работает хорошо.

2
ответ дан WACM161 24 November 2019 в 05:02
поделиться

Я лично предпочитаю метод XML. Я возвращу данные из базы данных в Наборе данных, сохраню его к XMl, тогда я создаю xslt файл, который содержит правило преобразования, которое отформатирует надлежащий документ, и простое преобразование XML закончит задание. Большая часть приблизительно этого можно отформатировать ячейки, сделать условное форматирование, заголовки установки и нижние колонтитулы, и даже установить диапазоны печати.

3
ответ дан Mitchel Sellers 24 November 2019 в 05:02
поделиться

так как Excel понимает HTML, который можно просто выписать данным как HTML-таблице во временный файл с .xls расширением, получить FileInfo для файла и унести его назад использование

Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=" + fi.Name);
Response.AddHeader("Content-Length", fi.Length.ToString());
Response.ContentType = "application/octet-stream";
Response.WriteFile(fi.FullName);
Response.End();

, если бы Вы хотели избежать временного файла, Вы могли бы записать в поток в оперативной памяти и записать байты обратно вместо того, чтобы использовать WriteFile

, если заголовок довольной длины опущен, Вы могли бы просто записать HTML обратно непосредственно, но это не может работать правильно все время во всех браузерах

4
ответ дан Steven A. Lowe 24 November 2019 в 05:02
поделиться

На основе ответов, данных, и консультация с коллегами, кажется, что лучшее решение состоит в том, чтобы генерировать или XML-файл или HTML-таблицы и снизить его как вложение. Одно изменение, рекомендуемое моими коллегами, - то, что данные (т.е. HTML-таблицы) могут быть записаны непосредственно в объект Ответа, таким образом избавив от необходимости выписать файл, который может быть неприятным из-за проблем полномочий, конкуренции ввода-вывода, и гарантировав, что запланированная чистка происходит.

Вот отрывок кода... Я еще не проверил это, и я не предоставил весь названный код, но я думаю, что он представляет идею хорошо.

    Dim uiTable As HtmlTable = GetUiTable(groupedSumData)

    Response.Clear()

    Response.ContentType = "application/vnd.ms-excel"
    Response.AddHeader("Content-Disposition", String.Format("inline; filename=OSSummery{0:ddmmssf}.xls", DateTime.Now))

    Dim writer As New System.IO.StringWriter()
    Dim htmlWriter As New HtmlTextWriter(writer)
    uiTable.RenderControl(htmlWriter)
    Response.Write(writer.ToString)

    Response.End()
5
ответ дан Dan Coates 24 November 2019 в 05:02
поделиться

Это - свободная обертка вокруг SpreadML - он работает отлично.

http://www.carlosag.net/Tools/ExcelXmlWriter/

7
ответ дан rp. 24 November 2019 в 05:02
поделиться

При прибытии из Таблица данных :

public static void DataTabletoXLS(DataTable DT, string fileName)
{
    HttpContext.Current.Response.Clear();
    HttpContext.Current.Response.Charset = "utf-16";
    HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("windows-1250");
    HttpContext.Current.Response.AddHeader("content-disposition", string.Format("attachment; filename={0}.xls", fileName));
    HttpContext.Current.Response.ContentType = "application/ms-excel";

    string tab = "";
    foreach (DataColumn dc in DT.Columns)
    {
        HttpContext.Current.Response.Write(tab + dc.ColumnName.Replace("\n", "").Replace("\t", ""));
        tab = "\t";
    }
    HttpContext.Current.Response.Write("\n");

    int i;
    foreach (DataRow dr in DT.Rows)
    {
        tab = "";
        for (i = 0; i < DT.Columns.Count; i++)
        {
            HttpContext.Current.Response.Write(tab + dr[i].ToString().Replace("\n", "").Replace("\t", ""));
            tab = "\t";
        }
        HttpContext.Current.Response.Write("\n");
    }
    HttpContext.Current.Response.End();
}

От Gridview:

public static void GridviewtoXLS(GridView gv, string fileName)
{
    int DirtyBit = 0;
    int PageSize = 0;
    if (gv.AllowPaging == true)
    {
        DirtyBit = 1;
        PageSize = gv.PageSize;
        gv.AllowPaging = false;
        gv.DataBind();
    }

    HttpContext.Current.Response.Clear();
    HttpContext.Current.Response.Charset = "utf-8";
    HttpContext.Current.Response.ContentEncoding = System.Text.Encoding.GetEncoding("windows-1250");
    HttpContext.Current.Response.AddHeader(
        "content-disposition", string.Format("attachment; filename={0}.xls", fileName));
    HttpContext.Current.Response.ContentType = "application/ms-excel";

    using (StringWriter sw = new StringWriter())
    using (HtmlTextWriter htw = new HtmlTextWriter(sw))
    {
        //  Create a table to contain the grid
        Table table = new Table();

        //  include the gridline settings
        table.GridLines = gv.GridLines;

        //  add the header row to the table
        if (gv.HeaderRow != null)
        {
            Utilities.Export.PrepareControlForExport(gv.HeaderRow);
            table.Rows.Add(gv.HeaderRow);
        }

        //  add each of the data rows to the table
        foreach (GridViewRow row in gv.Rows)
        {
            Utilities.Export.PrepareControlForExport(row);
            table.Rows.Add(row);
        }

        //  add the footer row to the table
        if (gv.FooterRow != null)
        {
            Utilities.Export.PrepareControlForExport(gv.FooterRow);
            table.Rows.Add(gv.FooterRow);
        }

        //  render the table into the htmlwriter
        table.RenderControl(htw);

        //  render the htmlwriter into the response
        HttpContext.Current.Response.Write(sw.ToString().Replace("£", ""));
        HttpContext.Current.Response.End();
    }

    if (DirtyBit == 1)
    {
        gv.PageSize = PageSize;
        gv.AllowPaging = true;
        gv.DataBind();
    }
}

private static void PrepareControlForExport(Control control)
{
    for (int i = 0; i < control.Controls.Count; i++)
    {
        Control current = control.Controls[i];
        if (current is LinkButton)
        {
            control.Controls.Remove(current);
            control.Controls.AddAt(i, new LiteralControl((current as LinkButton).Text));
        }
        else if (current is ImageButton)
        {
            control.Controls.Remove(current);
            control.Controls.AddAt(i, new LiteralControl((current as ImageButton).AlternateText));
        }
        else if (current is HyperLink)
        {
            control.Controls.Remove(current);
            control.Controls.AddAt(i, new LiteralControl((current as HyperLink).Text));
        }
        else if (current is DropDownList)
        {
            control.Controls.Remove(current);
            control.Controls.AddAt(i, new LiteralControl((current as DropDownList).SelectedItem.Text));
        }
        else if (current is CheckBox)
        {
            control.Controls.Remove(current);
            control.Controls.AddAt(i, new LiteralControl((current as CheckBox).Checked ? "True" : "False"));
        }

        if (current.HasControls())
        {
            Utilities.Export.PrepareControlForExport(current);
        }
    }
}
16
ответ дан Jimi 24 November 2019 в 05:02
поделиться

Можно произвести данные как ячейки таблицы HTML, придерживаться .xls или .xlsx расширение на нем, и Excel откроет его, как будто это был собственный документ. Можно даже сделать некоторое ограниченное форматирование и вычисления формулы этот путь, таким образом, это намного более мощно, чем CSV. Кроме того, вывод таблицы HTML должно быть довольно легко сделать от веб-платформы как ASP.NET;)

при необходимости в нескольких рабочих листах или названных рабочих листах в Excel Workbook можно сделать что-то подобное с помощью XML-схемы, названной SpreadSheetML. Это не новый формат, который поставлялся с Office 2007, но чем-то совершенно другим, которое еще работает Excel 2000. Самый легкий способ объяснить, как это работает, с примером:

<?xml version="1.0"?>
<?mso-application progid="Excel.Sheet"?> 
<Workbook xmlns="urn:schemas-microsoft-com:office:spreadsheet"
        xmlns:o="urn:schemas-microsoft-com:office:office"
        xmlns:x="urn:schemas-microsoft-com:office:excel"
        xmlns:ss="urn:schemas-microsoft-com:office:spreadsheet"
        xmlns:html="http://www.w3.org/TR/REC-html40">
<DocumentProperties xmlns="urn:schemas-microsoft-com:office:office">
      <Author>Your_name_here</Author>
      <LastAuthor>Your_name_here</LastAuthor>
      <Created>20080625</Created>
      <Company>ABC Inc</Company>
      <Version>10.2625</Version>
</DocumentProperties>
<ExcelWorkbook xmlns="urn:schemas-microsoft-com:office:excel">
        <WindowHeight>6135</WindowHeight>
        <WindowWidth>8445</WindowWidth>
        <WindowTopX>240</WindowTopX>
        <WindowTopY>120</WindowTopY>
        <ProtectStructure>False</ProtectStructure>
        <ProtectWindows>False</ProtectWindows>
</ExcelWorkbook>

<Styles>
      <Style ss:ID="Default" ss:Name="Normal">
            <Alignment ss:Vertical="Bottom" />
            <Borders />
            <Font />
            <Interior />
            <NumberFormat />
            <Protection />
      </Style>
</Styles>

<Worksheet ss:Name="Sample Sheet 1">
<Table ss:ExpandedColumnCount="2" x:FullColumns="1" x:FullRows="1" ID="Table1">
<Column ss:Width="150" />
<Column ss:Width="200" />
<Row>
      <Cell><Data ss:Type="Number">1</Data></Cell>
      <Cell><Data ss:Type="Number">2</Data></Cell>
</Row>
<Row>
      <Cell><Data ss:Type="Number">3</Data></Cell>
      <Cell><Data ss:Type="Number">4</Data></Cell>
</Row>
<Row>
      <Cell><Data ss:Type="Number">5</Data></Cell>
      <Cell><Data ss:Type="Number">6</Data></Cell>
</Row>
<Row>
      <Cell><Data ss:Type="Number">7</Data></Cell>
      <Cell><Data ss:Type="Number">8</Data></Cell>
</Row>
</Table>
</Worksheet>

<Worksheet ss:Name="Sample Sheet 2">
<Table ss:ExpandedColumnCount="2" x:FullColumns="1" x:FullRows="1" ID="Table2">
<Column ss:Width="150" />
<Column ss:Width="200" />
<Row>
      <Cell><Data ss:Type="String">A</Data></Cell>
      <Cell><Data ss:Type="String">B</Data></Cell>
</Row>
<Row>
      <Cell><Data ss:Type="String">C</Data></Cell>
      <Cell><Data ss:Type="String">D</Data></Cell>
</Row>
<Row>
      <Cell><Data ss:Type="String">E</Data></Cell>
      <Cell><Data ss:Type="String">F</Data></Cell>
</Row>
<Row>
      <Cell><Data ss:Type="String">G</Data></Cell>
      <Cell><Data ss:Type="String">H</Data></Cell>
</Row>
</Table>
</Worksheet>
</Workbook> 
38
ответ дан Joel Coehoorn 24 November 2019 в 05:02
поделиться

Просто избегайте COM Interop через Microsoft. Office. Пространство имен Interop. Это так чертовски медленно и ненадежно и неприступно. Не применимый для мазохистов.

1
ответ дан Andrei Rînea 24 November 2019 в 05:02
поделиться

Вот решение, которое передает данные в виде CSV. Быстро, чисто и просто, он обрабатывает запятые при вводе.

public static void ExportToExcel(DataTable data, HttpResponse response, string fileName)
{
    response.Charset = "utf-8";
    response.ContentEncoding = System.Text.Encoding.GetEncoding("windows-1250");
    response.Cache.SetCacheability(HttpCacheability.NoCache);
    response.ContentType = "text/csv";
    response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);

    for (int i = 0; i < data.Columns.Count; i++)
    {
       response.Write(data.Columns[i].ColumnName);
       response.Write(i == data.Columns.Count - 1 ? "\n" : ",");
    }        
    foreach (DataRow row in data.Rows)
    {
        for (int i = 0; i < data.Columns.Count; i++)
        {
            response.Write(String.Format("\"{0}\"", row[i].ToString()));
            response.Write(i == data.Columns.Count - 1 ? "\n" : ",");
        }
    }

    response.End();
}
0
ответ дан 24 November 2019 в 05:02
поделиться
Другие вопросы по тегам:

Похожие вопросы: