2007年11月26日 星期一

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)