Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为日期设置Excel NumberFormat,忽略本地C++; < >我使用的是来自本地C++的Excel COM自动化。我的目标是设置日期范围的NumberFormat。问题是,Excel期望的格式字符串取决于用户的区域设置_C++_Excel_Com_Native_Office Automation - Fatal编程技术网

为日期设置Excel NumberFormat,忽略本地C++; < >我使用的是来自本地C++的Excel COM自动化。我的目标是设置日期范围的NumberFormat。问题是,Excel期望的格式字符串取决于用户的区域设置

为日期设置Excel NumberFormat,忽略本地C++; < >我使用的是来自本地C++的Excel COM自动化。我的目标是设置日期范围的NumberFormat。问题是,Excel期望的格式字符串取决于用户的区域设置,c++,excel,com,native,office-automation,C++,Excel,Com,Native,Office Automation,例如: 如果区域设置为英语,我必须将NumberFormat设置为“dd.mm.yyyy” 如果语言环境是德语,我需要使用“TT.MM.jj”来获得相同的结果 我已经为.NET找到了很多解决方案,不幸的是,我没有那种奢侈。通常的解决方案是临时设置Excel线程的区域设置为英语,但在本机C++中不可能。 我可以读取默认的系统区域设置,然后硬编码不同格式的字符串,但一旦有人使用我没有明确包含的区域设置,这就行不通了,所以这是一个糟糕的解决方案 那么,我如何解决这个问题,使其无论使用哪个语言环境都能工

例如: 如果区域设置为英语,我必须将NumberFormat设置为“dd.mm.yyyy” 如果语言环境是德语,我需要使用“TT.MM.jj”来获得相同的结果

我已经为.NET找到了很多解决方案,不幸的是,我没有那种奢侈。通常的解决方案是临时设置Excel线程的区域设置为英语,但在本机C++中不可能。 我可以读取默认的系统区域设置,然后硬编码不同格式的字符串,但一旦有人使用我没有明确包含的区域设置,这就行不通了,所以这是一个糟糕的解决方案


那么,我如何解决这个问题,使其无论使用哪个语言环境都能工作?

一个可能的解决方案是使用系统时间格式化程序(如:_tcsftime、strftime、wcsftime)将日期/时间结构格式化为运行系统的语言环境。由于您的程序和excel都应该在同一台PC上运行,因此它应该可以正常工作,而不需要知道本地日期/时间字符串的外观

作为备用解决方案,您可能必须在程序的选项配置部分提供一系列硬编码格式字符串和/或用户手动输入的字符串,以防默认区域设置格式失败

OP第一次回复评论后的其他信息:--------------

区域设置仅影响UI中datetime二进制对象的文本显示。这样的DATEIME二进制对象总是以非常一致的方式存储为二进制结构,不管其在每个不同的上下文中都有何地方设置,无论是在Excel中(日期/时间格式单元)、C++(各种结构取决于API)、VisualBasic(变体)。p> 因此,如果您打算将datetime二进制结构导出到excel,而不是作为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...");

谢谢你的主意,不幸的是这两个都不行。我需要日期作为图表轴。要使日期轴选项可用(这就是为什么我要这么做,所以我可以说excel来做一个主刻度并每个月标记轴),简单地将日期作为字符串传递是行不通的,我需要使用=DATEVALUE(),然后将单元格格式化为日期。因此,我需要使用Excel数字格式。对不起,我想添加一个换行符,但按enter键发送了注释,它说我无法编辑它。第二种解决方案也不起作用。是的,我可以根据区域设置硬编码数字格式(我现在就是这么做的),但这不是一个真正的解决方案。该程序大约有20年的历史,设置保存在数据库中,因此由客户的所有用户共享。还有一个Ini文件,但是程序可以安装在网络驱动器上,因此Ini文件也可以共享。当然,每个用户的本地版本可能不同。将日期作为日期类型的变体传递给我解决了这个问题,非常感谢。不幸的是,这不是一个通用的解决方案,因为这样您只能以标准格式显示日期。如果有人需要不同的格式,这也不会有帮助。例如:如果您希望将其设置为“2013年2月27日,星期三”,它对应于excel数字格式字符串“ddddd,mmmm dd,yyyy”@naryrol-您还可以使用range.SetNumberFormat在导出代码中设置单元格格式,请参阅我添加的代码片段。是的,这正是我执行此操作的方式。但是,如果您将windows区域设置设置为德语、法语或意大利语,SetNumberFormat将引发异常,因为在德语的情况下,Excel在这种情况下希望NumberFormat为“TTTT,MMMM TT,jjj”(day=Tag=T,month=Monat=M,year=Jahr=J)。在.NET中,您可以将excel线程的线程区域设置为英语,并且只使用英语格式,但我在原生C++/MFC中找不到这样做的方法(或具有相同效果的方法)