[轉貼][筆記]利用 Office Word 元件 (Microsoft.Office.Interop.Word) 撰寫繁簡互換的共用類別

應用系統突然有了個將現有系統轉成簡體的需求,詢問 Google 大神後發現,大概有兩個方向可以進行,一個是透過.JS的方式,系統掛上個.js,家上一小段Code,畫面自動就有繁簡互換的功能出現。雖然此方式簡單易做,但是,兩岸對於IT方面的習慣詞彙畢竟不相同,如果只是用這方式,還是不符合對案使用者的習慣。另一個則是透過 Office 中 Word 的強大功能,可以真對詞彙進行轉換,而不再是逐字轉換,轉出人家看不懂的東西。

小喵找到了黑大的這一篇【CODE-封裝Office繁簡轉換服務】裡面有詳記著相關的做法,不過由於程式碼是C#,於是小喵就動手轉換一下,順便做個測試範例。

 

 

 

緣起

應用系統突然有了個將現有系統轉成簡體的需求,詢問 Google 大神後發現,大概有兩個方向可以進行,一個是透過.JS的方式,系統掛上個.js,家上一小段Code,畫面自動就有繁簡互換的功能出現。雖然此方式簡單易做,但是,兩岸對於IT方面的習慣詞彙畢竟不相同,如果只是用這方式,還是不符合對案使用者的習慣。另一個則是透過 Office 中 Word 的強大功能,可以真對詞彙進行轉換,而不再是逐字轉換,轉出人家看不懂的東西。

小喵找到了黑大的這一篇【CODE-封裝Office繁簡轉換服務】裡面有詳記著相關的做法,不過由於程式碼是C#,於是小喵就動手轉換一下,順便做個測試範例。

撰寫程式

為了未來的使用方便,將相關的程式撰寫成一個元件(dll),未來要使用的專案只需要加入參考,即可使用

首先,新增一個類別專案,名稱為【PUtilChineseStrConverter】,修改類別名稱為【ChineseStrConverter】

加入參考

由於這是透過Office的Word功能,所以必須加入參考

撰寫的電腦需要安裝Office,未來運作的電腦也需要有Office的環境。

撰寫類別

類別的相關內容如下:

Imports System
Imports System.Collections.Generic
Imports System.Diagnostics
Imports System.IO
Imports System.Linq
Imports System.Runtime.InteropServices
Imports System.Text
Imports Microsoft.Office.Interop.Word


Public Class ChineseStrConverter
    Implements IDisposable

    Private wordApp As Application = Nothing
    Private doc As Document = Nothing

    Public Sub New()
        wordApp = New Application()
        wordApp.Visible = False
        doc = wordApp.Documents.Add()
    End Sub

    Public Function ConvChineseString(ByVal src As String, ByVal chs2cht As Boolean)
        Dim Result As String = ""
        Try
            doc.Content.Text = src
            If chs2cht = True Then
                '簡轉繁
                doc.Content.TCSCConverter(WdTCSCConverterDirection.wdTCSCConverterDirectionSCTC, True, True)
            Else
                '繁轉簡
                doc.Content.TCSCConverter(WdTCSCConverterDirection.wdTCSCConverterDirectionTCSC, True, True)
            End If
            Result = doc.Content.Text

        Catch ex As Exception
            Result = ex.Message
        End Try
        Return Result
    End Function



#Region "IDisposable Support"
    Private disposedValue As Boolean ' 偵測多餘的呼叫

    ' IDisposable
    Protected Overridable Sub Dispose(disposing As Boolean)
        If Not Me.disposedValue Then
            If disposing Then
                ' TODO:  處置 Managed 狀態 (Managed 物件)。
                '確實關閉Word Application
                Try
                    Dim dontSave As Object = WdSaveOptions.wdDoNotSaveChanges
                    CType(doc, _Document).Close(dontSave)

                    If doc IsNot Nothing Then
                        Marshal.FinalReleaseComObject(doc)
                    End If
                    doc = Nothing
                    CType(wordApp, _Application).Quit(dontSave)

                Catch ex As Exception

                Finally
                    If wordApp IsNot Nothing Then
                        Marshal.FinalReleaseComObject(wordApp)
                    End If
                End Try

            End If

            ' TODO:  釋放 Unmanaged 資源 (Unmanaged 物件) 並覆寫下面的 Finalize()。
            ' TODO:  將大型欄位設定為 null。
        End If
        Me.disposedValue = True
    End Sub

    ' TODO:  只有當上面的 Dispose(ByVal disposing As Boolean) 有可釋放 Unmanaged 資源的程式碼時,才覆寫 Finalize()。
    'Protected Overrides Sub Finalize()
    '    ' 請勿變更此程式碼。在上面的 Dispose(ByVal disposing As Boolean) 中輸入清除程式碼。
    '    Dispose(False)
    '    MyBase.Finalize()
    'End Sub

    ' 由 Visual Basic 新增此程式碼以正確實作可處置的模式。
    Public Sub Dispose() Implements IDisposable.Dispose
        ' 請勿變更此程式碼。在以上的 Dispose 置入清除程式碼 (視為布林值處置)。
        Dispose(True)
        GC.SuppressFinalize(Me)
    End Sub
#End Region

End Class

其中,轉碼的程式其實就只有一行,以繁轉簡為例,關鍵就是以下這一行

doc.Content.TCSCConverter(WdTCSCConverterDirection.wdTCSCConverterDirectionTCSC, True, True)

不過由於程式是藉由Word的應用程式來進行轉換,運作中可以從工作管理員觀察到有個Word在背景執行,因此,還要特別注意使用完成後的回收(Dispose)的部分。

測試範例

撰寫完成後,另外寫一個Windows Form來測試,測試畫面安排如下:

測試結果發現,轉換出來的換行怪怪的

透過中段點,來查看問題,發現本來的換行(vbCrLf),被置換為 vbCr

所以,使用時,還需要特別把vbCr的部分,置換回vbCrLf     

測試Windows Form的按鈕按下相關程式碼如下:

Imports PUtilChineseStrConverter

Public Class Form1

    Private Sub btnCvrt_Click(sender As Object, e As EventArgs) Handles btnCvrt.Click
        Using oCvnt As New ChineseStrConverter
            Dim Chs2Cht As Boolean = False
            Select Case ComboBox1.SelectedText
                Case "繁→簡"
                    Chs2Cht = False
                Case "簡→繁"
                    Chs2Cht = True
            End Select
            Me.txtRlt.Text = oCvnt.ConvChineseString(Me.txtOrg.Text, Chs2Cht).replace(vbCr, vbCrLf)
        End Using
    End Sub
End Class

處理過換行後,執行的結果如下畫面:

末記

黑大的文章有提到,Word 的轉換效率,在眾多的繁簡轉換工具中,不算優,但卻是唯一可以轉換詞彙的,而這也是小喵所看重的,將他寫成元件,以利其他有需要時,加入參考即可使用。由於小喵工作環境VB.NET限定,所以轉為VB.NET的Code,特別記錄下來提供自己未來參考,也提供有需要的人參考)


參考資料:

黑暗執行緒:CODE-封裝Office繁簡轉換服務

 

 


以下是簽名:


Microsoft MVP
Visual Studio and Development Technologies
(2005~2019/6)