2010-04-06 2 views
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

Мне нужна функция, чтобы принимать объект рабочей книги НЕ рабочий лист вместо GridView –

+0

Может быть, я не понял ваш вопрос. Я думал, вы хотите отправить данные в Excel. Это то, что привело меня по пути заголовка ответа. –

+0

Я просто использовал сохраненную таблицу в качестве теста, чтобы показать, как сформулировать заголовок ответа, который браузер интерпретирует как электронную таблицу MS Excel. –

ответ

1

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

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

Я просто бросил некоторый код, чтобы вытащить загрузку в браузер, чтобы он мог обрабатывать его как электронную таблицу 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», которая является wierd для пользователей. –

+0

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

+0

Фрэнк благодарит за помощь, это почти работает для меня. Пожалуйста, прочитайте отредактированный вопрос –

Смежные вопросы