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)

1 則留言:

lin 提到...

您好 :
在百忙之中打擾您,我是 點部落 團隊的 Dotjum,
我們 點部落 http://www.dotblogs.com.tw 是一個 IT技術知識交流的園地,
我們希望讓每一位分享知識的朋友,透過 點部落 平台,將大家的知識與經驗收集起來,讓更多人都可以更容易的找到,
並且藉由回覆的討論方式,讓同樣領域的朋友可以給予肯定或是不同的看法及建議。

目前 點部落 提供許多功能,讓您在分享知識更方便,更容易的收藏您的知識,
像是 由您決定文章是否顯示網站特別主題首頁、離線編輯 (讓你圖文上稿更輕鬆)
訂閱關注主題討論 、技術主題團隊、文章附檔案 、個人標籤分類及尋找 、收藏文章 等等。

您可以透過 離線編輯 在撰寫原有 Blog 平台 (Xuite、樂多、天空、Blogspot、Live Space...等 ),
也同時能夠透過 Zoundry、Windows Live Writer 等 Blog 離線編輯軟體將文章發表至 點部落 。

目前在 點部落 上,陸陸續續有許多的朋友加入,
像是 瓶水相逢.Net 、 馬小玲 、孤影棧分舵 、強力鎯頭 VB BLOG 、強力鎯頭 VB BLOG、偉碩
AllenKuo、Angi、jeff377、puma、topcat、HUNGCHILIN的OFFICE專欄、Arashi的OFFICE專欄 等..目前都在 點部落 上。

我們希望創造出更好的IT知識技術分享環境,也成為每一個人的線上知識庫。

希望能邀請您一同建立專屬於IT技術的園地。
誠摯的邀請您參與 點部落 。
點部落團隊 Dotjum
完整HTML邀請函連結 http://www.dotblogs.com.tw/invitation.aspx