Вопрос

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

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

Это было полезно?

Решение

При экспорте в 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();

Другие советы

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

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

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

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

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

Я делал это несколько раз.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);
}

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

  

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

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

Этот метод переходит прямо в формат 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

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

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

РЕДАКТИРОВАТЬ: Try / catch есть, потому что по какой-то причине невозможно проверить тип элемента управления и затем привести к метке или 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;
    }
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. Затем пишет это, чтобы преуспеть. HTML-код из сетки будет включать такие атрибуты стиля, как padding & amp; цвет. Это также сделает сортируемые заголовки столбцов похожими на ссылки. Когда я использовал это, я написал собственный анализатор, чтобы убрать все ненужные стили, чтобы получить только необработанные данные. Я оставлю эту задачу на ваше усмотрение, поскольку она специфична для каждой сетки.

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top