2015-12-07 5 views
3

У меня есть кнопка на моей странице, которая при нажатии экспортирует данные из gridview в excel.Определить формат даты и поля даты даты в экспорте EPPlus

protected void btExport_Click(object sender, EventArgs e) 
{ 
    Response.Clear(); 
    Response.Charset = ""; 
    Response.ContentEncoding = System.Text.Encoding.UTF8; 
    Response.Cache.SetCacheability(HttpCacheability.NoCache); 
    Response.ContentType = "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"; 
    Response.AddHeader("content-disposition", "attachment;filename=Output.xlsx"); 

    DataTable dt= gvOutput.DataSource as DataTable; 

    ExcelPackage pck = new ExcelPackage(); 
    using(pck) 
    { 
     ExcelWorksheet wsDt = pck.Workbook.Worksheets.Add("Sheet1"); 
     wsDt.Cells["A1"].LoadFromDataTable(dt, true, TableStyles.None); 
     wsDt.Cells[wsDt.Dimension.Address].AutoFitColumns(); 

     Response.BinaryWrite(pck.GetAsByteArray()); 

    } 

    Response.Flush(); 
    Response.End(); 
} 

Это прекрасно работает с использованием вышеуказанного кода, однако поля даты форматируются как целые числа. Я понимаю, что определенные ячейки могут быть вынуждены иметь определенный формат, но моя проблема заключается в том, что столбцы даты будут меняться, поскольку набор данных для gridview является динамическим.

Мне нужен способ идентифицировать на лету тот столбец - дату и заставить формат этого столбца быть временем даты.

Я предполагаю, что это будет включать в себя утверждение IF, как это, но я понятия не имею, что положить в него или куда его поместить!

if (dt.Columns[x].DataType == typeof(DateTime)) 
{ 
    //do something 
} 

Любые идеи/помощь с благодарностью.

ответ

8

Прокрутите столбцы DataTable и определите, какие из них являются значениями DateTime. Если вы его найдете, установите формат для столбца, как показано ниже. Я не тестировал код, но это должна быть общая логика.

... 
wsDt.Cells["A1"].LoadFromDataTable(dt, true, TableStyles.None); 
int colNumber = 1; 

foreach (DataColumn col in dt.Columns) 
{   
    if (col.DataType == typeof(DateTime)) 
    { 
     wsDt.Column(colNumber++).Style.Numberformat.Format = "MM/dd/yyyy hh:mm:ss AM/PM"; 
    }   
} 

wsDt.Cells[wsDt.Dimension.Address].AutoFitColumns(); 
Response.BinaryWrite(pck.GetAsByteArray()); 
+0

@SimonTindall Добро пожаловать! –

+0

Пожалуйста, добавьте пол колонку для полного заполнения формата –

2

Небольшая модификация вышеуказанного ответа. Почти правильно. Я исправил его с помощью кода ниже.

wsDt.Cells["A1"].LoadFromDataTable(dt, true, TableStyles.None); 

int colNumber = 0; 
colNumber++; 
foreach (DataColumn col in dt.Columns) 
{ 

    if (col.DataType == typeof(DateTime)) 
    { 
     wsDt.Column(colNumber).Style.Numberformat.Format = "mm/dd/yyyy hh:mm:ss AM/PM" 
    }   
} 

wsDt.Cells[wsDt.Dimension.Address].AutoFitColumns(); 
Response.BinaryWrite(pck.GetAsByteArray()); 
2

Поправьте меня, если я ошибаюсь, но я считаю, что @ ответы @Rick S в desiguy и являются не совсем правильными.

В ответ @ desiguy в, заявление colNumber++ находится вне foreach петли на DataTable столбцов.

Следовательно, поскольку приращение индекса выполняется вне цикла, цикл всегда будет работать на colNumber=1.

Относительно решения @Rick S; Если я не ошибаюсь, в EPPlus, индексы столбцов начинается с 1, а не 0, а значит, утверждение:

wsDt.Column(colNumber++).Style.Numberformat.Format = "mm/dd/yyyy hh:mm:ss AM/PM" 

должно быть следующим:

wsDt.Column(++colNumber).Style.Numberformat.Format = "MM/dd/yyyy hh:mm:ss AM/PM" 

пока есть два различия:

  1. colNumber++ было изменено на ++colNumber. В этом случае столбец будет начинаться с 1, а не 0, так что вы не получите сообщение об ошибке

  2. mm/dd/yyyy было изменено на MM/dd/yyyy, поскольку нижняя часть корпуса mm представляет минуты, а не месяцев, следовательно, MM является правильный синтаксис для представления месяца

Еще более простым решением только установка int colNumber = 0; к int colNumber = 1; и вы получите тот же результат.

1

Полностью исправлен (и тестировалось) Код:

 int colNumber = 0; 

     foreach (DataColumn col in DataToExport.Columns) 
     { 
      colNumber++; 
      if (col.DataType == typeof(DateTime)) 
      { 
       wsDt.Column(colNumber).Style.Numberformat.Format = "MM/dd/yyyy hh:mm:ss AM/PM"; 
      } 
     } 
+0

Лучше объясните, что делает код – Maddy

+0

Этот код будет перебирать столбцы DataTable, и для каждого DataType, который является DateTime, он будет форматировать столбцы в полученной таблице, поэтому даты отображаются в выбранном формате (например, «01/05/2005 12:00:00 AM») вместо числа. – user1810388

Смежные вопросы