2015-01-20 4 views
2

EPPlus를 사용하여 Excel 데이터를 읽습니다. 나는 엑셀 셀을 그대로 그리드에 표시해야합니다.EPPlus : 실제 표시된 텍스트 값 대신 int를 반환하는 날짜 열

날짜 열을 읽는 동안 EPPlus는 OADate 날짜의 int 값을 제공합니다.

사용자가 일반적으로 Excel을 열 때 볼 수있는 문자열 값을 읽을 수있는 방법이 있습니까? 즉 Excel 형식을 적용한 후의 값입니다. 시간 구성 요소가없는 경우 날짜가 두 배 (또는 정수로 엑셀에 저장되어있는 경우

등 valueAsString 또는 valueAsDisplayed을 제공하는 CELL 클래스에 어떤 기능이있을 것 같지 않습니다

...

답변

1

) "올바른"방법이 적용된 서식이 적용된 경우 코드에서 날짜를 다시 만들고 Excel에 적용된 날짜 형식을 다시 적용해야합니다. 유일한 주름은 excel의 형식이 약간 다릅니다 .net 특히 대소 문자를 구분할 때 MMM이 mmm이 아닌지 확인하기 위해 거기에 수표를 넣어야합니다. 이렇게 뭔가가 작동합니다 :

[TestMethod] 
public void OADate_Test() 
{ 
    //http://stackoverflow.com/questions/28046069/epplus-date-column-returning-int-rather-than-the-actual-displayed-text-value 
    var existingFile = new FileInfo(@"c:\temp\temp.xlsx"); 
    if (existingFile.Exists) 
     existingFile.Delete(); 


    using (var package = new ExcelPackage(existingFile)) 
    { 
     //.NET is case sensive so MMM must be capital but Excel might not be 
     const string FORMATDATE = "dd-MMM-yyyy"; 
     var mydate = new DateTime(2015, 1, 1); 
     var datedouble = mydate.ToOADate(); 

     var worksheet = package.Workbook.Worksheets.Add("Newsheet"); 

     worksheet.Cells["A1"].Value = "As Date"; 

     worksheet.Cells["A2"].Value = datedouble; 
     worksheet.Cells["A2"].Style.Numberformat.Format = FORMATDATE; 

     package.Save(); 
    } 

    using (var package = new ExcelPackage(existingFile)) 
    { 
     var worksheet = package.Workbook.Worksheets["Newsheet"]; 

     worksheet.Cells["B1"].Value = "As String"; 

     var datedouble = (double) worksheet.Cells["A2"].Value; 
     worksheet.Cells["B2"].Value = DateTime.FromOADate(datedouble).ToString(worksheet.Cells["A2"].Style.Numberformat.Format); 

     package.Save(); 

    } 
} 
+0

같은 것을 가장했을 것이다 :.'worksheet.Cells [ "A2"] Value.ToString (worksheet.Cells [ "A2". Style.Numberformat.Format)'나는 이것과 비슷한 것을 의미합니다 – harishr

+0

@HarishR 두 번째 줄부터 마지막 ​​줄까지 (저장 전에 하나)를 의미합니까? 나는 그것이 디자인 시간 오류를 생성 할 것이라고 생각합니다. 값은 객체 유형이므로 먼저 캐스팅하지 않고 형식 문자열을 적용 할 수 없습니다. – Ernie

+0

나는 그것이 오류를 발생시키는 것을 알고, 내가 말했던 것은 위대한 일이었을 것이다. :) 그리고 EP-Plus 라이브러리에서 누락되었는데, 왜 프레임 워크가 왜 형식화 된 값처럼 기본적인 것이 빠졌는지 이해할 수 없다. . 어쨌든 대답 – harishr

0

나는 또한 덜 복잡한 방법을 발견했습니다. 'NumberFormat'속성 대신 'NumberFormatLocal'을 "dd/mm/yyyy"로 변경하면 숫자 대신 날짜로 가져옵니다.

그래서

하위 ChangeExcelColumnFormat()

Dim ExcelApp As Excel.Application 
    Dim ExcelWB As Excel.Workbook 
    Dim ExcelWS As Excel.Worksheet 
    Dim formatRange As Excel.Range 

    Dim strFile As String = "C:\Test.xlsx" 
    Dim strSheetname As String = "Sheet1" 


    ExcelApp = New Excel.Application 
    ExcelWB = ExcelApp.Workbooks.Open(strFile) 

     strColSelect = "A:A" 
     strFormat = "dd/mm/yyyy" 

     formatRange = ExcelWS.Range(strColSelect) 
     formatRange.NumberFormatLocal = strFormat 

    ExcelWB.Save() 
    ExcelWB.Close() 
    ExcelApp.Quit() 

    ExcelWS = Nothing 
    ExcelWB = Nothing 
    ExcelApp = Nothing 

최종 하위