2013-09-05 44 views
7

我有這個代碼(這是真實代碼的簡化版本),它打開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的內容。

所以我不問如何修改我的代碼,以使其工作。我只是想明白爲什麼這個框架的兩個版本的行爲是不同的。這非常重要,因爲我希望在用戶發現有問題之前修改我的代碼。

+1

我不知道爲什麼.NET 2和.NET 4有區別,但您使用的是哪個版本的Excel?你確定它不只是一個Excel版本的差異? – flindeberg

+0

它似乎不依賴於Excel版本。我在Excel 2003和Excel 2010中試過,得到了相同的結果。 –

+1

我希望我知道答案,但我知道.NET 4在Interop的工作方式上做了很多工作。我找不到明確的解釋,但圍繞Interop的突破性更改引發了您列出的代碼的一些有趣的觀點:http://msdn.microsoft.com/en-us/library/ee855831%28VS.100%29.aspx也就是說,互操作類型的嵌入以及可選參數的處理似乎暗示了你所看到的。 –

回答

-1

試試這個:

 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); 
+0

請注意,我不問如何修改ny代碼,以擺脫這個問題。我只想知道這兩個版本的框架之間有什麼區別,以便能夠在客戶找到它們之前發現其他可能的錯誤。 –

1

了「的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(); 
} 
+0

我正在使用不同版本的框架運行示例,但在同一臺機器上(具有完全相同的cultureinfo)。此外,ToString()的結果與我期望的完全相同。 –

相關問題