экспорт данных gridview

Как лучше всего экспортировать сетку в электронную таблицу Excel? Это кажется простым

за исключением того, что у моего Gridview нет атрибута экспорта. Как это сделать быстрее всего?


person Eric    schedule 10.09.2009    source источник
comment
Вероятно, это должно быть закончено для суперпользователя   -  person G Gordon Worley III    schedule 10.09.2009
comment
Я не согласен, если он хочет делать это программно. Я думаю, что это так.   -  person Brian MacKay    schedule 10.09.2009
comment
да, Брайан. Я хочу это программно.   -  person Eric    schedule 10.09.2009


Ответы (7)


При экспорте в Excel Напишите этот код в событии btnexporttoExcel Click.

    string attachment = "attachment; filename=Export.xls";

    Response.ClearContent();

    Response.AddHeader("content-disposition", attachment);

    Response.ContentType = "application/ms-excel";

    StringWriter sw = new StringWriter();

    HtmlTextWriter htw = new HtmlTextWriter(sw);

    // Create a form to contain the grid

    HtmlForm frm = new HtmlForm();

   gv.Parent.Controls.Add(frm);

    frm.Attributes["runat"] = "server";

    frm.Controls.Add(gv);

    frm.RenderControl(htw);



    //GridView1.RenderControl(htw);

    Response.Write(sw.ToString());

    Response.End();
person ankit rajput    schedule 01.03.2012

Возможно, для этого есть что-то, но если вы хотите сделать это самостоятельно, вы можете просто написать код, который просматривает коллекцию GridView.Rows, а затем коллекцию GridViewRow.Cells внутри нее.

Создать CSV-файл оттуда должно быть довольно легко, и Excel без проблем его прочитает.

Файлы CSV - это просто текстовые файлы со значениями внутри кавычек, разделенными запятыми. Нравится:

"value", "value", "value"
"value", "value", "value"

Вы можете просто открыть Блокнот и собрать его вручную, чтобы попробовать.

person Brian MacKay    schedule 10.09.2009

Я делал это несколько раз. У Excel есть версия XML. Он заканчивается расширением .xml, но вы можете просто изменить расширение файла на .xls, и файл в формате XML откроется в Excel.

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

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

Как только вы откроете файл Excel в формате xml, вы сравнительно легко определите необходимый XML. Сложнее всего понять, как ячейки ссылаются на параметры форматирования, которые находятся в верхней части файла XML.

Удачи, дайте мне знать, если вам нужны дополнительные разъяснения.

Изменить: вам нужно будет создать файл Excel шаблона только один раз, чтобы получить представление о необходимом xml, который вам нужно сгенерировать. После того, как вы сгенерировали xml, используйте следующий код, чтобы отправить его пользователю:

string fileName = "ExportedFile.xls";
Response.Clear();
Response.Buffer = true;
Response.ContentType = "text/xml";
Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
ExportToExcel(HttpContext.Current.Response.OutputStream, testUID);
Response.End();



public static void ExportToExcel(Stream outputStream)
{
    XmlTextWriter xmlSink = new XmlTextWriter(outputStream, Encoding.Default);

    //ExcelHeaderString and ExcelStylesString are from the template
    xmlSink.WriteRaw(ExcelHeaderString);
    xmlSink.WriteRaw(ExcelStylesString);

    //write your elements here
    xmlSink.WriteElement("YourElements");

    //ExcelFooterString is from the template
    xmlSink.WriteRaw(ExcelFooterString);
}
person Chris    schedule 10.09.2009
comment
Моя проблема в том, что мне придется делать это на каждой машине, верно? Мне пришлось бы создать файл Excel на каждой машине. Это приложение будет использоваться в масштабах компании. - person Eric; 10.09.2009
comment
Я думал, вы запрограммируете это в код, содержащий GridView. Меня немного смущает ваше заявление. Вы создаете веб-приложение или настольное приложение? - person Chris; 10.09.2009
comment
да. это правильно. Я попытаюсь это запрограммировать. Это веб-приложение. Возможно, я запутался. но вы сказали, что обычно вам нужно создать файл Excel в Excel. Мне пришлось бы делать это на каждом компьютере, на котором используется это приложение, верно? - person Eric; 10.09.2009
comment
Нет, я говорил вам сначала создать файл Excel с шаблоном, чтобы вы могли почувствовать необходимый формат XML. Затем я бы статически сохранил строку верхнего и нижнего колонтитула в вашей программе, чтобы вы могли выводить их по запросу. Все остальные файлы будут сгенерированы динамически. Я разместил образец кода. - person Chris; 10.09.2009

Эта библиотека для .net очень хорошо зарекомендовала себя в наших случаях использования.

Эта библиотека позволяет создавать книги Excel с использованием XML, она полностью построена на C # и не требует установки Excel для создания файлов. Он предоставляет простую объектную модель для создания рабочих книг XML.

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

person Ken Browning    schedule 10.09.2009

Этот метод переходит прямо в формат Excel, не требуя установки XML на сервере или использования XML.

        Protected Sub ExportToExcel()

        Dim gv1 As GridView = FindControlRecursive(objPlaceHolder, "GridView1")
        If Not gv1 Is Nothing Then
            Response.ClearHeaders()
            Response.ClearContent()

            ' Set the content type to Excel
            Response.ContentType = "application/vnd.ms-excel"

            ' make it open the save as dialog
            Response.AddHeader("content-disposition", "attachment; filename=ExcelExport.xls")

            'Turn off the view state 
            Me.EnableViewState = False

            'Remove the charset from the Content-Type header 
            Response.Charset = String.Empty

            Dim myTextWriter As New System.IO.StringWriter
            Dim myHtmlTextWriter As New System.Web.UI.HtmlTextWriter(myTextWriter)
            Dim frm As HtmlForm = New HtmlForm()
            Controls.Add(frm)
            frm.Controls.Add(gv1)

            'Get the HTML for the control 
            frm.RenderControl(myHtmlTextWriter)

            'Write the HTML to the browser 
            Response.Write(myTextWriter.ToString())
            'End the response 
            Response.End()
        End If
    End Sub

Private Function FindControlRecursive(ByVal root As Control, ByVal id As String) As Control
    If root.ID = id Then
        Return root
    End If
    Dim c As Control
    For Each c In root.Controls
        Dim t As Control = FindControlRecursive(c, id)
        If Not t Is Nothing Then
            Return t
        End If
    Next
    Return Nothing
End Function
person EfficionDave    schedule 01.03.2012

Я использовал CarlosAg.ExcelXmlWriter ссылку.

Я перебрал все GridViews HeaderCells, а затем все ряды. Единственное, что если вы разрешаете разбиение на страницы и у вас более одной страницы, вам нужно установить для PageSize высокое значение (я установил 10000000), затем снова DataBind GridView и выполнять свою работу. После этого верните старое значение PageSize. Если кто-то знает лучшее решение, милости просим.

РЕДАКТИРОВАТЬ: попытка / уловка существует, потому что по какой-то причине невозможно проверить тип элемента управления, а затем преобразовать его в Label или LinkButton ==> control.GetType().

Вот мой код.

 public static Workbook CreateWorkbook(GridView gridView)
    {
        int pageSize = gridView.PageSize;
        gridView.PageSize = 10000000;
        gridView.DataBind();

        Workbook workbook = new Workbook();
        Worksheet sheet = workbook.Worksheets.Add("Export");

        WorksheetStyle style = workbook.Styles.Add("headerStyle");
        style.Font.Bold = true;
        style = workbook.Styles.Add("defaultStyle");
        style.Alignment.WrapText = true;
        style = workbook.Styles.Add("infoStyle");
        style.Font.Color = "Red";
        style.Font.Bold = true;

        sheet.Table.Rows.Add(new WorksheetRow());

        WorksheetRow headerRow = new WorksheetRow();
        foreach (DataControlFieldHeaderCell cell in gridView.HeaderRow.Cells)
        {
            if (!string.IsNullOrEmpty(cell.Text))
                headerRow.Cells.Add(cell.Text, DataType.String, "headerStyle");
            else
                foreach (Control control in cell.Controls)
                {
                    LinkButton linkButton = new LinkButton();
                    try
                    {
                        linkButton = (LinkButton)control;
                    }
                    catch { }

                    if (!string.IsNullOrEmpty(linkButton.Text))
                        headerRow.Cells.Add(linkButton.Text, DataType.String, "headerStyle");
                    else
                    {
                        Label label = new Label();
                        try
                        {
                            label = (Label)control;
                        }
                        catch { }
                        if (!string.IsNullOrEmpty(label.Text))
                            headerRow.Cells.Add(label.Text, DataType.String, "headerStyle");
                    }
                }
        }

        sheet.Table.Rows.Add(headerRow);

        foreach (GridViewRow row in gridView.Rows)
        {
            WorksheetRow wrow = new WorksheetRow();
            foreach (TableCell cell in row.Cells)
            {
                foreach (Control control in cell.Controls)
                {
                    if (control.GetType() == typeof(Label))
                    {
                        wrow.Cells.Add(((Label)control).Text, DataType.String, "defaultStyle");
                    }
                }
            }
            sheet.Table.Rows.Add(wrow);
        }

        gridView.PageSize = pageSize;

        return workbook;
    }
person Kosta    schedule 06.05.2010

Private exportToExcel As Boolean = False

Private Sub LoadInExcel()
    Me.Response.ClearContent()
    Me.Response.AddHeader("content-disposition", "attachment; filename=MyFile.xls")
    Me.Response.ContentType = "application/ms-excel"
    Dim sw1 As New IO.StringWriter
    Dim htw1 As HtmlTextWriter = New HtmlTextWriter(sw1)
    GridView1.RenderControl(htw1)
    Response.Write(sw1.ToString())
    Response.End()
End Sub

Public Overrides Sub VerifyRenderingInServerForm(ByVal control As Control)
    ' Confirms that an HtmlForm control is rendered for the specified ASP.NET
    ' server control at run time.
End Sub

Protected Overrides Sub Render(ByVal writer As System.Web.UI.HtmlTextWriter)
    If exportToExcel Then
        LoadInExcel()
    End If

    MyBase.Render(writer)
End Sub

Protected Sub btnPrint_Click(ByVal sender As Object, ByVal e As System.EventArgs) Handles btnPrint.Click
    exportToExcel = True
End Sub

У вас должен быть установлен Excel и ссылки на библиотеки взаимодействия Office в вашем проекте. Добавлять:

Импортирует Microsoft.Office.Core, Импортирует Microsoft.Office.Interop.

Приведенное выше решение берет вид сетки и извлекает из него html. Потом пишет в excel. HTML-код, поступающий из сетки, будет включать атрибуты стиля, такие как отступы и цвет. Это также сделает сортируемые заголовки столбцов похожими на ссылки. Когда я использовал это, я написал собственный синтаксический анализатор, чтобы удалить все нежелательные стили, чтобы предоставить мне только необработанные данные. Я оставлю эту задачу вам, поскольку она специфична для каждой сетки.

Очень важно включить переопределение в VerifyRenderingInServerForm, даже если внутри него нет никакого кода.

person Bradley    schedule 10.09.2009
comment
Мне нравится, к чему вы клоните. однако мне не разрешено импортировать microsoft.office.core - person Eric; 10.09.2009
comment
где я могу получить файлы Microsoft Office? - person Eric; 10.09.2009
comment
@Eric - их можно получить, установив Office на том же компьютере. Однако следует отметить, что запуск Office на сервере обычно не считается наилучшей практикой. - person rjzii; 11.09.2009
comment
1. Для этого метода вам не нужен Microsoft Office на машине. 2. Никогда не запускайте на сервере компоненты Office, не относящиеся к SharePoint и MOSS, это нарушение лицензирования и риск для производительности. - person andrewbadera; 29.09.2009
comment
Я согласен с тем, что установка Office на рабочий сервер - плохая практика. Иногда мы нарушаем правила, чтобы получить нужные результаты в отведенные нам сроки. Приведенное выше решение XML - лучший ответ, но создание шаблонов и синтаксический анализ XML может быть обременительным. - person Bradley; 09.12.2009