如何使用开放式XML SDK在C#中格式化开放式XML十进制值
我在MVC应用程序中有一个场景,我使用OPEN XML for real excel文件,然后在表视图中显示列表,带精度点的十进制值无法正确读取和格式化,我尝试了多次转换,但似乎不起作用。我试图将其格式设置为小数点后2位,我尝试使用数学。舍入,但似乎不起作用。请参阅下面的代码:这是在我的excel工作表中的“索赔总额”列值上如何使用开放式XML SDK在C#中格式化开放式XML十进制值,c#,asp.net-mvc,openxml-sdk,C#,Asp.net Mvc,Openxml Sdk,我在MVC应用程序中有一个场景,我使用OPEN XML for real excel文件,然后在表视图中显示列表,带精度点的十进制值无法正确读取和格式化,我尝试了多次转换,但似乎不起作用。我试图将其格式设置为小数点后2位,我尝试使用数学。舍入,但似乎不起作用。请参阅下面的代码:这是在我的excel工作表中的“索赔总额”列值上 private static CleanSupplierClaim MappExcelOpenXMLtoGenericList(IList<string> ro
private static CleanSupplierClaim MappExcelOpenXMLtoGenericList(IList<string> rowData, IList<string> columnNames)
{
var cleanSupplierClaims = new CleanSupplierClaim()
{
Action = rowData[columnNames.IndexFor("Action")],
Line_Number = rowData[columnNames.IndexFor("Lineno")],
Total_Claim = rowData[columnNames.IndexFor("TotalClaim")].ToDecimalNullable(), //Convert.ToDecimal(Math.Round(Convert.ToDouble(rowData[columnNames.IndexFor("TotalClaim")].ToDoubleNullable()),2)),
Currency = rowData[columnNames.IndexFor("Currency")],
ClaimReference = rowData[columnNames.IndexFor("ClaimReference")]
};
return cleanSupplierClaims;
}
私有静态CleanSupplierClaim MappExcelOpenXMLtoGenericList(IList行数据,IList列名称)
{
var cleanSupplierClaims=new CleanSupplierClaim()
{
Action=rowData[columnNames.IndexFor(“Action”)],
行号=行数据[columnNames.IndexFor(“Lineno”)],
Total_Claim=rowData[columnNames.IndexFor(“TotalClaim”)].ToDecimalNullable(),//Convert.ToDecimal(Math.Round(Convert.ToDouble(rowData[columnNames.IndexFor(“TotalClaim”)].todoublenulable()),2),
Currency=rowData[columnNames.IndexFor(“货币”)],
ClaimReference=rowData[columnNames.IndexFor(“ClaimReference”)]
};
返回供应商索赔;
}
下面是我用来读取单元格值的泛型类:
private static string GetCellValue(SpreadsheetDocument document, Cell cell)
{
if (cell == null) return null;
string value = cell.InnerText;
//Process values particularly for those data types.
if (cell.DataType != null)
{
switch (cell.DataType.Value)
{
//Obtain values from shared string table.
case CellValues.SharedString:
var sstPart = document.WorkbookPart.GetPartsOfType<SharedStringTablePart>().FirstOrDefault();
value = sstPart.SharedStringTable.ChildElements[Int32.Parse(value)].InnerText.Trim();
break;
//Optional boolean conversion.
case CellValues.Boolean:
var booleanToBit = ConfigurationManager.AppSettings["BooleanToBit"];
if (booleanToBit != "Y")
{
value = value == "0" ? "FALSE" : "TRUE";
}
break;
case CellValues.Number:
return Convert.ToDecimal(cell.CellValue.Text).ToString();
default:
if (cell.CellValue != null)
return cell.CellValue.Text;
return string.Empty;
}
}
return value;
}
私有静态字符串GetCellValue(电子表格文档,单元格)
{
if(cell==null)返回null;
字符串值=cell.InnerText;
//处理特别是那些数据类型的值。
if(cell.DataType!=null)
{
开关(cell.DataType.Value)
{
//从共享字符串表中获取值。
案例CellValues.SharedString:
var sstPart=document.WorkbookPart.GetPartsOfType().FirstOrDefault();
value=sstPart.SharedStringTable.ChildElements[Int32.Parse(value)].InnerText.Trim();
打破
//可选的布尔转换。
大小写单元格值。布尔值:
var booleanToBit=ConfigurationManager.AppSettings[“booleanToBit”];
if(booleanToBit!=“Y”)
{
值=值==“0”?“假”:“真”;
}
打破
案例单元值。编号:
返回Convert.ToDecimal(cell.CellValue.Text).ToString();
违约:
if(cell.CellValue!=null)
返回cell.CellValue.Text;
返回字符串。空;
}
}
返回值;
}
我尝试过的所有格式要么跳过带小数的值,要么返回值为0,它对整数很有效,请协助
这是在使用VS 2013和OPEN XML的MVC应用程序中,十进制字符串是什么样子的?我打赌它与
或有关,
它有一个逗号,正如您指定的那样。以下是值857703和292,28的示例。此值的格式如下:292288888888888。我怎么能解决这个问题呢?哦,我以为你根本没有得到一个十进制值,只需使用Convert.ToDecimal(cell.CellValue.Text).ToString(“F”)
@alexanderck在我的本地机器上出于某种原因,它会返回0作为多个十进制值,当我部署到服务器上时,它显示为2922888888,知道为什么吗?可能是您机器的区域性,请参阅,如果您使用CultureInfo.InvariantCulture
则
是十进制分隔符,而,
是千位分隔符。