将数据写入Excel时如何使正确的date格式

Iam使用Office Interop将DataTable导出到Excel文件。 问题是,Excel不能识别date,而是显示数字。 在另一种情况下,我传递一个string,然后将其识别为date。 在这两种情况下,数据都搞砸了。

我试过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不应该显示与我放在一起的一切吗?

你是否尝试格式化整个列作为date列? 像这样的东西:

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

另一件事你可以尝试将单个滴答放在stringexpression式之前,将文本加载到Excel单元格(不知道是否重要,但它直接input文本时单元格)。

尝试使用

 DateTime.ToOADate() 

并把它作为一个单元格的双重。 在Mac系统上,Excel可能会出现问题(它使用不同的date时间 – >双重转换),但是在大多数情况下它应该可以正常工作。

希望这可以帮助。

我知道这个问题是古老的,但通过VSTO填写Excell细胞与date有一些陷阱。

  • 格式化整个列适合我。

  • 甚至没有从Microsoft的这种方法工作: http : //msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.namedrange.numberformat.aspx

我发现公式不能在yyyy-mmm-dd格式的date工作 – 即使单元格是date格式! 您必须将date转换为dd / mm / yyyy格式才能在配方中使用。

例如,我从SQL分析服务器回来的date,我不得不翻转他们,然后格式化他们:

 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;@"; } 

否则,公式的使用date不起作用 – 单元格C4中的公式与C3相同:

在这里输入图像说明

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

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

FWIW这是我如何去做的:

  1. 打开excel,手动inputdate时间到工作簿的第一个单元格
  2. 在控制面板中打开区域对话框
  3. 用间谍找出区域combobox的HWND和应用button,所以我可以使用SetForegroundWindow和SendKey来改变区域(无法find如何通过Windows API改变区域)
  4. 遍历所有区域,并为每个区域询问Excel的包含date的单元格的格式,将这些数据保存到一个文件

这对我工作:

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

这对我工作:

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

请注意date前添加的刻度线标记。