ASP.NET(C\#)EXCEL 을 읽 고 날짜 문 제 를 해결 하 는 방법 공유

4755 단어 ASP.NETEXCEL
OLEDB 를 사용 하면 엑셀 파일 을 읽 을 수 있 습 니 다.우 리 는 이 엑셀 파일 을 데이터 소스 로 만 들 면 됩 니 다.
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 으로 바 꾸 면 이 문 제 를 풀 수 있 습 니 다.

좋은 웹페이지 즐겨찾기