我有這個代碼(這是真實代碼的簡化版本),它打開excel並設置單元格的值。請注意,我在意大利,我們使用,而不是。來分隔小數位。這意味着我在代碼中使用了12.5,但這個數字上的ToString()
的結果是「12.5」,而Excel也顯示了12.5。在C#中將Excel單元格值設置爲小數。 .NET 2和.NET 4之間的差異
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中存儲幾種數據,包括基本類型和用戶定義的,並且ToString()是所有這些類型中唯一可以在Excel中提供所需結果的方法,而無需檢查類型並決定傳遞給set_Value的內容。
所以我不問如何修改我的代碼,以使其工作。我只是想明白爲什麼這個框架的兩個版本的行爲是不同的。這非常重要,因爲我希望在用戶發現有問題之前修改我的代碼。
我不知道爲什麼.NET 2和.NET 4有區別,但您使用的是哪個版本的Excel?你確定它不只是一個Excel版本的差異? – flindeberg
它似乎不依賴於Excel版本。我在Excel 2003和Excel 2010中試過,得到了相同的結果。 –
我希望我知道答案,但我知道.NET 4在Interop的工作方式上做了很多工作。我找不到明確的解釋,但圍繞Interop的突破性更改引發了您列出的代碼的一些有趣的觀點:http://msdn.microsoft.com/en-us/library/ee855831%28VS.100%29.aspx也就是說,互操作類型的嵌入以及可選參數的處理似乎暗示了你所看到的。 –