экспортировать данные сетки - PullRequest
       21

экспортировать данные сетки

1 голос
/ 10 сентября 2009

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

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

Ответы [ 7 ]

1 голос
/ 10 сентября 2009

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

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

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

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

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

Edit: Вам нужно будет создать шаблон файла 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);
}
1 голос
/ 01 марта 2012

При экспорте в 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();
1 голос
/ 10 сентября 2009

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

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

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

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

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

0 голосов
/ 01 марта 2012

Этот метод переходит прямо в формат 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
0 голосов
/ 06 мая 2010

Я использовал 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;
    }
0 голосов
/ 10 сентября 2009
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 и color. Это также сделает сортируемые заголовки столбцов похожими на ссылки. Когда я использовал это, я написал собственный анализатор, чтобы убрать все ненужные стили, чтобы получить только необработанные данные. Я оставлю эту задачу на ваше усмотрение, поскольку она специфична для каждой сетки.

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

0 голосов
/ 10 сентября 2009

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

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

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

...