ASP.NET(C\#)EXCEL 을 읽 고 날짜 문 제 를 해결 하 는 방법 공유
D 디스크 에 엑셀 파일 test.xls 를 만 듭 니 다.
둘째,워 크 시트 Sheet 1 의 내용 을 DataSet
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/test.xls;"+
"Extended Properties='Excel 8.0'";
DataSet ds = new DataSet();
OleDbDataAdapter oada = new OleDbDataAdapter("select * from [Sheet1$]", strConn);
oada.Fill(ds);
에서 읽 은 DataSet 은 다음 과 같 습 니 다.그림 에서 excel 파일 의 첫 줄 이 DataSet 의 열 이름 으로 바 뀌 었 음 을 알 수 있 습 니 다.이것 이 바로 시스템 의 기본 설정 입 니 다.
3.첫 번 째 줄 도 데이터 줄 로 하려 면 연결 문자열 에 HDR=No 속성 을 추가 할 수 있 습 니 다.예 를 들 어
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/test.xls;"+
"Extended Properties='Excel 8.0;HDR=No'";
DataSet ds = new DataSet();
OleDbDataAdapter oada = new OleDbDataAdapter("select * from [Sheet1$]", strConn);
oada.Fill(ds);
결 과 는 예상 치 못 할 수도 있 습 니 다.첫 번 째 줄 의 첫 번 째 열 과 세 번 째 열 이 모두 비어 있 는 것 은 시스템 이 첫 번 째 열 을 숫자 로 식별 하고 세 번 째 열 을 날짜 로 식별 하기 때문이다.
첫 줄 의 데 이 터 는 격식 에 맞지 않 아 비어 있다.
4.모든 열 을 문자열 로 읽 을 수 있 습 니 다.속성 IMEX=1 만 추가 하면
string strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/test.xls;"+
"Extended Properties='Excel 8.0;HDR=No;IMEX=1'";
DataSet ds = new DataSet();
OleDbDataAdapter oada = new OleDbDataAdapter("select * from [Sheet1$]", strConn);
oada.Fill(ds);
결 과 는 어떻게 될까요?다시 한 번 당신 의 예상 을 벗 어 나 지 않 았 습 니까?세 번 째 줄 의 날짜 가 어떻게 숫자 로 바 뀌 었 습 니까?사실은 엑셀 은 형식 을 바 꿀 때 자동 으로 날 짜 를 숫자 로 바 꾸 었 습 니 다.
그럼 이 숫자 는 어떻게 나 온 거 예요?만약 당신 이 날 짜 를 1900 년 1 월 1 일 로 바꾼다 면,당신 은 그의 전환 결과 가 1 이라는 것 을 볼 수 있 습 니 다.이런 식 으로 유추 하면 39902 가 어느 날 인지 알 수 있 을 것 입 니 다.
여기 해결 방법:
방법 1:
public static string getDateStr(string strValue)
{
int i = Convert.ToInt32(strValue);
DateTime d1 = Convert.ToDateTime("1900-1-1");
DateTime d2 = d1.AddDays(i - 2);
string strTemp = d2.ToString("d");
return strTemp;
}
방법 2:
DateTime.FromOADate(Convert.ToInt32(strValue)).ToString("d");
5.엑셀 전체 내용 을 읽 고 싶 지 않 을 수도 있 습 니 다.앞의 두 열 만 읽 으 려 면:select*from[Sheet 1$A:B]
A1 에서 B2 까지 의 내용 만 읽 으 려 면:select*from[Sheet 1$A1:B2]
6.워 크 시트 의 이름 이나 이름 을 모 르 면 어떻게 해 야 합 니까?
우 리 는 색인 을 통 해 지정 한 워 크 시트 의 이름 을 가 져 올 수 있 습 니 다.다음 방법 은 워 크 시트 이름 의 배열 을 가 져 올 수 있 습 니 다.
ArrayList al = new ArrayList();
string strConn;
strConn = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:/test.xls;"+
"Extended Properties=Excel 8.0;";
OleDbConnection conn = new OleDbConnection(strConn);
conn.Open();
DataTable sheetNames = conn.GetOleDbSchemaTable
(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" });
conn.Close();
foreach (DataRow dr in sheetNames.Rows)
{
al.Add(dr[2]);
}
return al;
IMEX=1 일 때 모두 문자열 로 처리 되 는 것 은 아 닙 니 다.시스템 의 기본 설정 에 따라 8 줄 에 문자열 이 있 으 면 문자열 로 처리 합 니 다.모두 숫자 라면 숫자 열 이 고 날짜 도 같 습 니 다.
8 줄 이 부족 하거나 너무 많다 고 생각하면 레 지 스 트 HKEY 만 수정 할 수 있 습 니 다.LOCAL_MACHINE/software/microsoft/Jet/4.0/Engines/Excel/type GuessRows,이 값 이 0 이면 모든 줄 에 따라 어떤 유형 을 사용 하 는 지 판단 합 니 다.데이터 양 이 확실히 적 지 않 는 한 그렇게 하 는 것 을 권장 하지 않 습 니 다.
EXCEL 의 데이터 셀 을 읽 을 수 없습니다.데이터 가 있 지만 읽 으 면 모두 빈 값 입 니 다.
해결 방법:
1.가 져 온 데이터 연결 문자열 에 IMEX=1 을 추가 합 니 다."Provider=Microsoft.Jet.OLEDB.4.0;Data Source="C:\Data.xls";Extended Properties="Excel 8.0;HDR=Yes;IMEX=1; ”,이렇게 하면 돼.
주:
“HDR=Yes;”첫 줄 에 데이터 가 아 닌 열 이름 을 표시 합 니 다.
“IMEX=1;”알림 드라이버
시퀀스 는 결국'혼 합 된'데이터 열 을 텍스트 로 읽 습 니 다.
둘 다 같이 써 야 돼.
이 정도 면 되 는 줄 알 았 는데그러나 실제 사용 과정 에서 이렇게 설정 하면 안 된다.많은 자 료 를 찾 아 보 니 레 지 스 트 에 있 는 정 보 를 수정 해 야 한다.이렇게 하면 엑셀 이 8 줄 전의 내용 을 사용 하지 않 고 이 열의 유형 을 확정 할 수 있다.
레 지 스 트 수정 내용 은 다음 과 같다.
HKEY 에서LOCAL_MACHINE\\Software\Microsoft\Jet\4.0\Engines\\Excel 에는 TypeGuessRows 값 이 있 습 니 다.미리 설 정 된 것 은 8 입 니 다.8 열 을 읽 어서 각 칸 의 형 태 를 결정 하 겠 다 는 뜻 입 니 다.따라서 8 열 에 있 는 자료 가 모두 숫자 라면 9 열 에 있 는 문자 자 료 는 null 이 됩 니 다.이 문 제 를 해결 하려 면 TypeGuessRows 코드 값 을 0 으로 바 꾸 면 이 문 제 를 풀 수 있 습 니 다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
부트스트랩 ASP.NET에서 설정하는 법1) _Layout.cshtml 內 link로 bootstrap 참조 2) Nuget 패키지에서 BootStrap 다운로드 3) 하단 부트스트랩 예제 사이트 참고해서 프로젝트 개발 참고 :...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.