【发布时间】:2023-03-11 23:27:01
【问题描述】:
我有一个显示来自数据库的字段的 GridView 和一个将此 GridView 导出到 Excel 电子表格的函数,但唯一没有显示的列是 litChecklistNo。
<asp:GridView runat="server"
<Columns>
<asp:BoundField DataField="VehicleReg" HeaderText="Registration" SortExpression="VehicleReg"></asp:BoundField>
<asp:TemplateField HeaderText="Checklist Number" SortExpression="CheckListNo">
<ItemTemplate>
<asp:Literal ID="litChecklistNo" runat="server"> </asp:Literal>
</ItemTemplate>
</asp:TemplateField>
<asp:BoundField DataField="ChecklistDate" HeaderText="Checklist Date" SortExpression="ChecklistDate" dataformatstring="{0:dd/MM/yyyy}"></asp:BoundField>
<asp:BoundField DataField="MaintenanceNo" HeaderText="Maintenance No" SortExpression="MaintenanceNo"></asp:BoundField>
</Columns>
</asp:GridView>
导出 GridView 的代码:
protected void ToExcel(GridView grid, string Name, string FileName)
{
if (!FileName.Contains(".xls"))
{
FileName = FileName + ".xls";
}
string style = "<style><!--table@page{mso-header-data:\"&C" + Name + " Date/: &D/ Page &P\"; mso-page-orientation:landscape; mso-page-scale:89;} br {mso-data-placement:same-cell;} --></style>";
Response.Buffer = true;
Response.ContentType = "application/vnd.ms-excel";
Response.AddHeader("content-disposition", "attachment; filename=" + FileName + "");
this.EnableViewState = false;
Response.Write("<html xmlns:x=\"urn:schemas-microsoft-com:office:excel\">");
Response.Write("<head>");
Response.Write(style);
Response.Write("<meta http-equiv=\"Content-Type\" content=\"text/html;charset=windows-1252\">");
Response.Write("<!--[if gte mso 9]>");
Response.Write("<xml>");
Response.Write("<x:ExcelWorkbook>");
Response.Write("<x:ExcelWorksheets>");
Response.Write("<x:ExcelWorksheet>");
Response.Write("<x:Name>" + Name + " Table</x:Name>");
Response.Write("<x:WorksheetOptions>");
Response.Write("<x:Panes>");
Response.Write("</x:Panes>");
Response.Write("<x:Print>");
Response.Write("<x:ValidPrinterInfo/>");
Response.Write("<x:Scale>89</x:Scale>");
Response.Write("</x:Print>");
Response.Write("</x:WorksheetOptions>");
Response.Write("</x:ExcelWorksheet>");
Response.Write("</x:ExcelWorksheets>");
Response.Write("</x:ExcelWorkbook>");
Response.Write("</xml>");
Response.Write("<![endif]-->");
Response.Write("</head>");
Response.Write("<body>");
System.IO.StringWriter oStringWriter = new System.IO.StringWriter();
System.Web.UI.HtmlTextWriter oHtmlTextWriter = new System.Web.UI.HtmlTextWriter(oStringWriter);
ClearControls(grid);
grid.RenderBeginTag(oHtmlTextWriter);
grid.HeaderRow.RenderControl(oHtmlTextWriter);
foreach (GridViewRow row in grid.Rows)
{
row.RenderControl(oHtmlTextWriter);
}
grid.FooterRow.RenderControl(oHtmlTextWriter);
grid.RenderEndTag(oHtmlTextWriter);
Response.Write(oStringWriter.ToString());
Response.Write("</body>");
Response.Write("</html>");
Response.End();
}
litChecklistNo 是 GridView 中的一个链接,单击该链接会打开另一个页面,这就是为什么我没有像在 GridView 的其余部分中那样使用 BoundField 但为什么不将它导出到 Spreed 表?跟Literal有关系吗?
【问题讨论】:
-
与其手动构建所有标记,不如使用支持正确生成
.xlsx文件的库,例如EPPlus、NPOI 或Open XML SDK?我在my blog上描述了如何使用EPPlus。 -
@mason 现在我将继续使用此代码。你知道问题可能是什么吗?
标签: c# asp.net excel visual-studio gridview