MFC 중 CDatabase 를 이용하여 Excel 파일을 컨트롤 할 수 있는 기능이 있다.
CDatabase database;
CString sDriver = _T("MICROSOFT EXCEL DRIVER (*.XLS)");
CString sExcelFile = "xls 파일 전체 경로";
CString sSql;
CString strError;
sSql.Format(_T("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s"), sDriver, sExcelFile, sExcelFile);
if(database.OpenEx(sSql, CDatabase::noOdbcDialog))
{
sSql.Format(_T("SELECT * FROM [%s$A1:IV65536]"), "Address");
위와 같은 방법으로 xls 파일을 읽어 엑셀 데이터를 사용 할 수 있는데 2017년 10월 중순쯤부터 갑자기 오류가 나기 시작한다.
-5016
FIRSTROWHASNAMES\
잘못된 연결 문자열 특성입니다
뭐 위와 같은 내용의 에러 메시지가 보이게 된다.
구글링을 해보니 msexcl40.dll 파일이 업데이트 되면서부터 발생한 문제로 보인다.
문제가 발생하는 msexcl40.dll 의 버전은 4.0.9801.1 버전이고 크기는 345,088 byte 이다.
가장 좋은 방법은 KB4041681 업데이트를 제거 하는 방법이 있다.
하지만 최근 Windows 10 RS3 로 업데이트 하였다면 KB4041681 업데이트가 보이지 않는다.
이럴때는 msexcl40.dll 파일을 문제가 발생하지 않는 4.0.9801.0 버전으로 변경을 해주어야 하는데
이 파일은 특별한 권한이 있지 않는 이상 덮어쓰기가 되지 않는다.
msexcl40.dll 4.0.9801.0 버전 파일을 구하여 접근 가능한 경로에 파일을 복사 해둔다.
그리고 나서 레지스트티 편집기 (regedit.exe) 를 실행한다.
\HKEY_LOCAL_MACHINE\SOFTWARE\WOW6432Node\Microsoft\Jet\4.0\Engines\Excel
위 경로로 이동한 다음 Win32 라는 키의 값을 보면
C:\Windows\SysWOW64\msexcl40.dll
이렇게 되어 있는데 이 앞쪽 경로를 msexcl40.dll 4.0.9801.0 버전 파일이 있는 경로로 변경해준다.
예를 들어 D 드라이브의 Driver 라는 경로에 msexcl40.dll 이 존재 한다면
d:\driver\msexcl40.dll
위와 같이 변경해 주면 된다.
혹여 파일이 필요하신 분들은 아래 파일을 사용.
msexcl40.dll - 4.0.9801.0
파일에 의심이 되시는 분들은c:\windows 에서 msexcl40.dll 을 검색해보시면
여러 파일들이 검색이 되는데 이 중 크기가 다른 파일 또는 날짜가 다른 파일이 검색이 된다면 해당 파일의 속성을 클릭하여 버전 확인 후
4.0.9801.0 버전 파일을 복사하여 사용하면 된다.
만약 프로그램의 소스를 수정 할수 있는 상황 이라면 다음과 같이 코드를 수정 하면 작동 한다.
CDatabase database;
//CString sDriver = _T("MICROSOFT EXCEL DRIVER (*.XLS)");
CString sDriver = _T("Microsoft Excel Driver (*.xls, *.xlsx, *.xlsm, *.xlsb)");
CString sExcelFile = "xls 파일 전체 경로";
CString sSql;
CString strError;
sSql.Format(_T("DRIVER={%s};DSN='';FIRSTROWHASNAMES=1;READONLY=FALSE;CREATE_DB=\"%s\";DBQ=%s"), sDriver, sExcelFile, sExcelFile);
if(database.OpenEx(sSql, CDatabase::noOdbcDialog))
{
//sSql.Format(_T("SELECT * FROM [%s$A1:IV65536]"), "Address");
sSql.Format(_T("SELECT * FROM [%s$]"), "Address");
'Programming > MFC' 카테고리의 다른 글
무료 라인 차트 (0) | 2014.05.27 |
---|---|
MFC 문자가 한글인지 검사/체크하는 방법들 (0) | 2013.01.30 |
UNICODE <-> ANSI 변환 (0) | 2011.11.24 |
컨트롤을 상속 클래스, NM_CLICK 가 부모윈도우에 통지가 안될때.. (2) | 2010.12.03 |
ini 에서 섹션(Section) 정보 얻기 - GetPrivateProfileSectionNames (6) | 2010.08.13 |
CListCtrl 파일로 저장 - CListCtrl Save, Load (0) | 2010.08.12 |
CImageList Class (0) | 2008.10.08 |
MFC 에서 서로 다른 클래스의 핸들 얻어오기 (1) | 2008.05.30 |