我使用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不应该像我把它放在一样显示所有内容吗?
答案 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填充日期细胞和日期有几个问题。
格式化整个专栏 NOT 为我工作。
微软的这种方法甚至没有工作:http://msdn.microsoft.com/en-us/library/microsoft.office.tools.excel.namedrange.numberformat.aspx
我发现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相同:
答案 3 :(得分:2)
这对我有用:
sheet.Cells[currentRow, ++currentColumn] = "'" + theDate.ToString("MM/dd/yy");
请注意在日期之前添加的刻度线。
答案 4 :(得分:1)
旧问题但仍然相关。我生成了一个字典,为每个区域获取适当的日期时间格式,这是我生成的助手类:
https://github.com/anakic/ExcelDateTimeFormatHelper/blob/master/FormatHelper.cs
FWIW这就是我的方式:
答案 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;