格式化GridView的BoundField,Excel不会将文本转换为date

我正在使用C#以编程方式使用GridView和BoundFields生成一个Excel文件。 现在它不断将某些值转换为date,而不是将它们保持为纯文本。

我希望他们留在从数据库返回,没有从Excel转换。 我已经探索了几个选项,但我似乎无法绕过这个转换。

这是直接到一个文件。

问题的BoundField是“ReportNumber”。 感谢您提供任何帮助。

代码片段:

[HttpGet] public ActionResult AFDOJClosed2Excel(byte[] Data, string Reporting_Year) { try { DataTable dt = GetAFDOJClosed(Reporting_Year);//your datatable DataView dv = dt.DefaultView; dv.Sort = "Case_Number ASC"; DataTable sortedDT = dv.ToTable(); dt = sortedDT; GridView excel = new GridView(); excel.DataSource = dt; excel.AutoGenerateColumns = false; //Explicitly Create bound fields BoundField CaseNumber = new BoundField(); CaseNumber.HeaderText = "Case Number"; CaseNumber.DataField = "Case_Number"; excel.Columns.Add(CaseNumber); BoundField Docket = new BoundField(); Docket.HeaderText = "Docket"; Docket.DataField = "Docket"; excel.Columns.Add(Docket); BoundField AgencyName = new BoundField(); AgencyName.HeaderText = "Agency Name"; AgencyName.DataField = "Agency_Name"; excel.Columns.Add(AgencyName); BoundField ReportNumber = new BoundField(); ReportNumber.HeaderText = "Report Number"; ReportNumber.DataField = "Report_Number"; excel.Columns.Add(ReportNumber); BoundField ClosedDate = new BoundField(); ClosedDate.HeaderText = "Closed Date"; ClosedDate.DataField = "Closed_Date"; ClosedDate.DataFormatString = "{0:d}"; excel.Columns.Add(ClosedDate); BoundField TotalDisbursed = new BoundField(); TotalDisbursed.HeaderText = "Total Disbursed"; TotalDisbursed.DataField = "Total_Disbursed"; TotalDisbursed.DataFormatString = "{0:C}"; excel.Columns.Add(TotalDisbursed); excel.DataBind(); Response.ClearContent(); Response.Buffer = true; Response.AddHeader("content-disposition", "attachment; filename=AFDOJClosed" + Reporting_Year + ".xls"); Response.ContentType = "application/ms-excel"; Response.Charset = ""; StringWriter sw = new StringWriter(); HtmlTextWriter htw = new HtmlTextWriter(sw); excel.RenderControl(htw); Response.Output.Write(sw.ToString()); Response.Flush(); Response.End(); return null; } catch (Exception ex) { ViewBag.ErrorMessage = ex.Message.ToString(); return View("Error"); } } 

如果没有与之关联的特定数据/格式化元素(例如格式为文本,数字,date/时间等),则Excel根据单元格内容应用自己的格式化规则。

您的代码需要一个GridView ,并将网格数据直接写入响应stream。 就生成的文件而言,date是在“常规”types的单元格中,Excel将应用默认的格式设置规则。

为了控制与单元格相关的数据types,您需要使用一个更明确地与Excel数据交互的库,而不是像上面的代码那样依赖于转换机制。 NuGet中一个相当直接的库是EPPlus ,我们已经使用了上面列出的原因。

要将特定的date格式应用于单元格,可以使用类似下面的内容;

  ws.Cells["A3"].Style.Numberformat.Format = "yyyy-mm-dd";