Dobrý den, řeším export dat z GridView do XLS v asp.NET. Mám ovšem jeden problém, v GridView zobrazuji seznamy zaměstnanců dle zadaných parametrů (útvar, funkce ...), pak kliknu na tlačítko export do XLS a následně se nabídne možnost stažení XLS souboru. Po otevření staženého souboru se data z GridView zobrazí, ale bohužel u některých znaků je problém v zobrazení např. „ř“ se zobrazí jako průměr a pd. A ještě aby to bylo více zapeklité, tak některé takto exportované sestavy (například vybrán jiný útvar) jsou v pořádku, to znamená že „ř“ se zobrazuje jako „ř“. Dále jsem nakouknul do zdojáku HTML a pouze u sloupců GridView se zobrazuje text „Středisko vzděl & # 225;v& # 225;n& # 237; a volnočasov & # 253;ch aktivit“ Za některé české zanaky se dosazuje & # 253; (nevím jak se tohle jmenuje, zástupný znak? Si nemohu vzpomenout.) Předpokládám, že problém může být právě v písmenech interpretovaných &#...; , ale to jen odhaduji. Nevíte někdo jak tento problém vyřešit, nebo co je jeho příčinou? Info k projektu: Kodování v masterPage nastaveno na windows-1250 Data do DataGridu přicházejí ze storky z SQL 2008 a datový typ sloupců je nvarchar (zkoušel jsem i varchar)
Public Shared Sub ExportFromGridViewToXLS(ByVal gv As GridView, ByVal fileName As String)
fileName = fileName & ".xls"
HttpContext.Current.Response.AddHeader("content-disposition", String.Format("attachment; filename={0}", fileName))
HttpContext.Current.Response.ContentType = "application/ms-excel"
HttpContext.Current.Response.ContentEncoding = Encoding.GetEncoding("windows-1250")
HttpContext.Current.Response.Charset = "windows-1250"
Dim sw As StringWriter = New StringWriter
Dim htw As HtmlTextWriter = New HtmlTextWriter(sw)
gv.AllowPaging = False
Dim table As Table = New Table
table.GridLines = gv.GridLines
If (Not (gv.HeaderRow) Is Nothing) Then
ExportToXLS.PrepareControlForExport(gv.HeaderRow)
table.Rows.Add(gv.HeaderRow)
End If
For Each row As GridViewRow In gv.Rows
ExportToXLS.PrepareControlForExport(row)
table.Rows.Add(row)
Next
If (Not (gv.FooterRow) Is Nothing) Then
ExportToXLS.PrepareControlForExport(gv.FooterRow)
table.Rows.Add(gv.FooterRow)
End If
table.RenderControl(htw)
HttpContext.Current.Response.Write(sw.ToString)
HttpContext.Current.Response.End()
End Sub
Private Shared Sub PrepareControlForExport(ByVal control As Control)
Dim i As Integer = 0
Do While (i < control.Controls.Count)
Dim current As Control = control.Controls(i)
If (TypeOf current Is LinkButton) Then
control.Controls.Remove(current)
control.Controls.AddAt(i, New LiteralControl(CType(current, LinkButton).Text))
ElseIf (TypeOf current Is ImageButton) Then
control.Controls.Remove(current)
control.Controls.AddAt(i, New LiteralControl(CType(current, ImageButton).AlternateText))
ElseIf (TypeOf current Is HyperLink) Then
control.Controls.Remove(current)
control.Controls.AddAt(i, New LiteralControl(CType(current, HyperLink).Text))
ElseIf (TypeOf current Is DropDownList) Then
control.Controls.Remove(current)
control.Controls.AddAt(i, New LiteralControl(CType(current, DropDownList).SelectedItem.Text))
ElseIf (TypeOf current Is CheckBox) Then
control.Controls.Remove(current)
control.Controls.AddAt(i, New LiteralControl(CType(current, CheckBox).Checked))
'TODO: Warning!!!, inline IF is not supported ?
End If
If current.HasControls Then
ExportToXLS.PrepareControlForExport(current)
End If
i = (i + 1)
Loop
End Sub
|