2013-02-25 53 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

相关问题