我的页面上有一个按钮,当点击时将数据从gridview导出到excel.
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 }
非常感谢任何想法/帮助.
循环遍历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"; } colNumber++; } wsDt.Cells[wsDt.Dimension.Address].AutoFitColumns(); Response.BinaryWrite(pck.GetAsByteArray());