2013-02-25 3 views
2

현재 OpenXML SDK를 사용하고 있으며 OpenXML 값과 비교하여 Excel에 표시된 값에 문제가 있습니다.Excel 값과 다른 OpenXML 값

기본적으로 B4의 값이 "202"인 스프레드 시트가 있습니다. 그러나 OpenXml을 사용하여 스프레드 시트에서 값을 읽을 때받는 값은 "201.99999999999997"입니다.

다음과
using (SpreadsheetDocument document = SpreadsheetDocument.Open(_excelFile1, false)) 
{ 
    WorkbookPart wbPart = document.WorkbookPart; 

    var sheet = wbPart.Workbook.Descendants<Sheet>().First(); 

    var wsPart = (WorksheetPart)(wbPart.GetPartById(sheet.Id)); 

    Cell cell1 = wsPart.Worksheet.Descendants<Cell>().Where(c => c.CellReference == "B4").FirstOrDefault(); 
    Cell cell2 = wsPart.Worksheet.Descendants<Cell>().Where(c => c.CellReference == "C4").FirstOrDefault(); 
    Cell cell3 = wsPart.Worksheet.Descendants<Cell>().Where(c => c.CellReference == "D4").FirstOrDefault(); 

    Console.WriteLine(String.Format("Cell B4: {0}", GetCellValue(cell1))); 
    Console.WriteLine(String.Format("Cell C4: {0}", GetCellValue(cell2))); 
    Console.WriteLine(String.Format("Cell D4: {0}", GetCellValue(cell3))); 
} 

private static string GetCellValue(Cell cell) 
{ 
    if (cell != null) return cell.CellValue.InnerText; 
    else return string.Empty; 
} 

그럼 내가 얻는 가치로 :

내가 값을 확인하는 테스트 응용 프로그램을 작성했습니다

및 코드 나는 다음과 같이 OPENXML이 사용하여 Excel 파일을 읽기 위해 사용하고

Cell B4: 201.99999999999997 

[UPDATE - XLSX 파일에서 RAW XML] 당신이 XLSX 파일 XML에서 볼 수 그래서

<row r="4" spans="1:4" x14ac:dyDescent="0.2"> 
    <c r="A4" s="2"> 
     <v>39797</v> 
    </c> 
    <c r="B4" s="3"> 
    <v>201.99999999999997</v> 
    </c> 
    <c r="C4" s="3"> 
    <v>373</v> 
    </c> 
    <c r="D4" s="3"> 
    <v>398</v> 
    </c> 
</row> 

는 OpenXML과는 올바른 값을 읽는 중. 그러나 "201.99999999999997"값을 "202"로 표시하려면 Excel에서 일종의 서식을 적용해야합니다. 이것은 사용자가 볼 수있는 값이므로 OpenXML을 사용하여 XLSX 파일에서 읽을 때 예상되는 값입니다.

그래서 이제는 사용자가 스프레드 시트에서 볼 때 값을 얻기 위해 Excel에서 적용한 서식을 알고 있지만 OpenXML을 사용하고 있는지 궁금합니다.

테스트로 스프레드 시트를 다시 만들려고했지만 스프레드 시트에 정수를 입력 할 때 값이 소수로 표시되는 경우가 있습니다. 매우 간헐적이며 문제를 설명하거나 해결할 수 없습니다.

+0

'GetCellValue'는 "나만의"방법이라고 가정합니다. 이 방법에 대한 구현도 제공하십시오. –

+0

셀 B4에 대한 완전한 XML 데이터를 추출하여 표시 할 수 있다면 또한 좋을 것입니다. –

+0

완료! 죄송합니다. – Simon

답변

2

201.99999999999997은 부동 소수점 숫자의 실제 표현입니다. 자세한 내용은 here을 참조하십시오. 따라서 당신은 옳습니다. 일종의 서식 (예 : 유효 자릿수) 적용에 탁월합니다. .NET은 다음과 같이 동일하게 수행 할 수 있습니다.

static void Main(string[] args) 
    { 
     string s = "201.99999999999997"; 
     // print s as string 
     Console.WriteLine(s); 
     // print s as double 
     Console.WriteLine(double.Parse(s, System.Globalization.CultureInfo.InvariantCulture)); 
     // print s as double, converted back to string 
     Console.WriteLine(double.Parse(s, System.Globalization.CultureInfo.InvariantCulture).ToString()); 
     Console.ReadKey(); 

     // output is: 
     // 201.99999999999997 
     // 202 
     // 202 
    } 

따라서 숫자가 필요할 경우 "201.99999999999997"을 number로 변환하십시오. 숫자의 문자열 표현이 필요하면 숫자로 변환 한 다음 다시 문자열로 변환하십시오.

+0

CultureInfo.InvariantCulture를 사용하여 다시 문자열로 변환 할 때 여기에 언급 할 가치가있는 것은 잘못된 형식을 피하기 위해 InvariantCulture를 ToString에도 적용해야한다는 것입니다. 즉 .ToString (CultureInfo.InvariantCulture) –