簡體   English   中英

如何從excel單元格中獲取完整值,而不是顯示(舍入)值?

[英]How to get the full value from an excel cell, not the displayed (rounded) value?

我在從工作表中檢索單元格中的確切值時遇到問題。 如果我打開文件,單元格有一個十進制數字,它只顯示4位小數,但如果我點擊特定單元格,則值不同,有6位小數。 我知道這是一個應用於單元格的設置,只顯示4位小數。

現在我正在嘗試使用ClosedXML.Excel而不是Microsoft.Office.Interop.Excel在C#中檢索單元格的數據,但我唯一能得到的是4位小數值,而不是“整數”值,這是一個很大的問題,因為我稍后計算,由於缺少2位小數,我有很大的差異。

我嘗試過使用inputSheet.Worksheet.Cell(row,col).GetDouble()Convert.ToDouble(inputSheet.Worksheet.Cell(row, col).Value) ,甚至可以引用“RichText”屬性,或者... ToString(“0.000000”),但無論我使用什么,我只能檢索4個十進制值而不是完整的6個十進制值。

我看了一下庫的源代碼,這是Value getter的作用:

get
{
    string str = this.FormulaA1;
    if (!XLHelper.IsNullOrWhiteSpace(str))
    {
        string str2;
        string sName;
        if (str[0] == '{')
        {
            str = str.Substring(1, str.Length - 2);
        }
        if (str.Contains<char>('!'))
        {
            sName = str.Substring(0, str.IndexOf('!'));
            if (sName[0] == '\'')
            {
                sName = sName.Substring(1, sName.Length - 2);
            }
            str2 = str.Substring(str.IndexOf('!') + 1);
        }
        else
        {
            sName = this.Worksheet.Name;
            str2 = str;
        }
        if (this._worksheet.Workbook.WorksheetsInternal.Any<XLWorksheet>(w => (string.Compare(w.Name, sName, true) == 0)) && XLHelper.IsValidA1Address(str2))
        {
            return this._worksheet.Workbook.Worksheet(sName).Cell(str2).Value;
        }
        object obj2 = this.Worksheet.Evaluate(str);
        IEnumerable enumerable = obj2 as IEnumerable;
        if ((enumerable != null) && !(obj2 is string))
        {
            using (IEnumerator enumerator = enumerable.GetEnumerator())
            {
                while (enumerator.MoveNext())
                {
                    return enumerator.Current;
                }
            }
        }
        return obj2;
    }
    string s = this.HasRichText ? this._richText.ToString() : this._cellValue;
    if (this._dataType == XLCellValues.Boolean)
    {
        return (s != "0");
    }
    if (this._dataType == XLCellValues.DateTime)
    {
        return DateTime.FromOADate(double.Parse(s));
    }
    if (this._dataType == XLCellValues.Number)
    {
        return double.Parse(s);
    }
    if (this._dataType == XLCellValues.TimeSpan)
    {
        return TimeSpan.Parse(s);
    }
    return s;
}

我注意到,當它到達string s = this.HasRichText ? this._richText.ToString() : this._cellValue; string s = this.HasRichText ? this._richText.ToString() : this._cellValue; ,如果您從未調用過cell.RichText (因此既不用調試器查看它),您將獲得正確的值,因為this.HasRichText為false,因為該類仍未為其分配正確的值。 當它( this.HasRichText )為true ,你得到this._richText.ToString() ,即格式化的數字。 因此,如果您在訪問RichText之前訪問Value屬性,您應該獲得正確的值,無論如何您可以使用反射獲得_cellValue ,然后將其轉換為double如下所示:

var theRealDoubleValue = Convert.ToDouble(yourCell.GetType().GetField("_cellValue", System.Reflection.BindingFlags.NonPublic | System.Reflection.BindingFlags.Instance).GetValue(yourCell));

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM