从Excel列获取指数值

时间:2017-08-01 09:12:14

标签: c# asp.net excel spreadsheet exponential

我创建了一个读取 Excel工作表的函数因此 excel 中有一个包含 值的字段0.01 但是当我读到这个值时,它会变成某个指数形式,如 1.2999999999999999E-2 所以当我通过<时它会抛出异常带有此值的em> 数据表 。所以我如何在代码中读取准确值 OR 避免这种情况。 这是我阅读excel表的代码 -

        using (var sDoc = SpreadsheetDocument.Open(FileName, false))
        {

            bool emptyTable = false;

            var sheets = sDoc.WorkbookPart.Workbook.GetFirstChild<Sheets>().Elements<Sheet>();
            var relationshipId = sheets.First().Id.Value;
            var worksheetPart = (WorksheetPart)sDoc.WorkbookPart.GetPartById(relationshipId);
            var workSheet = worksheetPart.Worksheet;
            var sheetData = workSheet.GetFirstChild<SheetData>();
            var rows = sheetData.Descendants<Row>().Skip(IgnoreRows).ToList();

            if (rows.Count == 0)
            {
                Results = dt;
                emptyTable = true;
            }

            if (!emptyTable)
            {
                foreach (var cell in rows.ElementAt(0).Cast<Cell>())
                {
                    dt.Columns.Add(GetCellValue(sDoc, cell));
                }

                foreach (var row in rows.Skip(1))
                {
                    bool emptyRow = true;
                    var tempRow = dt.NewRow();

                    for (var i = 0; i < row.Descendants<Cell>().Count(); i++)
                    {
                        string rowValue = GetCellValue(sDoc, row.Descendants<Cell>().ElementAt(i));
                        tempRow[i] = rowValue;
                        emptyRow = emptyRow && String.IsNullOrWhiteSpace(rowValue);
                    }

                    if (!emptyRow)
                    {
                        dt.Rows.Add(tempRow);
                    }
                    else
                    {
                        break;
                    }
                }
            }

这是expon值 - enter image description here

enter image description here

1 个答案:

答案 0 :(得分:1)

您可以尝试这样的事情(for循环中的代码块)

string rowValue = GetCellValue(sDoc, row.Descendants<Cell>().ElementAt(i));

if (i == 5) // index of column where you're expecting that value
{
    decimal tempDecimal;
    decimal.TryParse(rowValue, NumberStyles.AllowExponent | NumberStyles.AllowDecimalPoint, CultureInfo.InvariantCulture, out tempDecimal);
    rowValue = tempDecimal.ToString("0.##");
}
tempRow[i] = rowValue;
emptyRow = emptyRow && String.IsNullOrWhiteSpace(rowValue)

基本上,代码试图将特定列(在我的示例中为5)的值解析为decimal,然后将其转换回带有两个小数点的字符串。