2011-01-20 2 views
2

Office Open XML SDK에 기존 API가 있거나 타사에서 SpreadsheetML/.xlsx 파일의 날짜를 제대로 읽을 수 있습니까?SpreadsheetML 파일에서 날짜를 읽을 수있는 기존 API가 있습니까?

값이 날짜 일 때 검색 (numFmtId + 사용자 정의 숫자 형식)에 영향을주는 변수가 너무 많아서 날짜 직렬을 DateTime 값 (표준, 이전 버전 및 1904-super-backward 호환 가능)으로 변환하는 데 영향을주기 때문에 통합 문서), 이것이 SDK가 제공하거나 적어도 누군가가 처리 할 기존 코드 스 니펫을 가질 것이라는 점은 논리적 인 것처럼 보입니다.

저는 C#을 사용하고 있지만 모든 언어에 대한 해결책은 괜찮을 것입니다.

답변

1

이미이 용도에 특이한 것으로 보이지 않는 것처럼 보입니다. 내가 생각해 낸 일상이 여기있다.

/// <summary> 
/// Represents the formula used for converting date serial values stored within the workbook into DateTime instances. 
/// </summary> 
/// <remarks> 
/// Information on date serial conversion is available here: http://www.documentinteropinitiative.com/implnotes/ISO-IEC29500-2008/001.018.017.004.001.000.000.aspx 
/// </remarks> 
public enum XlsxDateCompatibility 
{ 
    /// <summary> 
    /// Standard dates are based on December 30, 1899 and are considered "Standard 1900" dates. 
    /// </summary> 
    StandardBase1900, 

    /// <summary> 
    /// Excel for Windows backwards compatible dates are based on December 31, 1899 are are considered "Backwards compatible 1900" dates. 
    /// </summary> 
    BackwardsCompatibleBase1900, 

    /// <summary> 
    /// Excel for Macintos backwards compatible dates are based on January 1, 1904 and are considered "1904" dates. 
    /// </summary> 
    BackwardsCompatibleBase1904 
} 

    private static readonly IDictionary<XlsxDateCompatibility, DateTime> _dateSerialBaseDates 
     = new Dictionary<XlsxDateCompatibility, DateTime> 
      { 
       {XlsxDateCompatibility.StandardBase1900, new DateTime(1899, 12, 30)}, 
       {XlsxDateCompatibility.BackwardsCompatibleBase1900, new DateTime(1899, 12, 31)}, 
       {XlsxDateCompatibility.BackwardsCompatibleBase1904, new DateTime(1904, 1, 1)} 
      }; 

    public static DateTime DateSerialToDateTime(double dateSerial, XlsxDateCompatibility dateCompatibility) 
    { 

     // special case for dateCompaitility 1900, Excel thinks 1900 is a leap year 
     // http://support.microsoft.com/kb/214019 
     if (dateCompatibility == XlsxDateCompatibility.BackwardsCompatibleBase1900 && dateSerial >= 61.0) 
     { 
      dateSerial -= 1; 
     } 

     DateTime baseDate;   
     if (!_dateSerialBaseDates.TryGetValue(dateCompatibility, out baseDate)) 
     { 
      baseDate = _dateSerialBaseDates[XlsxDateCompatibility.StandardBase1900]; 
     } 
     return baseDate.AddDays(dateSerial); 
    } 
0

이전에 Date를 읽은 적이 없지만 읽고있는 셀의 스타일 색인을 x:cellStyle에있는 x:numFmts 요소의 날짜 스타일 색인과 비교해야 할 것이라고 생각합니다. Office 2010에 셀에 날짜 데이터 표시기가있는 것을 알고 있습니다 (<x:c t='d'>). 따라서 해당 버전을 사용하는 경우 날짜가 맞는지 여부가 훨씬 쉽게 알 수 있습니다. 이것은 Office 2010에서 어떻게 보이는지입니다 :

<x:c r="C4" t="d"> 
    <x:v>1976-11-22T08:30Z</x:v> 
</x:c> 

는 cellValue가 더블 어디 DateTime.FromOADate(cellvalue)입니다 당신이해야 할 모든 믿는 날짜 시간에 데이터를 변환합니다. FromOADate 메서드를 사용하면 문제가 없다고 생각하기 때문에 Excel2006에서 DateTime을 OADate로 변환 한 후 Excel 날짜에 날짜를 삽입합니다.

이러한 기능을 수행하는 API가있는 한, 원하는 기능을 수행 할 수있는 API는 모르지만 향후 SDK 버전에 포함되기를 바랍니다.

+0

귀하의 의견에 감사드립니다. 이미 날짜를 확인하고 읽는 방법에 대한 기술적 인 세부 사항에 대해 질문하고 좋은 대답을 얻었습니다. 실제로는 대답이 보여주는 것보다 훨씬 복잡합니다. 필자는 날짜를 읽을 수있는 사용자 정의 코드를 작성하기에 충분한 정보를 가지고 있지만, 갑자기이 문제가 일반적인 문제 여야하고 기존 코드를 찾을 수 없다는 사실에 놀랐다. –

+0

@Samuel - 그래, 내 대답은 내가 어떻게 엑셀에서 날짜를 확인하는 태클을 시작 할지도 모르겠지만, 내가 쓴 것보다 더 복잡하다는 말은 틀림없이 50,000 발 전망이다. 기본적인 Open XML SDK 질문에 대한 답변을 찾기가 어렵 기 때문에이 코드를보고 싶습니다. – amurra

+1

내가 끝나면 프로젝트를 게시 할 것이다. Open XML SDK에서 SAX 스타일 처리를 사용하는 DataSet 변환기에 xlsx를 사용하는 것만으로 끝났습니다. –

관련 문제