2013-09-05 14 views
7

Bu kodu excel'i açan ve bir hücrenin değerini ayarlayan bu kodu (bu, gerçek kodun basitleştirilmiş bir sürümüdür) var. Lütfen İtalya'da olduğumu ve yerine ,'u kullandığımızı unutmayın. Ondalık basamakları ayırmak için. Bu kodda 12.5 kullanıyorum, ancak bu sayı ToString() sonucu "12,5" ve Excel de 12,5 gösterir.Bir Excel hücre değerini C# 'da ondalık olarak ayarlama. .NET 2 ve .NET 4 arasındaki farklar

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); 
    } 
} 

Her şey .NET 2'yi kullanarak yıllarca iyi çalıştı, ama .NET 4 geçmek çalıştığınızda Excel Numara metin olarak depolanan edildiğini beni uyarıyor etti.

Sadece ToString() yöntemini çağırmaktan kaçınmanın problemi çözdüğünü bildiğimi, ancak asıl durumda excel'e, hem basetypes hem de kullanıcı tanımlı olanlara çeşitli veri depolamak isteyen eski bir uygulama ile uğraştığımı lütfen unutmayın. ve ToString(), bu türlerde, türün kontrol edilmesine ve set_Value'ye neyin geçeceğine karar vermeden Excel'de istenen sonucu veren tek yöntemdi.

Çalışmak için kodumu nasıl değiştireceğimi sormuyorum. Ben sadece davranışın çerçevenin iki versiyonunda neden farklı olduğunu anlamaya çalışıyorum. Bu çok önemli çünkü kullanıcılar yanlış bir şey olduğunu öğrenmeden önce kodumu değiştirmeyi tercih ederim.

+1

Neden .NET 2 ve .NET 4 arasında bir fark olduğunu, ancak Excel'in hangi sürümünü kullandığınız hakkında hiçbir fikrim yok? Bunun sadece bir Excel sürüm farkı olmadığından emin misiniz? – flindeberg

+0

Excel sürümüne bağlı görünmüyor. Excel 2003 ve Excel 2010 ile denedim ve aynı sonuçları aldım. –

+1

Keşke cevabı bilmemi isterdim, ama .NET 4'ün Interop'un çalışma şekli hakkında çok şey yaptığını biliyorum. Kesin bir açıklama bulamıyorum, ancak Interop'un çevresindeki kırılma değişiklikleri listelediğiniz kodun etrafında bazı ilginç noktalar yaratıyor: http://msdn.microsoft.com/en-us/library/ee855831%28VS.100%29.aspx Yani, birlikte çalışma türlerinin gömülmesi ve isteğe bağlı parametrelerin nasıl ele alındığı, gördüğünüz şeylere işaret ediyor gibi görünmektedir. –

cevap

-1

bu deneyin:

 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

Lütfen problemden kurtulmak için ny kodunu nasıl değiştireceğimi sormadığımı unutmayın. Sadece bilmek istiyorum ki, bu iki sürüm arasında bu kadar fark var, böylece müşteriler onları bulmadan önce diğer olası hataları tespit edebiliyorlar. –

1

"ToString" Methode çıkış taş koymak ve çalıştıran iş parçacığı Cultureınfo geçerli bağlıdır değildir. Programı başka bir dil paketiyle bir bilgisayarda çalıştırıyorsanız, çıktı değişebilir. Başka bir sebep de geçerli iş parçacığının kodunuzdaki başka bir yere belirli bir kültür konumuna ayarlanmış olmasıdır.

Lütfen aşağıdaki örneği deneyin.

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

Örneği, çerçevenin farklı sürümleriyle ancak aynı makinede (tam olarak aynı cultureinfo ile) çalıştırıyorum. Ayrıca, ToString() sonucu tam olarak aynı ve beklediğim bir. –