2013-02-25 3 views
0

네이티브 C++에서 Excel COM 자동화를 사용하고 있습니다. 내 목표는 날짜 범위의 NumberFormat을 설정하는 것입니다. 문제는 Excel에서 예상하는 형식 문자열은 사용자의 로캘에 따라 다릅니다.네이티브 C++에서 로캘을 무시하는 날짜에 대한 Excel NumberFormat 설정

예 : 로케일이 영어입니다 경우 내가하는 NumberFormat를 설정해야합니다 "DD.MM.YYYY" 에 로케일 내가 같은 결과를 얻을 "TT.MM.JJJJ"를 사용할 필요가 독일어 인 경우.

.NET 용 솔루션을 많이 찾았습니다. 불행히도 그 사치품은 없습니다. 일반적인 해결책은 일시적으로 Excel 스레드의 로케일을 영어로 설정하는 것이었지만 네이티브 C++에서는 가능하지 않았습니다.

기본 시스템 로캘을 읽은 다음 다른 형식 문자열을 하드 코드 할 수는 있지만 분명히 포함되지 않은 로캘을 사용하는 즉시 작동하지 않으므로이 방법이 바람직하지 않습니다.

그래서이 문제를 해결하여 어떤 로캘이 사용 되든 상관없이 어떻게 작동합니까?

답변

2

가능한 해결책 중 하나는 시스템 시간 포맷터 (예 : _tcsftime, strftime, wcsftime)를 사용하여 날짜/시간 구조를 실행중인 시스템의 로켈로 포맷하는 것입니다. 프로그램과 엑셀 모두 동일한 PC에서 실행되기 때문에 로컬 날짜/시간 문자열이 어떻게 보이는지 알지 못해도 제대로 작동합니다.

폴백 솔루션으로 프로그램의 옵션 구성 섹션에 일련의 하드 코드 된 형식 문자열 및/또는 사용자가 직접 입력 한 문자열을 제공해야 할 수도 있습니다. 형식이 실패합니다. OP에서 첫 번째 응답 코멘트 후

추가 정보 : --------------

UI에서 날짜 시간 바이너리 객체의 텍스트 디스플레이 프리젠 테이션에 영향을

로케일 설정 만 . 이러한 datetime-binary-object는 Excel (날짜/시간 형식 셀), C++ (다양한 구조가 api에 따라 다름) 등 다양한 컨텍스트에서 로캘 설정에 관계없이 항상 일관된 방식으로 이진 구조로 저장됩니다. , VisualBasic (변형).

따라서 datetime 이진 구조를 문장이 아닌 Excel로 내보내는 경우 excel-automation이 IDispatch 인터페이스를 사용하므로 항상 "variant"형식을 사용하여 날짜 값을 저장할 수 있습니다. 당신은 완전히 로케일 설정을 잊을 수 있습니다.

의 코드의 추가 코드에 의해 셀을 날짜 변형을 수출하고 포맷합니다 : ---------------- 내가 MFC를 사용하고

그래서 코드는 매우 간단합니다 , winapi youself로 변환해야 할 수도 있습니다.

_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

감사합니다. 불행히도 두 가지 모두 작동하지 않습니다. 차트 축으로 날짜가 필요합니다. 날짜 - 축 옵션을 사용할 수있게하려면 (이 때문에 모든 일을하고있어, 큰 눈금을 만들고 매월 축을 레이블링 할 수 있다고 말할 수 있습니다.) 단순히 날짜를 문자열로 전달하면 작동하지 않습니다. 나는 = DATEVALUE()를 사용하고 셀을 날짜로 포맷해야합니다. 따라서 Excel NumberFormat을 사용해야합니다. – Naryoril

+0

죄송합니다. 줄 바꿈을 추가하고 싶지만 입력을 누르면 주석이 전송되고 편집 할 수 없다고 말합니다. 두 번째 솔루션은 작동하지 않습니다. 네, 로케일에 따라 숫자 형식을 하드 코딩 할 수 있습니다 (현재 내가 한 일입니다). 그러나 실제 솔루션이 아닙니다. 이 프로그램은 약 20 년이 넘었고 설정은 DB에 저장되므로 고객의 모든 사용자가 공유합니다. Ini 파일도 있지만 프로그램을 네트워크 드라이브에 설치할 수 있으므로 ini 파일도 공유 할 수 있습니다. 그러나 지역은 물론 각 사용자마다 다를 수 있습니다. – Naryoril

+0

날짜 형식의 변형으로 날짜를 전달하면 문제가 해결됩니다. 감사합니다. 불행히도 이것은 일반적인 해결책이 아니므로 표준 형식으로 만 날짜를 표시 할 수 있습니다. 누군가 다른 방식으로 형식을 지정해야하는 경우에도 도움이되지 않습니다. 예 : 엑셀 숫자 형식 문자열 "dddd, mmmm dd, yyyy"에 해당하는 "수요일, 2 월 27 일 수요일"로 지정하려는 경우 – Naryoril