GridView export do XLS a zobrazování špatných znaků po exportu v xls   zodpovězená otázka

VB.NET, ASP.NET WebForms

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
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Tak, konečně jsem našel řešení, které funguje:

   Public Shared Sub ExportToExcel(ByVal gv As GridView)

            ' Zdroj: http://qudoraat.com/HackIt/StoryDetails.aspx?Id=17

            With HttpContext.Current
                .Response.Clear()
                .Response.Buffer = True
                .Response.AddHeader("content-disposition", "attachment;filename=GridViewExport.xls")
                .Response.ContentType = "application/ms-excel"
                .Response.ContentEncoding = Encoding.GetEncoding("windows-1250")
                .Response.Charset = "windows-1250"
            End With

            Dim sw As StringWriter = New StringWriter
            Dim hw As HtmlTextWriter = New HtmlTextWriter(sw)

            'gv.RenderControl(hw)

            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(hw)

            Dim style As String = "<style> .textmode { mso-number-format:\@; } </style>"

            With HttpContext.Current
                .Response.Output.Write("<meta http-equiv='Content-Type' content='text/html'; charset='windows-1250'\>") ';// add this line to fix characterset in czech
                .Response.Write(style)
                .Response.Output.Write(sw.ToString())
                .Response.Flush()
                .Response.End()
            End With

        End Sub
nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Skvělá práce, opravdu funguje ;)

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback