엑셀 임포트시 셀 타입을 미리 판단하지 않도록 하는 방법

윈도우 서버 환경에서 실행되는 웹 사이트에서 엑셀 파일을 가져와 데이터를 사용할 때, "일반" 타입 셀의 데이터 타입을 그냥 가져와 사용할 수 없기 때문에 데이터 타입을 강제로 정해야 합니다.

엑셀의 "일반" 데이터 타입이라는 것이 데이터베이스나 C#에는 없기 때문에 정해진 기준에 따라 사용 가능한 데이터 타입으로 변경을 해야 하는데, 이때 빠른 데이터 타입 판단을 위해 엑셀의 첫 8행만 먼저 읽어서 데이터 타입을 판단합니다.

기본 설정입니다.

실제로 첫 8행으로는 데이터 타입을 판단하기에는 부족하지만, 전체 행을 다 스캔하면 시간이 너무 오래 걸리기 때문에 그렇습니다.

경우에 따라서는 데이터 타입을 첫 8행만으로 미리 추정하지 않도록 막아야 할 필요가 있습니다.

첫 8행만 읽어서 판단하다보니 엑셀 파일에 따라 데이터 타입이 바뀌기도 하고, 첫 8행에 데이터가 없어서 판단을 할 수 없는 경우가 있습니다.

엑셀에서 읽은 데이터를 데이터베이스에 저장할 때는 데이터 타입이 맞지 않으면 에러가 발생하기 때문에 쏟아지는 에러를 피하려면 데이터 타입을 조금이라도 더 정확하게 판단할 수 있는 게 좋습니다.


레지스트리 값으로 데이터 타입을 추정하지 않게 하는 방법

레지스트리 편집기를 실행합니다.

어디있는지 모르면 윈도우 검색에서 "reg"를 입력하면 레지스트리 편집기가 검색됩니다.

윈도우 검색으로 레지스트리 편집기 검색

레지스트리 검색기능(편집 > 검색)으로 "typeguessrows"를 전체 검색합니다.

편집 > 찾기로 전체 검색 키워드 찾기 실행(Ctrl + F)

이름이 1개이기 때문에 위치는 정확하게 찾을 수 있지만 시간은 조금 걸립니다.

레지스트리 편집기 검색 결과(1개만 나옴)

"TypeGuessRows" 이름을 더블클릭해서 값 편집기 대화상자를 엽니다. 값 데이터 필드의 값을 8 -> 0으로 변경한 후 "확인"을 눌러 저장합니다.

키워드 값 수정 대화상자

이제 엑셀 데이터를 읽어서 처리할 때 첫 8행만 스캔해서 데이터 타입을 추정하지 않고 모든 행을 읽어서 데이터 타입을 지정합니다.

0은 모든 행을 스캔합니다.

30을 입력하면 첫 30행을 스캔해서 데이터 타입을 추정합니다.


코드에서 데이터 타입을 추정하지 않게 하는 방법

레지스트리 값을 수정하는 방법이 가장 확실한 방법이지만, 레지스트리 값 수정 없이도 엑셀 파일의 전체 행 스킨으로 데이터 타입을 추정할 수 있습니다.

엑셀 파일을 입포트하는 OLEDB 커넥션 문자열의 확장 속성에 데이터 타입을 추정하는 속성을 추가할 수 있습니다.

일반적으로 엑셀 파일을 가져오는 OLEDB 문자열은 다음과 같습니다.

Provider=Microsoft.ACE.OLEDB.12.0;Data Source="엑셀 파일 경로";Mode=ReadWrite|Share Deny None;Extended Properties="Excel 8.0; IMEX=1; HDR=YES; TypeGuessRows=0; ImportMixedTypes=Text"

맨 끝의 TypeGuessRows=0 이 데이터 타입을 추정할 때 모든 행을 스캔하는 것입니다. 앞서의 레지스트리 값 수정 방법으로 수정하는 레지스트리 값과 같습니다.

ImportMixedTypes=Text 속성은 엑셀 데이터가 혼합된 데이터일 경우 사용할 데이터 타입을 정하는 속성입니다.