使用各種地區設定,在 Excel 中格式化資料

更新:2007 年 11 月

適用於

本主題中的資訊僅適用於指定的 Visual Studio Tools for Office 專案和 Microsoft Office 版本。

專案類型

  • 文件層級專案

Microsoft Office 版本

  • Excel 2003

  • Excel 2007

如需詳細資訊,請參閱依應用程式和專案類型提供的功能

您必須先使用英文 (美國) 資料格式 (地區設定 ID 1033) 來格式化含有區分地區設定 (Locale) 之格式的所有資料 (例如,日期和貨幣),然後再將它傳遞至 Microsoft Office Excel 或從 Visual Studio Tools for Office 專案程式碼讀取資料。

根據預設,Visual Studio Tools for Office runtime 會促使 Excel 物件模型必須使用地區設定 ID 1033 資料格式 (此即所謂將物件模型鎖定於地區設定 ID 1033)。這個行為與 Visual Basic for Applications 的運作方式相符。不過,您可以在 Visual Studio Tools for Office 方案中修改這個行為。

設計鎖定 Excel 物件模型的程式

根據預設,使用 Visual Studio Tools for Office 所建立的文件層級自訂和應用程式層級增益集不會受到使用者地區設定的影響,而且永遠會以英文 (美國) 地區設定運作。例如,如果在 Excel 中取得或設定 Value2 屬性,資料就一定會依照地區設定 ID 1033 方式完成格式化。如果您使用不同的資料格式,可能會產生無法預期的結果。

即使您對 Managed 程式碼所傳遞或管理的資料使用英文 (美國) 格式,Excel 還是會根據使用者的地區設定來正確解譯及顯示資料。Excel 可以正確地格式化資料,是因為 Managed 程式碼會將地區設定 ID 1033 與資料一併傳遞,這表示資料使用的是英文 (美國) 格式,因此必須重新格式化以符合使用者的地區設定。

例如,如果使用者將他們的地區選項設定為德文 (德國) 地區設定,他們就會預期 2005 年 6 月 29 日的日期會用以下方式格式化:29.06.2005。不過,如果您的方案將日期當做字串傳遞至 Excel,您就必須根據英文 (美國) 格式來格式化日期:6/29/2005。如果儲存格格式化成日期儲存格,Excel 就會使用德文 (德國) 格式來顯示日期。

解除鎖定 Excel 物件模型

Visual Studio Tools for Office 可以讓您解除鎖定整個 Excel 物件模型的地區設定 ID 行為。ExcelLocale1033Attribute 會控制 Visual Studio Tools for Office 方案中的 Excel 物件模型行為。根據預設,這個屬性 (Attribute) 設定為 true,而此設定會鎖定 Excel 物件模型必須使用地區設定 ID 1033 的格式。當這個屬性為 true 時,Visual Studio Tools for Office 會將每一個由方案具現化 (Instantiated) 的 Excel 物件包裝在一律會將地區設定 ID 1033 傳遞至 Excel 的 Proxy 物件中。將屬性設定為 false 時,就不使用這些 Proxy 物件,而且 Excel 物件模型會使用使用者的地區設定。

注意事項:

如果您將此屬性設定為 false,而有任何使用者使用英文 (美國) 以外的地區設定時,他們可能就會在方案中看見無法預期的行為。您可以撰寫程式碼,讓它使用任何地區設定運作。如需詳細資訊,請參閱 HOW TO:在 Excel 中使用反映將字串常值設定為區域安全

若要解除鎖定物件模型,請將專案內 AssemblyInfo.vb 或 AssemblyInfo.cs 檔案的 ExcelLocale1033Attribute 設定為 false。

<Assembly: ExcelLocale1033(False)>
[assembly: ExcelLocale1033(false)]
注意事項:

ExcelLocale1033Attribute 為 true 時,Visual Studio Tools for Office 執行階段會將所有原生 Excel 物件包裝在 Proxy 物件中,因此您可能發現某些與原生 Excel 物件相關之作業的速度會變慢。在這種情況下,您可以使用 Unwrap 方法,不需 Proxy 即可取得 Excel 物件,然後使用此物件執行作業以提高效能。如果您選擇這麼做,請注意由 Unwrap 傳回的物件會使用目前執行緒的地區設定 ID,並不是地區設定 ID 1033。

解除鎖定 Excel 2003 專案中的特定 Excel 物件

如果您是開發 Excel 2003 的專案,在某些情況下,您可能需要修改原生 Excel 物件 (也就是,定義在 Microsoft.Office.Interop.Excel 命名空間中類別的執行個體) 的情況,好讓它使用目前執行緒的地區設定 ID,而不使用地區設定 ID 1033。例如,如果您想要將 null 傳遞成 Excel 物件其中一個方法的 out 參數,就必須進行這項修改。

若要在 Excel 2003 專案中變更個別 Excel 物件的地區設定 ID 行為,請使用 ExcelLocale1033Proxy 類別的方法。您可以呼叫 Unwrap 方法修改 Excel 物件,讓它使用目前執行緒的地區設定 ID 而不是地區設定 ID 1033。

在呼叫 Unwrap 修改 Excel 物件之後,您可能會在想要使用地區設定 ID 1033,而非目前執行緒之地區設定 ID 的情況下再次使用該物件。請呼叫 Wrap 方法,將 Excel 物件包裝在 Proxy 物件中,讓它使用地區設定 ID 1033,而不是目前執行緒的地區設定 ID。

注意事項:

UnwrapWrap 方法在 Excel 2007 的 Visual Studio Tools for Office 專案中已過時。與 Excel 2007 專案搭配使用的 Visual Studio Tools for Office Runtime 包含改進功能,可讓原生 Excel 物件在 ExcelLocale1033Attribute 為 true 時正常運作。如需 Visual Studio Tools for Office Runtime 的詳細資訊,請參閱 Visual Studio Tools for Office Runtime 概觀

在鎖定 Excel 物件模型時呼叫具有 out 參數的方法

如果 ExcelLocale1033Attribute 在 Excel 2003 方案中為 true,當您將 null 傳遞成 Excel 物件模型中方法的 out 參數時,將會收到例外狀況。若要傳遞 null 做為 out 參數,您先必須呼叫 Unwrap,並傳入包含方法的物件,然後才能呼叫該方法。

或者,您也可以在呼叫方法之前,將參數指派為值。如需 out 參數的詳細資訊,請參閱 out (C# 參考)

例如,如果 ExcelLocale1033Attribute 是 true,下列程式碼便會擲回例外狀況。ExportXml 方法具有 out 參數。

Dim outString As String = Nothing
Dim result As Excel.XlXmlExportResult = _
    Globals.ThisWorkbook.XmlMaps(1).ExportXml(outString)
string outString = null;
Excel.XlXmlExportResult expResult =
Globals.ThisWorkbook.XmlMaps[1].ExportXml(out outString);

若要解決這個問題,您可以在呼叫 ExportXml 之前,將 XmlMap 傳入 Unwrap 方法。

Dim outString As String = Nothing
Dim map As Excel.XmlMap = TryCast( _
    Microsoft.Office.Tools.Excel.ExcelLocale1033Proxy.Unwrap( _
    Globals.ThisWorkbook.XmlMaps(1)), Excel.XmlMap)
Dim result As Excel.XlXmlExportResult = map.ExportXml(outString)
string outString = null;
Excel.XmlMap map = Microsoft.Office.Tools.Excel.
    ExcelLocale1033Proxy.Unwrap(
    Globals.ThisWorkbook.XmlMaps[1]) as Excel.XmlMap;
Excel.XlXmlExportResult expResult = map.ExportXml(out outString);

或者,您也可以先將 outString 變數指派為值,然後再將它傳遞給 ExportXml

Dim outString As String = String.Empty
Dim result As Excel.XlXmlExportResult = _
    Globals.ThisWorkbook.XmlMaps(1).ExportXml(outString)
string outString = String.Empty;
Excel.XlXmlExportResult expResult =
    Globals.ThisWorkbook.XmlMaps[1].ExportXml(out outString);

請參閱

工作

HOW TO:當地語系化 Excel 方案

HOW TO:在 Excel 中使用反映將字串常值設定為區域安全

概念

在 Visual Studio 中建立 Office 方案

Visual Studio Tools for Office Runtime 概觀

參考

ExcelLocale1033Attribute

ExcelLocale1033Proxy

其他資源

使用屬性擴充中繼資料