将数据写入Excel时如何制作正确的日期格式

时间:2010-07-22 15:55:33

标签: c# .net excel office-interop

我使用office interop将DataTable导出到Excel文件。问题是,Excel不会识别日期,而是显示数字。在另一种情况下,我传递一个字符串,然后将其识别为日期。在这两种情况下,数据都搞砸了。

我尝试过NumberFormat @,它应该以文本格式存储单元格,但它也不起作用。

Application app = new Application();
app.Visible = false;
app.ScreenUpdating = false;
app.DisplayAlerts = false;
app.EnableAnimations = false;
app.EnableAutoComplete = false;
app.EnableSound = false;
app.EnableTipWizard = false;
app.ErrorCheckingOptions.BackgroundChecking = false; 

Workbook wb = app.Workbooks.Add(XlWBATemplate.xlWBATWorksheet);
Worksheet ws = (Worksheet)wb.Worksheets[1];

for (int j = 0; j < dt.Rows.Count; j++)
{
    for (int i = 0; i < dt.Columns.Count; i++)
    {
        Range rng = ws.Cells[j+2, i+1]as Range;
        rng.Value2 = dt.Rows[j][i].ToString();
        rng.NumberFormat = "@";
    }   
}           

wb.SaveAs(filename, Missing.Value, Missing.Value, Missing.Value, Missing.Value,
       Missing.Value, XlSaveAsAccessMode.xlExclusive, Missing.Value, Missing.Value, Missing.Value, Missing.Value, Missing.Value);

wb.Close(false, Missing.Value, Missing.Value);            

app.Workbooks.Close();
app.Application.Quit();
app.Quit();    
System.Runtime.InteropServices.Marshal.ReleaseComObject(ws);
System.Runtime.InteropServices.Marshal.ReleaseComObject(wb);
System.Runtime.InteropServices.Marshal.ReleaseComObject(app);
ws = null;
wb = null;
app = null;
GC.Collect();

为什么我的NumberFormat @不起作用? Textformat不应该像我把它放在一样显示所有内容吗?

11 个答案:

答案 0 :(得分:35)

您是否尝试将整个列格式化为日期列?像这样:

Range rg = (Excel.Range)worksheetobject.Cells[1,1];
rg.EntireColumn.NumberFormat = "MM/DD/YYYY";

你可以尝试的另一件事是在将文本加载到Excel单元格之前在字符串表达式之前放置一个勾号(不确定是否重要,但是在直接在单元格中键入文本时它可以正常工作)。

答案 1 :(得分:10)

尝试使用

DateTime.ToOADate()

把它作为双胞胎放在牢房里。在Mac系统上可能存在Excel问题(它使用不同的日期时间 - &gt;双转换),但在大多数情况下它应该可以正常工作。

希望这有帮助。

答案 2 :(得分:2)

我知道这个问题很老但是通过VSTO填充日期细胞和日期有几个问题。

  

我发现Formula不适用于yyyy-mmm-dd格式的日期 - 即使单元格是DATE FORMAT!您必须将日期转换为dd / mm / yyyy格式才能在公式中使用。

例如我从SQL Analysis Server返回的日期,我不得不翻转它们然后格式化它们:

using (var dateRn = xlApp.Range["A1"].WithComCleanup())
{
    dateRn.Resource.Value2 = Convert.ToDateTime(dateRn.Resource.Value2).ToString("dd-MMM-yyyy");
}


using (var rn = xlApp.Range["A1:A10"].WithComCleanup())
{
    rn.Resource.Select();
    rn.Resource.NumberFormat =  "d-mmm-yyyy;@";
}

否则公式使用日期不起作用 - 单元格C4中的公式与C3相同:

enter image description here

答案 3 :(得分:2)

这对我有用:

sheet.Cells[currentRow, ++currentColumn] = "'" + theDate.ToString("MM/dd/yy");

请注意在日期之前添加的刻度线。

答案 4 :(得分:1)

旧问题但仍然相关。我生成了一个字典,为每个区域获取适当的日期时间格式,这是我生成的助手类:

https://github.com/anakic/ExcelDateTimeFormatHelper/blob/master/FormatHelper.cs

FWIW这就是我的方式:

  1. 打开excel,手动将日期时间输入到工作簿的第一个单元格中
  2. 打开控制面板中的区域对话框
  3. 使用Spy找出区域组合框和应用按钮的HWND,这样我就可以使用SetForegroundWindow和SendKey来更改区域(找不到如何通过Windows API更改区域)
  4. 遍历所有区域,并为每个区域向Excel询问包含日期的单元格的NumberFormat,将此数据保存到文件中

答案 5 :(得分:1)

要通过代码格式化Excel单元格中的日期,请尝试以下操作:

Excel.Range rg = (Excel.Range)xlWorkSheet.Cells[numberRow, numberColumn];

rg.NumberFormat = CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern;

此后,您可以将DateTime值设置为特定的单元格

xlWorkSheet.Cells[numberRow, numberColumn] = myDate;

如果要设置整个列,请尝试以下操作:     Excel.Range rg =(Excel.Range)xlWorkSheet.Cells [numberRow,numberColumn];

rg.EntireColumn.NumberFormat = 
    CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern;

答案 6 :(得分:0)

这对我有用:

hoja_trabajo.Cells[i + 2, j + 1] = fecha.ToString("dd-MMM-yyyy").Replace(".", "");

答案 7 :(得分:0)

希望获得帮助

private bool isDate(Range cell)
    {
        if (cell.NumberFormat.ToString().Contains("/yy"))
        {
            return true;
        }
        return false;
    }

isDate(worksheet.Cells[irow, icol])

答案 8 :(得分:0)

尝试此解决方案,在我的软件中效果很好:

if (obj != null)
{
    if (obj is DateTime)
    {
        if (DateTime.MinValue == ((DateTime)obj))
        {

            xlWorkSheet.Cells[x,y] = String.Empty;

        }
        else
        {

            dynamic opp = ((DateTime)obj);
            xlWorkSheet.Cells[x,y] = (DateTime)opp;

        }
    }
}

答案 9 :(得分:0)

在@Assaf答案上稍作扩展,要正确应用格式设置,我还必须在格式化生效之前通过DateTime函数转换.ToOADate()。您可以逐个单元地进行此操作:

xlWorkSheet.Cells[Row, Col].NumberFormat = "<Required Format>"; // e.g. dd-MMM-yyyy
xlWorkSheet.Cells[Row, Col] = DateTimeObject.ToOADate();

或者您可以将格式应用于整个列:

xlWorkSheet.Cells[Row, Col].EntireColumn.NumberFormat = "<Required Format>"; // e.g. dd-MMM-yyyy
xlWorkSheet.Cells[Row, Col] = DateTimeObject.ToOADate();

答案 10 :(得分:0)

这是一个旧线程。到了这个时候,人们要么使用 OpenXML。 OpenXML 要好得多。好吧,很多像我这样的人都被困住了,因为最初的开发人员使用互操作。

我有几个小时同样的挣扎。我已经尝试了这里的所有内容和其他用法。它仍然给了我数字表示。

然后我发现我设置了样式。 style 属性毁了一切。我刚刚添加了 NumberFormat 属性

这就是我所做的。它有效

                //set the font style and size
                Excel.Style styleDate = MyBook.Styles.Add("StyleDate");
                styleDate.NumberFormat = "mm/dd/yyyy";//remember to include this when setting style property
                styleDate.Font.Size = 10;
                styleDate.Font.Name = "Arial"

                //the function will return datetime value from database or whatever
                DateTime DtVal= GetdatetimeVal(); 

                xlWorkSheet.Cells[Row, Col].Style = styleDate
                xlWorkSheet.Cells[Row, Col] = DtVal;