在C#中将Excel单元格值设置为小数. .NET 2和.NET 4之间的差异

前端之家收集整理的这篇文章主要介绍了在C#中将Excel单元格值设置为小数. .NET 2和.NET 4之间的差异前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我有这个代码(这是真实代码的简化版本),它打开excel并设置单元格的值.请注意,我在意大利,我们使用,而不是.分隔十进制数字.这意味着我在代码中使用12.5,但ToString()对此数字的结果为“12,5”,Excel也显示为12,5.
  1. using Xls = Microsoft.Office.Interop.Excel;
  2.  
  3. public class ExcelTest
  4. {
  5. public static void Test
  6. {
  7. object hmissing = System.Reflection.Missing.Value;
  8. // create an instance of Excel and make it visible
  9. Xls.Application anApp = new Xls.ApplicationClass();
  10. anApp.Visible = true;
  11. // add an empty workbook
  12. Xls.Workbooks wbks = anApp.Workbooks;
  13. wbks.Add(hmissing);
  14. Marshal.ReleaseComObject(wbks);
  15. // set the value of the first cell
  16. Decimal d = 12.5m;
  17. Xls.Range aRange = anApp.get_Range("A1",hmissing);
  18. aRange.set_Value(Xls.XlRangeValueDataType.xlRangeValueDefault,d.ToString());
  19. Marshal.ReleaseComObject(aRange);
  20. }
  21. }

使用.NET 2,一切都运行良好多年,但当我尝试切换到.NET 4 Excel时,警告我该数字已存储为文本.

请注意,我知道简单地避免调用ToString()可以解决问题,但在实际情况下,我正在处理一个遗留应用程序,它想要在excel中存储多种数据,包括基本类型和用户定义的数据,以及ToString( )是所有这些类型上唯一可用的方法,可以在Excel中提供所需的结果,而无需检查类型并决定传递给set_Value的内容.

所以我不是问如何修改我的代码以使其工作.我只是想了解为什么在框架的两个版本中行为是不同的.这非常重要,因为我宁愿在用户发现错误之前修改我的代码.

解决方法

“ToString”方法输出不是一成不变的,取决于您的线程正在运行的当前cultureinfo.
如果您在使用其他语言包的PC上运行该程序,则输出可能会更改.
另一个原因可能是当前线程在代码中的其他位置设置为某个culturinfo.

请尝试以下示例.

  1. static void Main(string[] args)
  2. {
  3. decimal d = 12.56m;
  4. // Different thread cultureinfo
  5. Thread.CurrentThread.CurrentCulture =
  6. new System.Globalization.CultureInfo("de-DE");
  7. Console.WriteLine(d);
  8. Thread.CurrentThread.CurrentCulture =
  9. new System.Globalization.CultureInfo("en-US");
  10. Console.WriteLine(d);
  11.  
  12. Console.WriteLine(d.ToString(
  13. new System.Globalization.CultureInfo("de-DE").NumberFormat));
  14. Console.WriteLine(d.ToString(
  15. new System.Globalization.CultureInfo("en-US").NumberFormat));
  16. Console.Read();
  17. }

猜你在找的C#相关文章