如何動態轉換ASP.NET 繁體Crystal Report報表(*.rpt)成簡體版?

如何動態轉換ASP.NET 繁體Crystal Report報表(*.rpt)成簡體版?

 

 

如何動態轉換ASP.NET 繁體Crystal Report報表(*.rpt)成簡體版?

在ASP.NET上使用Crystal Report設計的繁體報表,
如果能動態轉換成簡體, 就能省去同時維護繁體和簡體
二套系統的工作.

在輸出報表的VB中呼叫get_rpt function:


...
Dim reportDoc As New ReportDocument
reportDoc.Load(rptfun.get_rpt(Server.MapPath("xxx.rpt")))
...
 

rptfun.vb:


Imports CRAXDRT

Public Class rptfun
    Public Shared Function get_rpt(ByVal v_file As String) As String
        Dim v_cult As String = System.Configuration.ConfigurationSettings.AppSettings("Location").ToString()
        If v_cult = "zh-CN" Then
            Dim v1 As Integer = InStrRev(v_file, "\")
            Dim v2 As Integer = InStrRev(v_file, "\", v1 - 1)
            Dim v3 As Integer = v_file.Length
            Dim vc3 As String = Right(v_file, v3 - v1)
            Dim v_cnfile As String = Left(v_file, v2) + "temp_cn\" + vc3
            Return rpt2cn(v_file, v_cnfile)
        Else
            Return v_file
        End If
    End Function

    Public Shared Function rpt2cn(ByVal v_file As String, ByVal v_fileto As String) As String
        Dim oCR As New CRAXDRT.Application
        Dim oRpt As Report = oCR.OpenReport(v_file)
        Dim jj, kk, ll, pp As Integer
        For jj = 1 To oRpt.Areas.Count
            For kk = 1 To oRpt.Areas.Item(jj).Sections.Count
                For ll = 1 To oRpt.Areas.Item(jj).Sections.Item(kk).ReportObjects.Count
                    yy = oRpt.Areas.Item(jj).Sections.Item(kk).ReportObjects.Item(ll)
                    If yy.Kind = 2 Then
                        Dim v_objn As Integer = 0
                        Dim MTXT As String = Trim(yy.Text)
                        Dim MRPL As String = MTXT
                        If Len(MRPL) > 0 Then
                            MRPL = StrConv(MTXT, VbStrConv.SimplifiedChinese, 2052)
                        End If
                        If yy.FieldElements.Count > 0 Then
                            v_objn = yy.FieldElements.Count
                            Dim txtobj(v_objn, 3) As Object
                            For pp = 1 To v_objn
                                txtobj(pp, 1) = yy.FieldElements.Item(pp).FieldDefinition
                                txtobj(pp, 3) = yy.FieldElements.Item(pp).Font.bold
                            Next
                            Dim v_star As Integer = 1
                            For pp = 1 To v_objn
                                txtobj(pp, 2) = InStr(v_star, MRPL, "[]")
                                If txtobj(pp, 2) >= v_star Then
                                    v_star = txtobj(pp, 2) + 1
                                End If
                            Next
                            MRPL = Replace(MRPL, "[]", "")
                            oRpt.Areas.Item(jj).Sections.Item(kk).ReportObjects.Item(ll).settext(MRPL)
                            For pp = 1 To v_objn
                                yy.FieldElements.Add(txtobj(pp, 2), txtobj(pp, 1))
                            Next
                            oRpt.Areas.Item(jj).Sections.Item(kk).ReportObjects.Item(ll).Font.Name = "SimSun"
                            For pp = 1 To v_objn
                                yy.FieldElements.Item(pp).Font.bold = txtobj(pp, 3)
                            Next
                        Else
                            oRpt.Areas.Item(jj).Sections.Item(kk).ReportObjects.Item(ll).settext(MRPL)
                            oRpt.Areas.Item(jj).Sections.Item(kk).ReportObjects.Item(ll).Font.Name = "SimSun"
                        End If
                    End If
                    If yy.Kind = 1 Then
                        oRpt.Areas.Item(jj).Sections.Item(kk).ReportObjects.Item(ll).Font.Name = "SimSun"
                    End If
                Next
            Next
        Next
        oRpt.Save(v_fileto)
        Return v_fileto
    End Function
End Class
 

註:
   1. web.config 中定義 Location. (<add key="Location" value="zh-CN"/>)
   2. ASP.NET 必須設定有寫入temp_cn目錄的權限.
   3. 加入參考:CRAXDRT.dll(Crystal Reports ActiveX Designer DLL)