C# 值在VBA和C中产生不同的结果#

C# 值在VBA和C中产生不同的结果#,c#,vba,excel,vsto,C#,Vba,Excel,Vsto,我注意到Range.Value在VBA和C#中为日期值生成不同的结果 例如,如果单元格的值为5/13/1988,且数字格式为d/m/yyyy,则在VBA范围内,该值将返回“5/13/1988”,而在C#中,它返回“5/13/1988 12:00:00 AM” Range.Value2在两种语言中都是相同的(32276) 有人知道为什么VBA和C在这种情况下会产生不一致的结果吗 请注意,我知道我可以使用Range.Value2和Range.NumberFormat的组合,然后用C#格式化值,但我感

我注意到Range.Value在VBA和C#中为日期值生成不同的结果

例如,如果单元格的值为5/13/1988,且数字格式为d/m/yyyy,则在VBA范围内,该值将返回“5/13/1988”,而在C#中,它返回“5/13/1988 12:00:00 AM”

Range.Value2在两种语言中都是相同的(32276)

有人知道为什么VBA和C在这种情况下会产生不一致的结果吗


请注意,我知道我可以使用Range.Value2和Range.NumberFormat的组合,然后用C#格式化值,但我感兴趣的是为什么行为不一致。

很简单。在Excel互操作(您在VSTO项目中引用)中,MS显然已将日期单元格值映射到.Net DateTime数据类型

对于他们来说,最好的选择是不要像Date.Net那样使用数据类型(记住VB classic只有日期数据类型,而不是DateTime)

查看excel如何在后台处理数据:

VB.Net和C#以不同的方式处理数据

Excel 2013

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    '~~> Opens an existing Workbook. Change path and filename as applicable
    xlWorkBook = xlApp.Workbooks.Open("C:\Users\Siddharth\Desktop\Delete Later\Sample.xlsx")

    '~~> Display Excel
    xlApp.Visible = True
    xlWorkSheet = xlWorkBook.Sheets("Sheet1")

    MessageBox.Show(xlWorkSheet.Range("A1").Value)

    '
    '~~> Rest of the code
    '
End Sub


VB.Net 2013

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    '~~> Opens an existing Workbook. Change path and filename as applicable
    xlWorkBook = xlApp.Workbooks.Open("C:\Users\Siddharth\Desktop\Delete Later\Sample.xlsx")

    '~~> Display Excel
    xlApp.Visible = True
    xlWorkSheet = xlWorkBook.Sheets("Sheet1")

    MessageBox.Show(xlWorkSheet.Range("A1").Value)

    '
    '~~> Rest of the code
    '
End Sub


C#2013

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
    '~~> Opens an existing Workbook. Change path and filename as applicable
    xlWorkBook = xlApp.Workbooks.Open("C:\Users\Siddharth\Desktop\Delete Later\Sample.xlsx")

    '~~> Display Excel
    xlApp.Visible = True
    xlWorkSheet = xlWorkBook.Sheets("Sheet1")

    MessageBox.Show(xlWorkSheet.Range("A1").Value)

    '
    '~~> Rest of the code
    '
End Sub
很不幸,C#像你提到的那样处理它

您可以这样做以获得所需的结果

    private void button1_Click(object sender, EventArgs e)
    {
        Microsoft.Office.Interop.Excel.Application xlexcel;
        Microsoft.Office.Interop.Excel.Workbook xlWorkBook;
        Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet;

        object misValue = System.Reflection.Missing.Value;
        xlexcel = new Excel.Application();

        xlexcel.Visible=true ;

        xlWorkBook = xlexcel.Workbooks.Open(
                    "C:\\Users\\Siddharth\\Desktop\\Delete Later\\Sample.xlsx", 
                    0, true, 5, "", "", true, 
                    Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, 
                    "\t", false, false, 0, true, 1, 0);

        // Set Sheet 1 as the sheet you want to work with
        xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);

        String cellvalue = xlWorkSheet.Cells[1, 1].Value.ToString("MM/dd/yyyy", 
                           CultureInfo.InvariantCulture);

        MessageBox.Show(cellvalue);

        //
        //~~> Rest of the code
        //
    }

1899年12月31日之后的每一天的日期都是简单的1,时间是一天的小数部分。12:00:00 AM(午夜)是.0,所以它们表达的是完全相同的东西。我一点也不觉得结果不一致。同意@Jeeped,
格式(cdate(“5/13/1988”),“M.DD.YYYY HH:MM:SS”)
将返回相同的
5.13.1988 00:00:00
结果,因此没有不一致之处。你为什么说VB.NET&C以不同的方式处理它?如果考虑了正确的区域性/格式,则两者应输出完全相同的日期到字符串转换。VB.NET&C#的行为应该总是相同的,因此你的第一句话很容易让人误解。是的,他们应该用同样的方式处理,但不像我在上面演示的那样:)
。Value
在这两种语言中给出不同的输出……实际上我写了我删除的评论的第一个版本(显示的两个消息框没有显示相同的值?).MessageBox.Show(xlsheet.Range(“A1”).Value)(以及VB.NET版本)是将日期类型(Excel提供的)转换为字符串的一种不好的方法,因为您无法完全控制正在发生的事情。您应该始终考虑给定的区域性和/或格式(例如,下面的Value.ToString(“MM/dd/yyyy”)。为什么在您的情况下会有所不同?可能两个VB.NET/C#项目都有不同的默认区域性。如果您做得正确,输出将是相同的。您忽略了这里的要点。我不是在转换,而是试图显示在这两种情况下
.Value
所包含的内容。如果您不想使用
MessageBox.show
,请使用quickwatch请参见差异:)当您在.NET中将日期视为字符串时,发生了从日期类型到字符串类型的转换;在此转换中,已考虑了区域性(和/或日期格式)。如果您未明确指定,则给定语言将采用默认语言(无论它是什么)。因此,要完全控制.NET应用程序的任何日期/时间的输入/输出过程,您应该考虑到区域性,以及您没有做什么。在VB.NET和C#代码中包含上述日期格式,并且行为应该相同。