Excel 시트에서 Datetime 값 읽기


87

Excel 시트에서 datetime 유형 값을 읽으려고 할 때 이중 값을 반환합니다. 예를 들어 '2007-02-19 14:11:45.730'이와 같은 값을 읽으려면 이중 유형 값을 얻습니다. 더 나아가 시간 범위를 사용 하여이 이중 값을 변환하지만 성공적으로 완료되지는 않았습니다. '2007-02-19 12:00:00 AM'
이제이 값만 얻고 있기 때문에 첫 번째 값과 똑같은 datetime 값을 원합니다. 내 코드는 다음과 같습니다.

TimeSpan datefromexcel = new TimeSpan(Convert.ToInt32((range.Cells[rCnt, cCnt] as Excel.Range).Value2), 0, 0, 0);

  DateTime inputdate = new DateTime(1900, 1, 1).Add(datefromexcel);

   arrrow2[cCnt - 1] = inputdate.ToString();

도와주세요!!! 감사.

답변:


222

DateTime.FromOADate를 사용하여 OLE 자동화에서 .net 형식으로 날짜 형식을 변환해야합니다.

double d = double.Parse(b);
DateTime conv = DateTime.FromOADate(d);

1
답변에 투표하고 정답으로 표시해 주시겠습니까?
Mikael Svenson

투표하려면 15 개의 평판이 필요하지만 신규 사용자이므로 6 개만 가지고 있지만 정답으로 표시했습니다.
PRANAV

4
+1 분명히 투표 제한은 자신의 질문에 적용되지 않아야합니다.
Mike Rosenblum

1
나는 그것을 이해했다. 모든 사람이 동의하는 것은 아니라는 점을 지적하는 것만으로도이 행동은 버그입니다.
jwg 2013-06-03

1
이것이 제가 찾은 가장 쉬운 방법입니다. 감사합니다.
Ashok


6

Excel 시트에서 Datetime 값 읽기 : 시도해보십시오.

string sDate = (xlRange.Cells[4, 3] as Excel.Range).Value2.ToString();

double date = double.Parse(sDate);

var dateTime = DateTime.FromOADate(date).ToString("MMMM dd, yyyy");

4
그런데 귀하의 코드가 허용되는 답변과 어떻게 다른가요?
Pranav 2014-07-02

비추천. 이것은 비효율적입니다. 셀이 날짜 일 때 Value2박스형 double값을 반환하기 때문 입니다.
dbardakov

0

또는 단순히 OleDbDataAdapter를 사용하여 Excel에서 데이터를 가져올 수 있습니다.


0

또는 셀이 이미 실제 날짜 인 경우 .Value2 대신 .Value를 사용하십시오.

excelApp.Range[namedRange].Value
{21/02/2013 00:00:00}
    Date: {21/02/2013 00:00:00}
    Day: 21
    DayOfWeek: Thursday
    DayOfYear: 52
    Hour: 0
    Kind: Unspecified
    Millisecond: 0
    Minute: 0
    Month: 2
    Second: 0
    Ticks: 634970016000000000
    TimeOfDay: {00:00:00}
    Year: 2013

excelApp.Range[namedRange].Value2
41326.0

1
그것보다 조금 더 복잡하다고 생각합니다. Value을 반환 DateTime당신이 쓴 경우 DateTimeValue그러나 double당신이 쓴 경우 DateTimeValue2.
jwg 2013 년

0

나는 비슷한 상황이 있었고이 작업을 위해 아래 코드를 사용했습니다 ..

Aspose.Cells.LoadOptions loadOptions = new Aspose.Cells.LoadOptions(Aspose.Cells.LoadFormat.CSV);

Workbook workbook = new Workbook(fstream, loadOptions);

Worksheet worksheet = workbook.Worksheets[0];

dt = worksheet.Cells.ExportDataTable(0, 0, worksheet.Cells.MaxDisplayRange.RowCount, worksheet.Cells.MaxDisplayRange.ColumnCount, true);

DataTable dtCloned = dt.Clone();
ArrayList myAL = new ArrayList();

foreach (DataColumn column in dtCloned.Columns)
{
    if (column.DataType == Type.GetType("System.DateTime"))
    {
        column.DataType = typeof(String);
        myAL.Add(column.ColumnName);
    }
}


foreach (DataRow row in dt.Rows)
{
    dtCloned.ImportRow(row);
}



foreach (string colName in myAL)
{
    dtCloned.Columns[colName].Convert(val => DateTime.Parse(Convert.ToString(val)).ToString("MMMM dd, yyyy"));
}


/*******************************/

public static class MyExtension
{
    public static void Convert<T>(this DataColumn column, Func<object, T> conversion)
    {
        foreach (DataRow row in column.Table.Rows)
        {
            row[column] = conversion(row[column]);
        }
    }
}

이것이 some1 thx_joxin 도움이되기를 바랍니다.


2
이 답변을 사용하려면 라이선스와 Aspose.Cells 제품의 관련 설치가 필요합니다. 이것은 훌륭한 제품이지만 모든 개발자가 액세스 할 수있는 것은 아닙니다.
Zarepheth


0

또 다른 옵션 : 컴파일 시간에 셀 유형을 알 수없고 날짜 Range.Value가 원하는 DateTime개체를 반환하도록 셀 형식이 지정된 경우 입니다.


public static DateTime? GetAsDateTimeOrDefault(Range cell)
{
    object cellValue = cell.Value;
    if (cellValue is DateTime result)
    {
        return result;
    }
    return null;
}
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.