Excel 方案的全球化與當地語系化
本節包含在非英文 Windows 設定的電腦上執行 Microsoft Office Excel 方案時的特殊考量資訊。Microsoft Office 方案全球化與當地語系化的大部分層面,和使用 Visual Studio 建立其他種類的方案時所碰到的情況相同。如需一般資訊,請參閱全球化和當地語系化應用程式。如需全球化和當地語系化的資訊,請參閱 MSDN 網頁使用 Microsoft Visual Studio Tools for Microsoft Office system 所建立之方案的全球化和當地語系化問題。
根據預設,Microsoft Office Excel 中的主控制項在任何 Windows 地區設定下都能正確運作,只要使用 Managed 程式碼傳遞或管理的所有資料都使用英文 (美國) 格式進行格式化即可。在以 .NET Framework 4 或 .NET Framework 4.5專案,這個行為是由 Common Language Runtime (CLR) 控制項。
**適用於:**本主題中的資訊適用於 Excel 2013 和 Excel 2010 的文件層級專案和應用程式層級專案。如需詳細資訊,請參閱依 Office 應用程式和專案類型提供的功能。
在 Excel 中格式化資料與各種地區設定
您必須先使用英文 (美國) 資料格式 (地區設定 ID 1033) 來格式化含有區分地區設定之格式的所有資料 (例如,日期和貨幣),然後再將它傳遞至 Microsoft Office Excel 或從 Office 專案程式碼讀取資料。
當您在 Visual Studio 中開發 Office 方案時,Excel 物件模型預設必須使用地區設定 ID 1033 資料格式 (這即是所謂將物件模型鎖定於地區設定 ID 1033)。這個行為與 Visual Basic for Applications 的運作方式相符。不過,您可以在 Office 方案中修改這個行為。
了解 Excel 物件模型如何一律使用地區設定 ID 1033
使用 Visual Studio 所建立的 Office 方案預設不會受到使用者的地區設定所影響,而且一律會以英文 (美國) 地區設定運作。例如,如果在 Excel 中取得或設定 Value2 屬性,資料就一定會依照地區設定 ID 1033 方式完成格式化。如果您使用不同的資料格式,可能會產生無法預期的結果。
即使您對 Managed 程式碼所傳遞或管理的資料使用英文 (美國) 格式,Excel 還是會根據使用者的地區設定來正確解譯及顯示資料。Excel 可以正確地格式化資料,是因為 Managed 程式碼會將地區設定 ID 1033 與資料一併傳遞,這表示資料使用的是英文 (美國) 格式,因此必須重新格式化以符合使用者的地區設定。
例如,如果使用者的地區選項設為德文 (德國) 地區設定,則他們會想要將 June 29, 2005 日期的格式設定為:29.06.2005。不過,如果您的方案將該日期以字串形式傳遞給 Excel,則必須根據英文 (美國) 格式來設定日期的格式:6/29/2005。如果儲存格的格式設定為日期儲存格,則 Excel 會以德文 (德國) 格式顯示日期。
將其他地區設定 ID 傳遞給 Excel 物件模型
Common Language Runtime (CLR) 會自動將地區設定 ID 1033 傳遞給接受區分地區設定的資料的所有方法和屬性在 Excel 物件模型。針對所有進入物件模型的呼叫,並沒有方法可以自動變更這項行為。不過,您可以使用 InvokeMember 呼叫特定方法,以及將地區設定 ID 傳遞給該方法的 culture 參數,以將不同的地區設定 ID 傳遞給該方法。
當地語系化文件文字
您專案中的文件、範本或活頁簿可能包含靜態文字,這些靜態文字必須與組件和其他 Managed 資源分開來進行當地語系化。執行這項工作最簡便的方式,是製作一份文件的複本,並且使用 Microsoft Office Word 或 Microsoft Office Excel 翻譯文字。即使您不變更程式碼這項程序也能運作,因為不論有幾份文件都可以連結到同一個組件。
不過您必須還是要確定,程式碼中與文件文字互動的任何部分仍然能夠與文字的語言相符,而且書籤、命名的範圍和其他顯示欄位能夠提供調整不同文法和文字長度所需的 Office 文件的任何重新格式化。對於包含極少量文字的文件範本,您可以考慮將文字儲存在資源檔中,然後在執行階段載入文字。
文字方向
在 Excel 中,可以設定工作表的屬性,以從右向左呈現文字。放置於設計工具上的主控制項、或任何擁有 RightToLeft 屬性的控制項,在執行階段會自動符合這些設定。Word 不具有雙向文字的文件設定 (您只能變更文字的對齊),因此控制項無法對應到此設定。反之,您必須為每一個控制項設定文字對齊方式。但可以撰寫能處理所有控制項的程式碼,以強迫該控制項從右到左呈現文字。
變更文化特性
將文件層級自訂程式碼通常會共用 Excel 的 UI 主執行緒,因此,對執行緒文化特性進行的任何變更都會影響正在該執行緒的東西該執行緒上執行的任何變更;變更不會限制對您的自訂內容。
Windows Form 控制項會在主應用程式啟動應用程式層級增益集之前初始化。在這些情況中,應在設定 UI 控制項之前變更文化特性。
安裝語言套件
如果您有非英文的 Windows 設定,則可以安裝 Visual Studio Tools for Office Runtime 語言套件,以使用與 Windows 相同的語言查看 Visual Studio Tools for Office Runtime 訊息。如果有任何使用者使用非英文的 Windows 設定執行方案視窗,他們就必須擁有語言套件才能使用與 Windows 相同的語言查看執行階段訊息與 Windows 相同。Visual Studio Tools for Office Runtime 語言套件可從 Microsoft 下載中心取得。
此外,可轉散發的 .NET Framework 語言套件為 ClickOnce 訊息所必要。.NET Framework 語言套件可從 Microsoft 下載中心下載。
地區設定和 Excel COM 呼叫
只要 Managed 用戶端呼叫 COM 物件上的方法,將需要傳入特定文化資訊,這是使用符合目前執行緒地區設定的 CurrentCulture (地區設定) 來達成。根據預設,目前的執行緒地區設定是從使用者的地區設定繼承而來不過,當您從使用 Visual Studio 中之 Office 開發工具所建立的 Excel 方案來呼叫 Excel 物件模型時,會自動將英文 (美國) 資料格式 (地區設定 ID 1033) 傳遞給 Excel 物件模型。您必須先使用英文 (美國) 資料格式來設定含有區分地區設定格式之所有資料的格式 (例如,日期和貨幣),然後再將它傳遞給 Microsoft Office Excel 或從您的專案程式碼讀取資料。
儲存資料的考量事項
若要確保資料正確解譯並顯示,您也應該考慮問題時,可能會發生應用程式在字串常值 (硬式編碼) 中儲存資料,例如 Excel 工作表公式,而不是強型別物件。您應該使用假設不因文化特性而異或以英文 (美國) (LCID 值為 1033) 樣式設定格式的資料。
使用字串常值的應用程式
可能以硬式編碼的值包括:以英文 (美國) 格式撰寫的日期常值和包含當地語系化函式名稱的 Excel 工作表公式。另一個可能性是包含數字的硬式編碼字串,例如 1,000 在有些文化特性中會解譯成 1000,但在其他文化特性中卻代表 1.0。以錯誤的格式執行的計算和比較,可能會造成不正確的資料。
Excel 會依照隨字串傳遞的 LCID 來解譯任何字串。如果字串格式未對應至傳遞的 LCID,則可能會發生問題。使用 Visual Studio 中之 Office 開發工具所建立的 Excel 方案,會在傳遞所有資料時使用 LCID 1033 (en-US)。Excel 會依照地區設定和 Excel 使用者介面語言來顯示資料。Visual Basic for Applications (VBA) 也使用這種方式運作,字串會依照 en-US 設定格式,且 VBA 幾乎總是傳遞 0 (語言中性) 做為 LCID。例如,下列的 VBA 程式碼會依照目前使用者的地區設定,來顯示 May 12, 2004 的正確格式值︰
'VBA
Application.ActiveCell.Value2 = "05/12/04"
在使用 Visual Studio 中之 Office 開發工具所建立的方案中使用相同的程式碼並透過 COM Interop 傳遞給 Excel 時,如果日期是以 en-US 樣式設定格式,則會產生相同的結果。
例如:
Me.Range("A1").Value2 = "05/12/04"
this.Range["A1"].Value2 = "05/12/04";
您應該盡可能使用強型別資料而不是字串常數。例如,不使用字串常值儲存日期,而以 Double 來儲存,然後將其轉換為 DateTime 物件以供操作。
下列程式碼範例會取得使用者在 A5 儲存格輸入的日期,以 Double 儲存,然後將其轉換為 DateTime 物件,以便在 A7 儲存格中顯示。A7 儲存格必須格式化為顯示日期。
Private Sub ConvertDate_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) _
Handles ConvertDate.Click
Try
Dim dbl As Double = Me.Range("A5").Value2
Dim dt As System.DateTime = System.DateTime.FromOADate(dbl)
Me.Range("A7").Value2 = dt
Catch ex As Exception
MessageBox.Show(ex.Message)
End Try
End Sub
private void ConvertDate_Click(object sender, EventArgs e)
{
try
{
double dbl = (double)(this.Range["A5"].Value2);
System.DateTime dt = System.DateTime.FromOADate(dbl);
this.Range["A7"].Value2 = dt;
}
catch (Exception ex)
{
MessageBox.Show(ex.Message);
}
}
Excel 工作表函式
工作表函式名稱在大部分的 Excel 語言版本中會在內部轉譯。不過,由於可能的語言和 COM Interop 問題,所以強烈建議您在程式碼中僅使用英文的函式名稱。
使用外部資料的應用程式
如果任何程式碼開啟或者以其他方式使用外部資料,如包含由舊版系統所匯出的逗號分隔值的檔案 (CSV 檔案),而這些檔案是使用 en-US 以外的格式匯出的,則也有可能受到影響。資料庫的存取應該不會受到影響,因為所有的值應該具有二進位格式,除非資料庫將日期儲存為字串,或執行了不使用二進位格式的作業。此外,如果使用來自 Excel 的資料建構 SQL 查詢,可能會需要確定它們是 en-US 格式,這視使用的函式而定。