代码之家  ›  专栏  ›  技术社区  ›  codymanix

Excel数据写入时如何正确设置日期格式

  •  33
  • codymanix  · 技术社区  · 14 年前

    我试过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();
    

    8 回复  |  直到 6 年前
        1
  •  41
  •   dcp    14 年前

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

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

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

        2
  •  13
  •   Assaf    14 年前

    尝试使用

    DateTime.ToOADate()
    

    希望这有帮助。

        3
  •  6
  •   Colin    7 年前

    这对我有用:

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

    请注意日期前添加的记号。

        4
  •  3
  •   daniele3004    6 年前

    要在Excel单元格中按代码日期设置格式,请尝试以下操作:

    Excel.Range rg = (Excel.Range)xlWorkSheet.Cells[numberRow, numberColumn];
    
    rg.NumberFormat = CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern;
    

    xlWorkSheet.Cells[numberRow, numberColumn] = myDate;
    

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

    rg.EntireColumn.NumberFormat = 
        CultureInfo.CurrentCulture.DateTimeFormat.ShortDatePattern;
    
        5
  •  2
  •   Jeremy Thompson    12 年前

    我知道这个问题很老了,但是通过VSTO在Excell单元格中填充日期有几个问题。

    我发现公式对yyyy-mmm-dd格式的日期不起作用-即使单元格是日期格式!您必须将日期转换为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

        6
  •  1
  •   anakic    8 年前

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

    1. 打开excel,在工作簿的第一个单元格中手动输入日期时间
    2. 在“控制面板”中打开“区域”对话框
    3. 使用Spy查找regions组合框和apply按钮的HWND,这样我就可以使用setforegroundindow和SendKey更改区域(无法通过Windows API找到如何更改区域)
    4. 遍历所有区域,并针对每个区域向Excel询问包含日期的单元格的数字格式,将此数据保存到一个文件中
        7
  •  1
  •   stuicidle    5 年前

    稍微扩展一下@Assaf answer,为了正确应用格式,我还必须转换 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();
    
        8
  •  0
  •   Jorge Baldárrago    8 年前

    这对我有用:

    hoja_trabajo.Cells[i + 2, j + 1] = fecha.ToString("dd-MMM-yyyy").Replace(".", "");
    
        9
  •  0
  •   Vo Tran Hai Anh    6 年前

    希望这有帮助

    private bool isDate(Range cell)
        {
            if (cell.NumberFormat.ToString().Contains("/yy"))
            {
                return true;
            }
            return false;
        }
    
    isDate(worksheet.Cells[irow, icol])
    
        10
  •  0
  •   daniele3004    5 年前

    试试这个解决方案,在我的软件中工作得很好:

    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;
    
            }
        }
    }
    
        11
  •  0
  •   user12345    3 年前

    这是一根旧线。此时,人们要么使用OpenXML。OpenXML更好。好吧,像我这样的很多人都被卡住了,因为最初的开发人员使用interop。

    我也挣扎了几个小时。我试过这里的所有东西和其他用法。它仍然给我数字表示。

    后来我发现是我定的风格。时尚地产毁了一切。我刚刚添加了NumberFormatproperty

    我就是这么做的。它起作用了

                    //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;