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

我有这个代码(这是真正的代码的简化版本),打开excel并设置单元格的值。 请注意,我在意大利,我们使用而不是 分隔小数位。 这意味着我在代码中使用了12.5,但是这个数字上的ToString()的结果是“12.5”,而Excel也显示了12.5。

 using Xls = Microsoft.Office.Interop.Excel; public class ExcelTest { public static void Test { object hmissing = System.Reflection.Missing.Value; // create an instance of Excel and make it visible Xls.Application anApp = new Xls.ApplicationClass(); anApp.Visible = true; // add an empty workbook Xls.Workbooks wbks = anApp.Workbooks; wbks.Add(hmissing); Marshal.ReleaseComObject(wbks); // set the value of the first cell Decimal d = 12.5m; Xls.Range aRange = anApp.get_Range("A1", hmissing); aRange.set_Value(Xls.XlRangeValueDataType.xlRangeValueDefault, d.ToString()); Marshal.ReleaseComObject(aRange); } } 

一切都工作正常多年来使用.NET 2,但是当我尝试切换到.NET 4 Excel警告我的数字已被存储为文本

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

所以我不问如何修改我的代码,以使其工作。 我只是想明白为什么这个框架的两个版本的行为是不同的。 这是非常重要的,因为我希望在用户发现问题之前修改我的代码。

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

请尝试下面的例子。

 static void Main(string[] args) { decimal d = 12.56m; // Different thread cultureinfo Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("de-DE"); Console.WriteLine(d); Thread.CurrentThread.CurrentCulture = new System.Globalization.CultureInfo("en-US"); Console.WriteLine(d); Console.WriteLine(d.ToString( new System.Globalization.CultureInfo("de-DE").NumberFormat)); Console.WriteLine(d.ToString( new System.Globalization.CultureInfo("en-US").NumberFormat)); Console.Read(); } 

尝试这个:

  Excel.Application excel = new Excel.Application(); Excel.Workbook workbook = excel.Workbooks.Open(@"c:\test.xls", Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value, false, Missing.Value, Missing.Value); Excel.Worksheet worksheet = (Excel.Worksheet)workbook.Worksheets[1]; decimal dec = 12.5m; worksheet.get_Range("A1").Value = dec; DateTime date = DateTime.Now.Date; worksheet.get_Range("A2").Value = date; string str = "Hello"; worksheet.get_Range("A3").Value = str; Marshal.FinalReleaseComObject(worksheet); workbook.Save(); workbook.Close(false, Type.Missing, Type.Missing); Marshal.FinalReleaseComObject(workbook); excel.Quit(); Marshal.FinalReleaseComObject(excel);