Создание динамически создаваемого отчета Excel для скачивания

2

У меня есть 2 блока кода, если кто-то может помочь мне собрать их вместе, я получу функциональность, которую я ищу. Первый блок кода загружает gridview для Excel с помощью диалогового окна загрузки, которое я ищу:

Public Overloads Overrides Sub VerifyRenderingInServerForm(ByVal control As Control)
    ' Verifies that the control is rendered 
End Sub

Private Sub ExportToExcel(ByVal filename As String, ByVal gv As GridView, ByVal numOfCol As Integer)
    Response.Clear()
    Response.Buffer = True
    Response.AddHeader("content-disposition", String.Format("attachment; filename={0}", filename))
    Response.Charset = ""
    Response.ContentType = "application/vnd.ms-excel"
    Dim sw As New StringWriter()
    Dim hw As New HtmlTextWriter(sw)

    gv.AllowPaging = False
    gv.DataBind()

    'Change the Header Row back to white color 
    gv.HeaderRow.Style.Add("background-color", "#FFFFFF")

    For i As Integer = 0 To numOfCol - 1
        gv.HeaderRow.Cells(i).Style.Add("background-color", "blue")
        gv.HeaderRow.Cells(i).Style.Add("color", "#FFFFFF")

    Next

    For i As Integer = 0 To gv.Rows.Count - 1
        Dim row As GridViewRow = gv.Rows(i)

        'Change Color back to white 
        row.BackColor = System.Drawing.Color.White

        For j As Integer = 0 To numOfCol - 1
            row.Cells(j).Style.Add("text-align", "center")
        Next


        'Apply text style to each Row 
        row.Attributes.Add("class", "textmode")

        'Apply style to Individual Cells of Alternating Row 
        If i Mod 2 <> 0 Then

            For j As Integer = 0 To numOfCol - 1
                row.Cells(j).Style.Add("background-color", "#CCFFFF")
                row.Cells(j).Style.Add("text-align", "center")
                '#C2D69B
                'row.Cells(j).Style.Add("font-size", "12pt")
            Next

        End If
    Next
    gv.RenderControl(hw)

    'style to format numbers to string 
    Dim style As String = "<style> .textmode { mso-number-format:\@; } </style>"
    Response.Write(style)
    Response.Output.Write(sw.ToString())
    Response.Flush()
    Response.End()
End Sub

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

Комментарий к предложениям Фрэнка... Фрэнк благодарит за твою помощь, это почти работает для меня. Проблема заключается в сбое кода, если у меня нет фиктивного файла с именем test.xls в корневой папке. И когда я помещаю его туда, он загружает 2 книги test.xls [1] и книгу 2, где test.xls - это пустая книга, а книга 2 - правильный отчет, созданный с помощью динамически созданного. Я не хочу сохранять этот файл в папке eroot, если у меня тоже нет этого, я хочу, чтобы пользователи просто открывали его для своего клиента. Созданный код после использования woorkbook создан... Dim fn As String = "RptCrd_" и "BUNDLE" и ".xls"       Dim eio As String = "~/ContentDisposition/" и fn

    Dim exData As Byte() = File.ReadAllBytes(Server.MapPath(eio))
    Response.AddHeader("content-disposition", String.Format("attachment; filename={0}", fn))
    Response.ContentType = "application/x-msexcel"
    Response.BinaryWrite(exData)
    Response.Flush()
    Response.End()
    releaseObject(xlApp)
    releaseObject(xlWorkBook)
  • 0
    Мне нужна функция, чтобы принять объект книги, а не рабочий лист вместо сетки
  • 0
    Возможно, я не понял вашего вопроса. Я думал, что вы хотите отправить данные в Excel. Это то, что привело меня по пути заголовка ответа.
Показать ещё 2 комментария
Теги:

1 ответ

1
Лучший ответ

Возможно, вам нужно добавить правильный тип контента и заголовок в ответ, чтобы браузер знал, что вы хотите обработать загрузку с помощью Excel. Вероятно, вы положите это после Response.Write(style); звоните.

Попробуйте использовать Google для MIM-типа MS Excel, а также как добавить правильно отформатированный заголовок и тип контента в ответ.

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

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

  byte[] excelData = File.ReadAllBytes(Server.MapPath("test.xls"));

  Response.AddHeader("Content-Disposition", "attachment; filename=test.xls");
  Response.ContentType = "application/x-msexcel";
  Response.BinaryWrite(excelData);
  • 0
    Я очень потерял в этом, мог бы действительно использовать некоторую подробную помощь, если у вас есть время. Если я просто выну свою строку кода, которая читает xlWorksheet.SaveAs (имя файла), это позволит мне сохранить файл в любом месте, но диалоговое окно, которое появляется для этого, спрашивает меня, хочу ли я сохранить как «Книгу 3», что-то вроде странное сообщение для пользователей, чтобы увидеть.
  • 0
    Я отредактировал свой комментарий, включив в него некоторый простой код, который формирует заголовок ответа, который сообщает браузеру, что поступающие данные предназначены для обработки в Excel.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню