2013-02-25 49 views
0

我正在使用本機C++的Excel COM自動化。我的目標是爲日期設置範圍的NumberFormat。問題是,Excel預期的格式字符串取決於用戶的區域設置。爲忽略本地C++語言環境的日期設置Excel NumberFormat

舉例: 如果語言環境是英語,我必須設置的NumberFormat爲「DD.MM.YYYY」 如果locale是German我需要使用「TT.MM.JJJJ」來獲得相同的結果。

心中已經發現了很多解決方案的.NET,不幸的是我沒有這樣的奢侈。通常的解決方案是將Excel線程的語言環境臨時設置爲英文,但對於本機C++來說似乎不可行。

我能讀默認的系統區域設置,然後硬編碼不同的格式字符串,但有人使用我還沒有明確地包括語言環境,所以這是一個壞的解決方案,這將不盡快工作。

所以,我怎麼解決這個問題,所以它的工作原理,無論使用哪個區域?

回答

2

一種可能的解決方案是使用系統時間格式化器(像:_tcsftime,strftime的,wcsftime)的日期/時間結構格式化到正在運行的系統的區域。既然你的程序和excel預計在同一臺PC上運行,它應該可以在不知道本地日期/時間字符串是什麼樣的情況下正常工作。

作爲一個後退解決方案,您可能必須在程序的選項配置部分提供一系列硬編碼格式字符串和/或用戶手動輸入的字符串,以防萬一缺省語言環境格式失敗。

第一回復註釋後附加信息從OP:--------------

區域設置影響日期時間-二進制對象的文本顯示器演示在UI僅。這樣的日期時間二進制對象總是以非常一致的方式存儲爲二進制結構,即使在其每個不同的上下文中,無論區域設置如何,都可以在Excel(日期/時間格式單元格),C++(各種結構取決於api) ,VisualBasic(變體)。

因此,如果您的目的是將日期時間二進制結構導出爲ex​​cel,而不是strng,那麼您可以一直使用「variant」類型來存儲日期值,因爲excel-automation使用IDispatch接口。你可以完全忘記區域設置。

代碼片段添加到通過代碼出口日期時間的變體和格式的單元格:----------------

我使用MFC這樣的代碼很簡單,你可能必須轉換爲winapi自己

_Application app; 
if (!app.CreateDispatch("Excel.Application")) 
{ AfxMessageBox("Cannot start Excel !"); 
    return; 
} 
app.SetVisible(TRUE); 
COleVariant VOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR); 
Workbooks objbooks = app.GetWorkbooks(); 
_Workbook objbook = objbooks.Add(VOptional); 
Worksheets objsheets = objbook.GetWorksheets(); 
_Worksheet objsheet = objsheets.GetItem(COleVariant((short)1)); 

// get current date time 
COleDateTime timeCurrent = COleDateTime::GetCurrentTime(); 

// setting date values 
Range range; 
range = objsheet.GetRange(COleVariant("A2"), COleVariant("B3")); 
range.SetValue(COleVariant(timeCurrent)); 
// range.SetNumberFormat(COleVariant("dd/mm/yyyy")); 
range.SetNumberFormat(COleVariant("dddd, mmmm dd, yyyy")); 

AfxMessageBox("Done..."); 
+0

感謝您的想法,不幸的是他們都不會工作。我需要日期作爲圖表軸。爲了使日期軸選項可用(這就是爲什麼我要做所有這些,所以我可以說excel做一個主要的勾號並且每個月都標記軸),簡單地將日期作爲字符串傳遞將不起作用,我需要使用= DATEVALUE()然後格式化單元格作爲日期。因此我需要使用Excel NumberFormat。 – Naryoril 2013-02-26 07:40:18

+0

對不起,我想添加一個換行符,但按回車發送評論,它說我不能編輯它。第二個解決方案也不起作用。是的,我可以根據語言環境硬編碼數字格式(這是我現在所做的),但它不是一個真正的解決方案。該程序大約有20年左右的歷史,並且設置保存在數據庫中,因此由客戶的所有用戶共享。還有一個Ini文件,但該程序可以安裝在網絡驅動器上,因此ini文件也可以共享。但是當然,每個用戶的本地可以不同。 – Naryoril 2013-02-26 07:49:44

+0

將日期作爲類型日期的變體傳遞給我解決問題,非常感謝。不幸的是,這不是一個通用的解決方案,因爲這樣你只能以標準格式顯示日期。如果有人需要以不同的方式進行格式化,這也無濟於事。舉個例子:如果你想把它作爲「2013年2月27日星期三」,它對應於Excel數字格式字符串「dddd,mmmm dd,yyyy」 – Naryoril 2013-02-27 13:39:08

相關問題