minarai
2k
2020-05-08 11:36:56
8
570

C# 엑셀시트에서 날짜값 읽는 방법 질문입니다.


아래는 소스코드구요


읽으려는 셀이 날짜 형식입니다 yyyy/MM/dd

_Excel._Application excel = new _Excel.Application();
        _Excel.Workbook wb;
        _Excel.Worksheet ws;

        public DateTime? readCellDateTime(int col, int row)
        {
            DateTime dt = new DateTime();
            try
            {
                col++;
                row++;
                if (ws.Cells[col, row].Value2 != null)
                {
                    String sdate = Convert.ToString(ws.Cells[col, row].Value2);
                    double date = double.Parse(sdate);
                    dt = DateTime.FromOADate(date);
                    return dt;
                }
                return null;
            }
            catch (Exception)
            {
                MessageBox.Show("DataError。", "Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                return null;
            }
        }


이러면 if문 타는부분에서 바로 catch로 빠져버리는데 


구글링 해도 만족할만한 답을 못찾고 있습니다...

위와같은 형식으로 했을때 어떻게 하면 좋을까요..


0
  • 답변 8

  • CyanGlint
    719
    2020-05-08 11:56:05

    catch로 빠지는데로 끝내지 마시고 어떤 오류가 발생하는지 내용을 읽어보세요.

    모든 디버깅의 기본입니다.


    짐작컨대 ws나 ws.Cells[col, row] 중 하나가 null이어서 NullPointException이 발생했을 것 같네요.

    ws의 초기화 구문이나 col, row 증감 로직에 문제가 있을겁니다.

  • minarai
    2k
    2020-05-08 12:36:16

    CyanGlint 

    col,row전부 체크 했구여

    널값 아니구여

    날짜 제외하고 전부 잘 읽어와서 초기화문도 문제가 없습니다.

    Value2가 Object로 가져오긴 하는데 유일하게 날짜 포멧만 못가져온다는것까지 찾았습니다.

    구글링 답변은 전부 문자열로 읽어서 형변환 해라

                        String sdate = Convert.ToString(ws.Cells[col, row].Value2);

                        double date = double.Parse(sdate);

                        result = DateTime.FromOADate(date);


    이런 답변만 해주고있는데

    엑셀시트의 날짜값을 문자열로 읽으려고 하니까 에러가 나는데 어떻게 해야될지 막막하네요

     구글링으로 만족할만한 답을 못찾아서 질문을 적었습니다.



  • byungil
    468
    2020-05-08 14:10:47

    CyanGlint 님 댓글대로 무슨 예외가 던져지는지 확인해보세요.

    왜 예외 정보를 버리고 있나요?

    catch (Exception) ----> catch(Exception e) { MessageBox.Show(e.Message) }

  • minarai
    2k
    2020-05-08 14:15:10

    byungil 


    System.Runtime.InteropServices.COMException

    위에 에러가 뜹니다...

  • byungil
    468
    2020-05-08 14:17:39
    innerexception 도 쭈욱 따라 들어가 보세요.. 뭔가 나올겁니다.
  • minarai
    2k
    2020-05-08 14:57:37

    ㄴ 조금 더 찾아보겠습니다.

    답변 감사합니다.

  • CyanGlint
    719
    2020-05-08 16:02:54

    COMException이면 값을 읽어오는 과정 자체에 문제가 있는 것이 맞을 것 같은데요


    Cells.get_Range("A1").Value2

    이런식으로 하드코딩해서 날짜 형식이 있는 셀에 한번 직접 접근 해 보세요

    접근 가능하다면 루프를 잘못 돌리고있는게 맞습니다.


    Value2 값을 읽어올 수 있다면

    Double로 캐스팅하고 DateTime으로 변환하는 로직 자체는 동작하는 로직이 맞아요.

  • minarai
    2k
    2020-05-08 16:53:10

    CyanGlint 

    찾았습니다

    같이 일하는 사람이 중간에 엑셀 인스턴스 종료하는 로직을 넣어놨던게 화근이었네요..


    Cells.get_Range("A1").Value2 방식은 나중에 기회가 되면 한번 써봐야겠네요

    답변 감사드립니다.

  • 로그인을 하시면 답변 을 등록할 수 있습니다.