C# Excel 가져오기 알파벳 혼합 열 데이터 손실 해결

3155 단어 Excel
오류 재현:
-----------------------------------------------------------------------
Excel을 가져와 데이터를 읽을 때 그 중 한 필드에 저장된 값은'2011072014','20110Aad10','25124Adfa','예asdfadf'같은'알파벳/숫자/중국어'데이터가 혼합되어 있으며, Excel 표의 상위 8개 또는 상위 8개 이상의 데이터에 있는 이 열의 데이터는'2011072012','2011072013','2011072014'와 같은 순수한 숫자로 구성되어 있다.8줄보다 크면 이 열의 데이터 구성이 숫자+중국어+자모의 조합으로 바뀌어 이 열의 값을 찾지 못하는 문제가 발생한다
오류 원인:
-----------------------------------------------------------------------
Excel 읽기 데이터 열의 형식은 각 열의 상위 8개 데이터의 유형에 따라 읽기와 쓰기의 유형을 판단합니다.예를 들어 앞의 8개의 데이터는 3개가 자막이고 5개가 숫자라면 이 열은 모두 숫자형으로 읽힌다. 유형이 가장 많으면 8조 이후의 어떤 유형이든 이 유형으로 읽으면 그 자모들은 읽을 수 없다.
 
icrosoft를 사용합니다.Jet.OLEDB.4.0 읽기 데이터는 한 필드에 각각 텍스트와 숫자가 혼합된 데이터가 있을 때 어떤 유형의 데이터가 손실됩니다.
이러한 문제의 근원은 Excel ISAM[3](Indexed Sequential Access Method, 즉 색인 순서 접근 방법) 드라이버의 제한과 관련이 있다. Excel ISAM 드라이버는 이전 몇 줄의 실제 값을 검사하여 Excel 열의 유형을 확정한 다음에 샘플의 대부분 값을 대표할 수 있는 데이터 유형을 선택한다.즉, Excel ISAM은 열 앞에 있는 행(기본적으로 8행)을 찾아 많은 유형을 처리 유형으로 지정합니다.예를 들어 숫자가 많으면 알파벳 등 텍스트를 포함하는 다른 데이터 항목이 비어 있다.반대로 텍스트가 많으면 순수한 숫자의 데이터 항목이 비어 있습니다.현재 1절 프로그램 코드 Extended Properties 항목의 HDR과 IMEX가 대표하는 의미를 구체적으로 분석합니다.HDR은 Excel 테이블의 첫 번째 줄을 필드 이름으로 할지 여부를 설정하는 데 사용되며,'YES'는'NO'가 아니라 데이터 내용을 나타낸다.IMEX는 내보내기, 가져오기, 혼합 모드를 나타내는 0, 1, 2 세 가지 값으로 드라이버에 Excel 파일을 사용하도록 알려주는 모드입니다.IMEX=1을 설정할 때 강제 혼합 데이터를 텍스트로 변환합니다. 그러나 이러한 설정만으로는 신뢰할 수 없습니다. IMEX=1은 한 열의 여덟 줄 데이터에 최소한 한 줄 이상의 텍스트 항목이 있을 때만 작용합니다. 이것은 이전 여덟 줄 데이터에서 데이터 형식이 선택한 줄을 약간 바꾸는 것입니다.예를 들어 어떤 열의 앞 8줄의 데이터가 모두 순수한 숫자라면, 그것은 여전히 숫자 형식을 이 열의 데이터 형식으로 하고, 그 다음에 줄에 텍스트가 포함된 데이터는 여전히 비어 있다.또 다른 개선 조치는 IMEX = 1과 레지스트리 값 TypeGuessRows를 함께 사용하는 것입니다. TypeGuessRows 값은 ISAM 드라이버의 이전 데이터 샘플링에서 데이터 유형을 결정하고 기본값은 "8"입니다."HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel"에서 레지스트리 값을 수정하여 샘플링 행 수를 변경할 수 있습니다.그러나 이런 개선은 근본적으로 문제를 해결하지 못했다. 설령 우리가 IMEX를 "1"으로 설정한다 하더라도, TypeGuess Rows를 더 크게 설정했다. 예를 들어 1000, 데이터 테이블에 1001줄이 있다고 가정하면 어떤 열의 앞 1000줄은 모두 순수한 숫자이고 이 열의 1001줄은 또 하나의 텍스트이다. ISAM이 구동하는 이런 메커니즘은 이 열의 데이터를 공백으로 만든다.
sql 서버에서 사용하기
SELECT * FROM OpenDataSource('Microsoft.Jet.OLEDB.4.0','Data Source='E:\데이터.xls', User ID=Admin, Password=, Extended properties='Excel 8.0, HDR=YES, IMEX=1')
-----------------------------------------------------------------------
 
프로젝트에 다음과 같은 코드를 추가하면 자동으로 등록표를 수정합니다!
RegistryKey reg_TypeGuessRows = Registry.LocalMachine.CreateSubKey(@"SOFTWARE\Microsoft\Jet\4.0\Engines\Excel");
reg_TypeGuessRows.SetValue("TypeGuessRows", 5000);

 
원본:http://www.haogongju.net/art/2188339

좋은 웹페이지 즐겨찾기