[英]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.