Остановить автоформат даты при экспорте из DataGrid в Excel в C # - PullRequest
1 голос
/ 11 декабря 2010

В настоящее время я форматирую дату для определенного файла Excel. Экспорт из DataSet / DataGrid.
Дата отформатирована так:

DateTime date = Convert.ToDateTime(entry.Date);
string formatdate = String.Format("{0:yyyy/MM/dd}", date);

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

public static void ExportDStoExcel(DataSet ds, string filename)
    {
        HttpResponse response = HttpContext.Current.Response;
        response.Clear();
        response.Charset = "";

        response.ContentType = "application/vnd.ms-excel";
        response.AddHeader("Content-Disposition", "attachment;filename=\"" + filename + "\"");

        using (StringWriter sw = new StringWriter())
        {
            using (HtmlTextWriter htw = new HtmlTextWriter(sw))
            {
                DataGrid dg = new DataGrid();
                dg.DataSource = ds.Tables[0];
                dg.DataBind();
                dg.RenderControl(htw);
                response.Write(sw.ToString());
                response.End();
            }
        }

    }

Моя единственная проблема - это когда я экспортирую это в Excel, Excel автоматически форматирует даты следующим образом: MM / DD / YYYY вместо YYYY / MM / DD.

Я понимаю, что этого можно достичь вручную, открыв в Excel, но экспорт встраивается в автоматизированную систему и требует жесткого кодирования.

Есть ли способ обойти автоформатирование DateTime в Excel?

Ответы [ 3 ]

4 голосов
/ 03 апреля 2012

У меня была та же проблема, и я решил ее, добавив неразрывный пробел (& nbsp) перед текстом. Остановил Excel из автоформатирования. Не самое чистое решение, но оно помогло мне ...

1 голос
/ 03 ноября 2016

Вы можете стилизовать ячейки Excel с помощью mso-number-format

mso-number-format:"\\@"

\@ заставит Excel обрабатывать все данные только в текстовом формате. Так что автоформат не произойдет.

Пожалуйста, обновите ваш код следующим образом:

response.ContentType = "application/vnd.ms-excel";
response.AddHeader("Content-Disposition", "attachment;filename=\"" + filename + "\"");
response.Write("<html xmlns:x=\"urn:schemas-microsoft-com:office:excel\">");
response.Write("<head><style> td {mso-number-format:\\@;} </style></head><body>");

using (StringWriter sw = new StringWriter())
{
    using (HtmlTextWriter htw = new HtmlTextWriter(sw))
    {
        DataGrid dg = new DataGrid();
        dg.DataSource = ds.Tables[0];
        dg.DataBind();
        dg.RenderControl(htw);
        response.Write(sw.ToString());

        response.Write("</body></html>");
        response.End();
    }
}   

OR

Вы также можете попробовать указать конкретный формат даты. См .: http://cosicimiento.blogspot.in/2008/11/styling-excel-cells-with-mso-number.html

mso-number-format:"yyyy\/mm\/dd"

1 голос
/ 11 декабря 2010

Прямо сейчас вы просто выводите таблицу HTML, которую Excel интерпретирует так, как ей нравится. Вы должны были бы опуститься до уровня Excel, чтобы иметь возможность указывать свойства столбца (установите тип Text вместо General). Это означает, что вам нужно создать настоящий файл xls (для этого есть различные библиотеки). Или (если допустимо ограничение Office 2010) с форматом Open XML , который можно писать с помощью обычного API .NET.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...