Вопрос:

Excel Interop форматирование ячеек дат

c# sql-server excel

20946 просмотра

2 ответа

20833 Репутация автора

Моя программа создает вывод в Excel.

Некоторые даты, похоже, неправильно истолкованы: введите описание изображения здесь

При открытии файла даты являются смесью, как на скриншоте.
Если я на самом деле поставлю курсор в поле вычисления Excel (в скриншоте) и нажму, введите форматирование ячейки, чтобы вернуться к правильному форматированию.

Я использую Microsoft.Office.Interop.Excelдля перемещения данных из Datatableв Excelшаблон, сохраненный в моем решении.

Перед помещением данных в ячейки я изменяю числовой формат каждого столбца соответственно, используя switch:

for(int i = 1; i < NumColumns + 1; i++) {
    switch(dt.Columns[i-1].DataType.ToString()) {
        case "System.Int32":
            xlWorkSheet.Columns[i].NumberFormat = "#,##0_ ;[Red]-#,##0 ";
            break;
        case "System.String":
            xlWorkSheet.Columns[i].NumberFormat = "@";
            break;
        case "System.DateTime":
            xlWorkSheet.Columns[i].NumberFormat = "[$-809]dd mmmm yyyy;@"; //"dd-mmm-yy";
            break;
        case "System.Date":
            xlWorkSheet.Columns[i].NumberFormat = "[$-809]dd mmmm yyyy;@"; //"dd-mmm-yy";
            break;
        default:
            xlWorkSheet.Columns[i].NumberFormat = "@";
            break;
    }
}

Для перемещения значений из таблицы данных я использую вложенные циклы:

//move header totals into the spreadsheet
for(int i = 1; i < NumColumns + 1; i++) {
    xlWorkSheet.Cells[1, i].value = dt.Columns[i - 1].ColumnName;
}

//move in the data
DataView dv = new DataView(dt);
dv.Sort = "Date ASC";

int rowCount = 2;
string theValue;
try {
    foreach(DataRowView dr in dv) {//(DataRow dr indt.Rows)
        for(int i = 1; i < NumColumns + 1; i++) {
            theValue = dr[i - 1].ToString();
            xlWorkSheet.Cells[rowCount, i].value = theValue;
        }
        rowCount += 1;
    }
} catch(Exception) {
    throw;
}

В хранимой процедуре, когда я заполняю Datatable, я пытался явным образом описать тип, используя DATETIMEследующее:

SELECT 
"Date" = CONVERT(DATE,b.[Date])
    ...

Как я могу сделать свои данные Date настолько явными, чтобы Excel не мог неверно истолковать их и применить все желаемое форматирование?


редактировать

Следующая (непроверенная) попытка во вложенном цикле выглядит следующим образом:

int rowCount = 2;
string theValue;
DateTime dtm;
DateTime d;
try {
    foreach(DataRowView dr in dv) {//(DataRow dr indt.Rows)
        for(int i = 1; i < NumColumns + 1; i++) {
            //theValue = dr[i - 1].ToString();
            //xlWorkSheet.Cells[rowCount, i].value = theValue;
            switch(dr[i - 1].GetType().ToString()) {
                case "System.DateTime":
                    dtm = Convert.ToDateTime(dr[i - 1]);
                    xlWorkSheet.Cells[rowCount, i].value = dtm.ToOADate();
                    break;
                case "System.Date":
                    d = Convert.ToDateTime(dr[i - 1]);
                    xlWorkSheet.Cells[rowCount, i].value = d.ToOADate();
                    break;
                default:
                    theValue = dr[i - 1].ToString();
                    xlWorkSheet.Cells[rowCount, i].value = theValue;
                    break;
            }

        }
        rowCount += 1;
    }
} catch(Exception) {
    throw;
}
Автор: whytheq Источник Размещён: 24.03.2013 07:44

Ответы (2)


5 плюса

21434 Репутация автора

Решение

Проблема здесь в том, что вы записываете все в Excel в виде строки, и Excel сохранит ее как таковую. После редактирования и нажатия клавиши Enter Excel повторно интерпретирует содержимое ячейки и затем может сохранить его по-другому.

Когда вы вызываете ToString()a DateTime, форматирование по умолчанию имеет вид ДД / ММ / ГГ ЧЧ: мм: сс, что в точности соответствует тому, что вы видите в результирующем файле.

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

См. Http://msdn.microsoft.com/en-gb/library/system.datetime.tooadate.aspx

С данными, установленными как a doubleи подходящей форматной строкой, вы должны получить результат, на который надеетесь!

Автор: Charles Mager Размещён: 24.03.2013 09:12

-3 плюса

1 Репутация автора

Просто замените (на строку) на (форматированное значение)

Автор: Mohand GK Размещён: 12.11.2017 01:01
Вопросы из категории :
32x32