7

我有这段代码(这是真实代码的简化版本),它可以打开 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 警告我该数字已存储为 text

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

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

4

2 回答 2

1

“ToString”方法的输出不是一成不变的,它取决于您的线程正在运行的当前文化信息。如果您在具有其他语言包的 PC 上运行该程序,则输出可能会发生变化。另一个原因可能是当前线程在代码中的其他位置设置为某些 cultureinfo。

请尝试以下示例。

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();
}
于 2013-09-24T06:49:57.980 回答
-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);
于 2013-09-12T06:32:47.197 回答