Как сделать правильный формат даты при записи данных в Excel - PullRequest
34 голосов
/ 22 июля 2010

Я экспортирую 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 не должен отображать все то же самое, что и я?

Ответы [ 8 ]

35 голосов
/ 22 июля 2010

Вы пытались отформатировать весь столбец как столбец даты? Примерно так:

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

Другая вещь, которую вы могли бы попробовать, это поставить один тик перед строковым выражением перед загрузкой текста в ячейку Excel (не уверен, имеет ли это значение или нет, но это работает при наборе текста непосредственно в ячейку).

10 голосов
/ 22 июля 2010

Попробуйте использовать

DateTime.ToOADate()

И поместите это как двойной в ячейке.Могут быть проблемы с Excel в системах Mac (в нем используется другое время -> двойное преобразование), но в большинстве случаев это должно работать хорошо.

Надеюсь, это поможет.

2 голосов
/ 02 июля 2018

Для форматирования по коду Дата в ячейках 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;
2 голосов
/ 21 апреля 2017

Это сработало для меня:

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

Обратите внимание на отметку, добавленную до даты.

2 голосов
/ 06 декабря 2012

Я знаю, что этот вопрос старый, но заполнение ячеек Excell датами через VSTO имеет несколько ошибок.

Я обнаружил, что формулы не работают с датами с гггг-ммм-формат dd - хотя ячейки были в формате DATE!Вы должны перевести Даты в формат дд / мм / гггг для использования в формулах.

Например, даты, которые я получаю, возвращаются с 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;@";
}

В противном случае использование формулы в Dates не работает - формула в ячейке C4 такая же, как в C3:

enter image description here

1 голос
/ 14 мая 2016

Старый вопрос, но все еще актуален.Я сгенерировал словарь, который получает соответствующий формат даты и времени для каждого региона, вот сгенерированный мной вспомогательный класс:

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

FWIW, вот как я поступил:

  1. открыл Excel, вручную ввел дату и время в первой ячейке рабочей книги
  2. открыл диалог регионов на панели управления
  3. использовал Spy, чтобы узнать HWND's регионовполе со списком и кнопка «Применить», чтобы я мог использовать SetForegroundWindow и SendKey, чтобы изменить регион (не мог найти способ изменить регион через Windows API)
  4. итерировал по всем регионам и для каждого региона запросил в Excel значение NumberFormat дляячейка, которая содержала дату, сохранила эти данные в файл
0 голосов
/ 23 ноября 2018

Надеюсь, что эта помощь

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

isDate(worksheet.Cells[irow, icol])
0 голосов
/ 07 декабря 2016

Это сработало для меня:

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