2016-01-11 3 views
0

Следующий код - моя текущая попытка открыть некоторые данные в excel с помощью кнопки веб-сайта в VB.Net. Я хотел бы, чтобы данные отображали barebones, но форматирование из таблицы на веб-сайте всегда следует. Пейджинг и цвета делают данные почти невозможными для чтения и могут видеть только первую страницу данных. Быстрые исправления? Я пробовал много вещей, которые я нашел здесь, но безрезультатно.Экспорт данных в Excel из VB.Net

Private Sub DownloadExcel() 

    Response.Clear() 

    'Dim dt As DataTable = TryCast(ViewState("GridData"), DataTable) 

    Grid_Bad_Meters.AllowPaging = False 
    Grid_Bad_Meters.AllowSorting = False 

    'Grid_Bad_Meters.DataSource = dt 
    'Grid_Bad_Meters.DataBind() 

    Dim sfile As String = "Communication_Failures" & Now.Ticks 

    Response.AddHeader("content-disposition", "attachment;filename=" & sfile & ".xls") 
    Response.Charset = "" 

    ' If you want the option to open the Excel file without saving then 
    ' comment out the line below 
    ' Response.Cache.SetCacheability(HttpCacheability.NoCache); 
    Response.ContentType = "application/vnd.ms-excel" 
    Dim stringWrite As New System.IO.StringWriter() 
    Dim htmlWrite As System.Web.UI.HtmlTextWriter = New HtmlTextWriter(stringWrite) 
    Grid_Bad_Meters.RenderControl(htmlWrite) 
    Response.Write(stringWrite.ToString()) 
    Response.End() 

    'Grid_Bad_Meters.AllowPaging = True 
    'Grid_Bad_Meters.AllowSorting = True 
    'GridView1.DataSource = dt 

    'GridView1.DataBind() 


End Sub 
+0

расширения изменения в .csv – techspider

+0

Вы не создаете файл Excel, вы создаете файл HTML и обслуживающий его с расширением Excel и MIME типом. Не делай этого, это грязный хак. Создайте реальный файл Excel, используя библиотеку, такую ​​как EPPlus, NPOI или Office XML SDK. Я обсуждаю вашу технику и EPPlus в своем личном [сообщении в блоге] (https://masonmcg.com/blog/entry/properly-generating-excel-files-in-net). – mason

+0

Или Office Interop/VSTA. – RBarryYoung

ответ

-1

Вы можете использовать один из двух подходов, упомянутых ниже. Конечно, есть другие способы удовлетворить ваши требования, такие как экспорт в файл csv, как указано в комментарии, или использование библиотеки .Net, предназначенной для экспорта Excel, например, epplus.

OpenXML подход

Если вы ищете способ экспортировать в Excel без использования HTML подхода, то вы можете использовать OpenXML подход, который объясняется очень четко с рабочим примером по этому адресу: Export to Excel using OpenXML. Это будет eliminate all the CSS styles, что может быть связано с экспортом с использованием html-подхода, и вы, кажется, используете этот html-подход в соответствии с кодом в своем исходном сообщении. Однако, если вы хотите использовать html-подход, , тогда приведенный ниже код должен работать и устранять все стили CSS, которые могут возникнуть при просмотре файла excel. Я действительно пробовал этот опубликованный код на своей машине, прежде чем вводить его здесь.

Html подход

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

Вы можете увидеть фактическое видео о том, как это работает по этому адресу:Grid Export without any CSS Styles. Именно так код работал на моем ноутбуке, когда я его запускал.

Вы можете использовать пример кода ниже, но убедитесь, что источник данных настроен на данные, которые включают все записи на всех страницах исходного gridview. Я использовал SqlDataSource1 в качестве источника данных, но вы можете заменить его соответствующим методом в вашей ситуации.

Protected Sub btnExport_Click(sender As Object, e As EventArgs) 
    Dim GridView2 As New GridView() 
    GridView2.AllowPaging = False 
    GridView2.AllowSorting = False 
    GridView2.Style.Clear() 
    GridView2.CellPadding = 0 
    GridView2.CellSpacing = 0 
    GridView2.GridLines = GridLines.None 
    GridView2.BorderStyle = BorderStyle.None 
    GridView2.BorderWidth = Unit.Pixel(0) 
    GridView2.AlternatingRowStyle.BorderStyle = BorderStyle.None 
    GridView2.DataSource = SqlDataSource1 
    GridView2.DataBind() 

    ' Clear the response 
    Response.Clear() 

    ' Set the type and filename 
    Response.AddHeader("content-disposition", "attachment;filename=griddata.xls") 
    Response.Charset = "" 
    Response.ContentType = "application/vnd.xls" 

    ' Add the HTML from the GridView to a StringWriter so we can write it out later 
    Dim sw As New System.IO.StringWriter() 
    Dim hw As System.Web.UI.HtmlTextWriter = New HtmlTextWriter(sw) 
    GridView2.RenderControl(hw) 

    ' Write out the data 
    Response.Write(sw.ToString()) 
    Response.[End]() 
End Sub 
Public Overrides Property EnableEventValidation() As Boolean 
    Get 
     Return False 
    End Get 
      'Do nothing 
    Set 
    End Set 
End Property 
Public Overrides Sub VerifyRenderingInServerForm(control As Control) 
    'Allows for printing 
End Sub 
0
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
    Try 
      Dim ScriptManager As ScriptManager = ScriptManager.GetCurrent(Me.Page) 
      ScriptManager.RegisterPostBackControl(Me.btnExportToExcel) 

    Catch ex As Exception 

    End Try 
End Sub 



Protected Sub btnExportToExcel_Click(sender As Object, e As EventArgs) Handles btnExportToExcel.Click 
    Try 

     Dim sw As New System.IO.StringWriter() 
     Dim hw As New System.Web.UI.HtmlTextWriter(sw) 
     Dim style As String = "<style>.textmode{mso-number-format:\@;}</style>" 

     Response.Clear() 
     Response.Buffer = True 

     Response.AddHeader("content-disposition", "attachment;filename=SignExport.xls") 
     Response.Charset = "" 
     Response.ContentType = "application/vnd.ms-excel" 

     For i As Integer = 0 To Me.Grid_Bad_Meters.Rows.Count - 1 
      Dim row As GridViewRow = Grid_Bad_Meters.Rows(i) 
      row.Attributes.Add("class", "textmode") 
     Next 
     'lblRptHeader.RenderControl(hw) 
     hw.WriteBreak() 
     'lblReportDateRange.RenderControl(hw) 
     Grid_Bad_Meters.RenderControl(hw) 
     Response.Write(style) 
     Response.Output.Write(sw.ToString()) 
     Response.Flush() 
     Response.End() 






    Catch ex As Exception 


    End Try 

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