Microsoft MVP성태의 닷넷 이야기
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
(연관된 글이 1개 있습니다.)

C# - 오피스 엑셀 97-2003 .xls 파일에 대해 32비트/64비트 상관없이 접근 방법

오피스 엑셀(Excel) 구 버전의 포맷(Excel 97-2003 Workbook)으로 저장된 파일(.xls)을 C#에서 접근하려면 "Microsoft.ACE.OLEDB.12.0" 제공자를 이용해 접근하시면 됩니다.

그런데 근래의 Office 2016 제품군의 엑셀을 설치하는 경우 기본적으로 Microsoft.ACE.OLEDB.12.0 제공자는 컴퓨터에 설치되어 있지 않습니다. 따라서 다음의 경로에서 제공하는 파일을 설치해 줘야 합니다.

Microsoft Access Database Engine 2010 Redistributable 
; https://www.microsoft.com/en-us/download/details.aspx?id=13255

설치 파일은 32비트(x86)와 64비트(x64)로 나뉘는데,

  • AccessDatabaseEngine.exe
  • AccessDatabaseEngine_X64.exe

문제는 2개를 동시에 실행할 방법이 없다는 것입니다. 왜냐하면 64비트를 설치하면 32비트 용을 설치하지 못하고, 그 반대로도 마찬가지입니다. 그나마 전에 쓴 글대로,

Access DB에 대한 32bit/64bit OLE DB Provider 관련 오류
; https://www.sysnet.pe.kr/2/0/1036

64비트 용인 AccessDatabaseEngine_X64.exe를 설치한 경우 32비트 용은 "AccessDatabaseEngine.exe /passive"로 명령행에서 실행하면 2개의 환경 모두 설치가 가능합니다. (부작용이 있는데 위의 글에 덧글을 읽어보세요.)

이렇게 데이터 제공자를 설치했으면 테스트 용인 .xls 파일을 다음과 같이 만들어 주고,

ole_db_excel_1.png

C#에서는 이렇게 접근할 수 있습니다.

using System;
using System.Data;
using System.Data.OleDb;

namespace ConsoleApp1
{
    class Program
    {
        static void Main(string[] args)
        {
            // Console.WriteLine("Is64bit: " + Environment.Is64BitProcess);

            string fileName = string.Format(@"Language.xls");

            string dsn = $"Provider=Microsoft.ACE.OLEDB.12.0; Data Source={fileName}; Extended Properties=\"Excel 8.0;\"";

            using (OleDbConnection con = new OleDbConnection(dsn))
            {
                OleDbDataAdapter da = new OleDbDataAdapter("select * from [MyDataSheet$]", con);

                DataSet ds = new DataSet();

                da.Fill(ds, "MyDataSheet$");

                ds.WriteXml(Console.Out);
            }
        }
    }
}

// 출력 결과
C:\temp\x64>ConsoleApp1.exe
<NewDataSet>
  <MyDataSheet_x0024_>
    <칼럼1>2</칼럼1>
    <칼럼2>3</칼럼2>
    <칼럼3>1</칼럼3>
  </MyDataSheet_x0024_>
  <MyDataSheet_x0024_>
    <칼럼1>3</칼럼1>
    <칼럼2>2</칼럼2>
    <칼럼3>3</칼럼3>
  </MyDataSheet_x0024_>
</NewDataSet>




그런데 여기서 해결하고 싶은 것은, 위의 프로그램을 AccessDatabaseEngine.exe가 설치되어 있든, AccessDatabaseEngine_X64.exe가 설치되어 있든 지에 상관없이 실행할 수 있도록 만들고 싶다는 것입니다.

이를 위해 각각의 데이터 제공자가 설치되어 있는 환경을 판단하고 이에 맞게 자신의 프로그램도 x86 또는 x64 프로세스로 실행해 주면 됩니다. 이를 위해 다음의 트릭을 사용할 수 있습니다.

C# - 하나의 바이너리로 환경에 맞게 32비트/64비트 EXE를 실행하는 방법
; https://www.sysnet.pe.kr/2/0/11328

따라서 위의 환경 설정을 이번 글의 예제 코드와 결합시키면 32비트용 AccessDatabaseEngine.exe가 설치된 환경에서는 이렇게 출력 결과를 보이고,

D:\temp>x86x64test.exe
Is64bit: False
Checked: C:\Program Files (x86)\common files\microsoft shared\OFFICE14\ACEOLEDB.DLL
<NewDataSet>
  <MyDataSheet_x0024_>
    <칼럼1>2</칼럼1>
    <칼럼2>3</칼럼2>
    <칼럼3>1</칼럼3>
  </MyDataSheet_x0024_>
  <MyDataSheet_x0024_>
    <칼럼1>3</칼럼1>
    <칼럼2>2</칼럼2>
    <칼럼3>3</칼럼3>
  </MyDataSheet_x0024_>
</NewDataSet>

64비트용 AccessDatabaseEngine_X64.exe가 설치된 환경에서는 스스로 64비트 프로세스 이미지를 풀어 내고 다음과 같이 실행해 줍니다.

C:\temp>x86x64test.exe
Is64bit: False
Checked: C:\Program Files (x86)\common files\microsoft shared\OFFICE14\ACEOLEDB.DLL
Checked: C:\Program Files\common files\microsoft shared\OFFICE14\ACEOLEDB.DLL
Is64bit: True
Checked: C:\Program Files\common files\microsoft shared\OFFICE14\ACEOLEDB.DLL
<NewDataSet>
  <MyDataSheet_x0024_>
    <칼럼1>2</칼럼1>
    <칼럼2>3</칼럼2>
    <칼럼3>1</칼럼3>
  </MyDataSheet_x0024_>
  <MyDataSheet_x0024_>
    <칼럼1>3</칼럼1>
    <칼럼2>2</칼럼2>
    <칼럼3>3</칼럼3>
  </MyDataSheet_x0024_>
</NewDataSet>

(첨부한 파일은 이 글의 예제 프로젝트를 포함합니다.)




이번 글은 요즘 문제가 되는 "Microsoft Excel 2007 ODBC Driver" 글을 읽고 한번 작성해 본 것입니다. ^^

10월11일자 Windows 보안 Update 후 64bit OS에서 32bit ODBC를 이용한 Excel 접근이 안됨
; https://social.msdn.microsoft.com/Forums/ko-KR/65bb9da3-415a-427f-9ee6-683ef4e6857d/1011-windows-update-64bit-os-32bit-odbc-excel-?forum=vistako

참고로, 환경에 따라 다음의 KB 업데이트가 영향을 미친다고 합니다.

windows 10 빌드 1607 - KB4041691
windows 10 빌드 1703 - KB4041676
windows 7 SP1 - KB4041681 




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 5/14/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 31  32  33  34  35  36  37  [38]  39  40  41  42  43  44  45  ...
NoWriterDateCnt.TitleFile(s)
12668정성태6/11/202110494.NET Framework: 1069. C# - DLL Surrogate를 이용한 Out-of-process COM 개체 제작파일 다운로드2
12667정성태6/10/20219146.NET Framework: 1068. COM+ 서버 응용 프로그램을 이용해 CoInitializeSecurity 제약 해결파일 다운로드1
12666정성태6/10/20217827.NET Framework: 1067. 별도 DLL에 포함된 타입을 STAThread Main 메서드에서 사용하는 경우 CoInitializeSecurity 자동 호출파일 다운로드1
12665정성태6/9/20219161.NET Framework: 1066. Wslhub.Sdk 사용으로 알아보는 CoInitializeSecurity 사용 제약파일 다운로드1
12664정성태6/9/20217469오류 유형: 723. COM+ PIA 참조 시 "This operation failed because the QueryInterface call on the COM component" 오류
12663정성태6/9/20218899.NET Framework: 1065. Windows Forms - 속성 창의 디자인 설정 지원: 문자열 목록 내에서 항목을 선택하는 TypeConverter 제작파일 다운로드1
12662정성태6/8/20218121.NET Framework: 1064. C# COM 개체를 PIA(Primary Interop Assembly)로써 "Embed Interop Types" 참조하는 방법파일 다운로드1
12661정성태6/4/202118670.NET Framework: 1063. C# - MQTT를 이용한 클라이언트/서버(Broker) 통신 예제 [4]파일 다운로드1
12660정성태6/3/20219774.NET Framework: 1062. Windows Forms - 폼 내에서 발생하는 마우스 이벤트를 자식 컨트롤 영역에 상관없이 수신하는 방법 [1]파일 다운로드1
12659정성태6/2/202111065Linux: 40. 우분투 설치 후 MBR 디스크 드라이브 여유 공간이 인식되지 않은 경우 - Logical Volume Management
12658정성태6/2/20218480Windows: 194. Microsoft Store에 있는 구글의 공식 Youtube App
12657정성태6/2/20219779Windows: 193. 윈도우 패키지 관리자 - winget 설치
12656정성태6/1/20218019.NET Framework: 1061. 서버 유형의 COM+에 적용할 수 없는 Server GC
12655정성태6/1/20217602오류 유형: 722. windbg/sos - savemodule - Fail to read memory
12654정성태5/31/20217578오류 유형: 721. Hyper-V - Saved 상태의 VM을 시작 시 오류 발생
12653정성태5/31/202110178.NET Framework: 1060. 닷넷 GC에 새롭게 구현되는 DPAD(Dynamic Promotion And Demotion for GC)
12652정성태5/31/20218323VS.NET IDE: 164. Visual Studio - Web Deploy로 Publish 시 암호창이 매번 뜨는 문제
12651정성태5/31/20218580오류 유형: 720. PostgreSQL - ERROR: 22P02: malformed array literal: "..."
12650정성태5/17/20217906기타: 82. OpenTabletDriver의 버튼에 더블 클릭을 매핑 및 게임에서의 지원 방법
12649정성태5/16/20219244.NET Framework: 1059. 세대 별 GC(Garbage Collection) 방식에서 Card table의 사용 의미 [1]
12648정성태5/16/20217867사물인터넷: 66. PC -> FTDI -> NodeMCU v1 ESP8266 기기를 UART 핀을 연결해 직렬 통신하는 방법파일 다운로드1
12647정성태5/15/20219097.NET Framework: 1058. C# - C++과의 연동을 위한 구조체의 fixed 배열 필드 사용파일 다운로드1
12646정성태5/15/20218236사물인터넷: 65. C# - Arduino IDE의 Serial Monitor 기능 구현파일 다운로드1
12645정성태5/14/20217944사물인터넷: 64. NodeMCU v1 ESP8266 - LittleFS를 이용한 와이파이 접속 정보 업데이트파일 다운로드1
12644정성태5/14/20219112오류 유형: 719. 윈도우 - 제어판의 "프로그램 및 기능" / "Windows 기능 켜기/끄기" 오류 0x800736B3
12643정성태5/14/20218235오류 유형: 718. 서버 유형의 COM+ 사용 시 0x80080005(Server execution failed) 오류 발생
... 31  32  33  34  35  36  37  [38]  39  40  41  42  43  44  45  ...