读取一长串数字作为字符串
Reading long sequence of digit as string
我正在使用 EPPlus 读取客户数据库。
有时在我读作字符串的文本单元格中,客户写了一长串数字
我的代码以指数格式读取它。
有没有办法强制读取字符串?
这是我正在使用的代码片段
using (ExcelPackage xlPackage = new ExcelPackage(new FileInfo(xlsFile))) {
var myWorksheet = xlPackage.Workbook.Worksheets.First();
while (!string.IsNullOrEmpty(myWorksheet.Cells[rowNum, 1].GetValue<string>()))
{
var cell = myWorksheet.Cells[rowNum, 20];
var idDoc = cell.GetValue<string>(),
// do something with idDoc
rowNum += 1;
}
}
当单元格包含 1790002099190700 时,idDoc 为“1,7900020991907E+15”
您所看到的是有道理的,因为 excel 会将值存储为 double
,就像任何其他数值一样。
您似乎正在从数据库导出到 excel。我会假设导出时 Excel 中没有设置格式,在这种情况下,使用单元格对象的 .Text
值只是退回到 excel 中的 "General"。
假设你有这个:
所以,你最终得到的是:
[TestMethod]
public void Cell_Digits_As_String()
{
//
var fi = new FileInfo(@"c:\temp\Cell_Digits_As_String.xlsx");
using (var package = new ExcelPackage(fi))
{
var workbook = package.Workbook;
var worksheet = workbook.Worksheets.First();
var valCell = worksheet.Cells[1, 1];
var valText = valCell.Text; //Applies "General" unless otherwise specified
var valValue = valCell.Value; //As a BOXED double
var valString = valCell.GetValue<string>(); //Falls back to ChangeType
Console.WriteLine($"Value as text: {valText} ({valText.GetType()})");
Console.WriteLine($" Same as: {((double)valValue).ToString("0.#####", new CultureInfo("es-US"))}");
Console.WriteLine($"Value as value: {valValue} ({valValue.GetType()})");
Console.WriteLine($" Same as: {valValue.ToString()}");
Console.WriteLine($"Value as string: {valString} ({valString.GetType()})");
Console.WriteLine($" Same as: {Convert.ChangeType(valValue, typeof(double)).ToString()}");
}
}
这在外面显示:
Value as text: 1790002099190700 (System.String)
Same as: 1790002099190700
Value as value: 1.7900020991907E+15 (System.Double)
Same as: 1.7900020991907E+15
Value as string: 1.7900020991907E+15 (System.String)
Same as: 1.7900020991907E+15
所以,似乎使用.Text
是最方便的。但是,如果您担心格式被以任何方式更改或只是想绝对确定,请执行以下操作:
try
{
((double)valCell.Value).ToString("0.#");
}
catch (Exception ex)
{
//Handle it...
}
我正在使用 EPPlus 读取客户数据库。 有时在我读作字符串的文本单元格中,客户写了一长串数字 我的代码以指数格式读取它。
有没有办法强制读取字符串?
这是我正在使用的代码片段
using (ExcelPackage xlPackage = new ExcelPackage(new FileInfo(xlsFile))) {
var myWorksheet = xlPackage.Workbook.Worksheets.First();
while (!string.IsNullOrEmpty(myWorksheet.Cells[rowNum, 1].GetValue<string>()))
{
var cell = myWorksheet.Cells[rowNum, 20];
var idDoc = cell.GetValue<string>(),
// do something with idDoc
rowNum += 1;
}
}
当单元格包含 1790002099190700 时,idDoc 为“1,7900020991907E+15”
您所看到的是有道理的,因为 excel 会将值存储为 double
,就像任何其他数值一样。
您似乎正在从数据库导出到 excel。我会假设导出时 Excel 中没有设置格式,在这种情况下,使用单元格对象的 .Text
值只是退回到 excel 中的 "General"。
假设你有这个:
所以,你最终得到的是:
[TestMethod]
public void Cell_Digits_As_String()
{
//
var fi = new FileInfo(@"c:\temp\Cell_Digits_As_String.xlsx");
using (var package = new ExcelPackage(fi))
{
var workbook = package.Workbook;
var worksheet = workbook.Worksheets.First();
var valCell = worksheet.Cells[1, 1];
var valText = valCell.Text; //Applies "General" unless otherwise specified
var valValue = valCell.Value; //As a BOXED double
var valString = valCell.GetValue<string>(); //Falls back to ChangeType
Console.WriteLine($"Value as text: {valText} ({valText.GetType()})");
Console.WriteLine($" Same as: {((double)valValue).ToString("0.#####", new CultureInfo("es-US"))}");
Console.WriteLine($"Value as value: {valValue} ({valValue.GetType()})");
Console.WriteLine($" Same as: {valValue.ToString()}");
Console.WriteLine($"Value as string: {valString} ({valString.GetType()})");
Console.WriteLine($" Same as: {Convert.ChangeType(valValue, typeof(double)).ToString()}");
}
}
这在外面显示:
Value as text: 1790002099190700 (System.String)
Same as: 1790002099190700
Value as value: 1.7900020991907E+15 (System.Double)
Same as: 1.7900020991907E+15
Value as string: 1.7900020991907E+15 (System.String)
Same as: 1.7900020991907E+15
所以,似乎使用.Text
是最方便的。但是,如果您担心格式被以任何方式更改或只是想绝对确定,请执行以下操作:
try
{
((double)valCell.Value).ToString("0.#");
}
catch (Exception ex)
{
//Handle it...
}