【.NET Core】【ClosedXML】셀 값 가져오기 2

소개




  • 이번에는 Datetime 값을 가져오려고 합니다.

    셀 값 가져오기



    yyyy-MM-dd HH:mm:ss



    실제 값



    9/27/2020  11:40:30 PM
    

    엑셀에 표시



    2020/09/27 23:40:30
    

    결과



    Date(yyyy/MM/dd HH:mm:ss)_FormatString  "2020/09/27 23:40:30"
    Date(yyyy/MM/dd HH:mm:ss)_CachedValue   "9/27/2020 11:40:30 PM"
    Date(yyyy/MM/dd HH:mm:ss)_ValueCached   ""
    Date(yyyy/MM/dd HH:mm:ss)_DataType  "DateTime"
    Date(yyyy/MM/dd HH:mm:ss)_FormulaAi ""
    

    좋은 :)

    월/일



    실제 값



    9/22/2020
    

    Excel에 표시



    9/22
    

    결과



    Date(MM/dd)_FormatString    "9/22"
    Date(MM/dd)_CachedValue "9/22/2020 12:00:00 AM"
    Date(MM/dd)_ValueCached ""
    Date(MM/dd)_DataType    "DateTime"
    Date(MM/dd)_FormulaAi   ""
    

    yyyy年MM月dd日(일본어)



    실제 값



    9/22/2020
    

    엑셀에 표시



    2020年9月22日
    

    결과



    Date(JP)_FormatString   "2020年9月22日"
    Date(JP)_CachedValue    "9/22/2020 12:00:00 AM"
    Date(JP)_ValueCached    ""
    Date(JP)_DataType   "DateTime"
    Date(JP)_FormulaAi  ""
    

    엄청난!

    일본 달력



    실제 값



    9/22/2020
    

    Excel에 표시



    令和2年9月22日
    

    결과



    JapaneseCalendar_FormatString   "[$]ggge\"年\"m\"月\"d\"日\";@"
    JapaneseCalendar_CachedValue    "9/22/2020 12:00:00 AM"
    JapaneseCalendar_ValueCached    ""
    JapaneseCalendar_DataType   "DateTime"
    JapaneseCalendar_FormulaAi  ""
    

    이 경우 FormatString 값을 사용할 수 없습니다.
    그러나 데이터 유형이 "DateTime"이므로 DateTime으로 값을 얻을 수 있습니다.

    ...
                if (cell.TryGetValue<DateTime>(out var dateValue))
                {
                    dictionary.Add($"{name}_DateTime", dateValue.ToString());
                }
    ...
    

    결과



    JapaneseCalendar_DateTime   "9/22/2020 12:00:00 AM"
    

    날짜(긴)



    실제 값



    9/22/2020
    

    엑셀에 표시



    Tuesday, September 22, 2020
    

    결과



    Date(Long)_FormatString "44096"
    Date(Long)_CachedValue  "44096"
    Date(Long)_ValueCached  ""
    Date(Long)_DataType "Number"
    Date(Long)_FormulaAi    ""
    

    DataType이 "숫자"이기 때문에 결과는 Excel의 값과 거리가 멉니다.
    셀에 "September", "AM"등과 같은 알파벳 값이 있으면 ClosedXML이 숫자로 처리됩니다.

    이 경우 TryGetValue로 값을 얻을 수 없습니다.
    그러나 DataType을 DateTime으로 강제 설정하면 TryGetValue로 DateTime 값을 얻을 수 있습니다.

    ...
                var format = cell.Style.DateFormat.Format;
                if(cell.DataType == XLDataType.Number &&
                    (format.Contains(@"mmmm") || format.Contains(@"AM/PM")))
                {
                    cell.DataType = XLDataType.DateTime;
                }
                if (cell.TryGetValue<DateTime>(out var dateValue))
                {
                    dictionary.Add($"{name}_DateTime", dateValue.ToString());
                }
    ...
    

    결과



    Date(Long)_DateTime "9/22/2020 12:00:00 AM"
    

    더 좋은 방법을 원합니다.

    좋은 웹페이지 즐겨찾기