策略 - Gridview到Excel导出完整记录

时间:2013-01-07 20:41:33

标签: c# asp.net excel gridview export

我知道有很多关于从gridview导出到excel的详细说明的问题,但我找不到我的特殊情况。

我有一个gridview,显示搜索中包含五个字段的记录。用户可以在复选框中签入任意数量的记录。单击按钮,我可以成功将已检查的记录导出到Excel。导出为HTML。我在这里使用Matt Berseth的技术:http://mattberseth.com/blog/2007/04/export_gridview_to_excel_1.html

我添加了一个检查记录是否被用户检查的方法,这样可以正常工作。

但我要求对于导出的已检查记录,用户希望查看整个记录(即所选记录中的所有字段)。

实现这一目标的好策略是什么?

我已经尝试检索gridview中的所有字段,并将除了五个所需字段之外的所有字段都设置为不可见。然后在导出按钮单击事件中,将字段设置为可见并重新绑定。那里没有运气。

感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

听起来你应该循环遍历行以查看哪些已检查。

foreach (GridViewRow row in gridView.Rows) 
{
    if(row.RowType == DataControlRowType.DataRow)
    {
      CheckBox cb = row.FindControl("CheckBoxID") as CheckBox;

      if(cb != null && cb.Checked) 
      {
        // Logic here.
      }
}

从那里,您可以使用几种不同的机制导出到Excel,具体取决于您的需求。我过去曾经使用过的,如果你只需要xls文件是NPOI - 它是开源的,并为它提供了一个不错的框架。这是他们网站的链接:

http://npoi.codeplex.com/

- 编辑

阅读完您的评论后,也许这会有所帮助。

ASPX代码:

    <asp:GridView ID="gridView" runat="server" AutoGenerateColumns="false">
        <Columns>
            <asp:TemplateField HeaderText="Checkbox Column">
                <ItemTemplate>
                    <asp:CheckBox ID="CheckBoxID" runat="server" />
                </ItemTemplate>
            </asp:TemplateField> 
            <asp:TemplateField HeaderText="Visible Column">
                <ItemTemplate>
                    <asp:Label ID="lblVisibleColumn"  runat="server" Text='<%# Eval("VisibleColumn")%>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField> 
            <asp:TemplateField HeaderText="Hidden Column" Visible="false">
                <ItemTemplate>
                    <asp:Label ID="lblHiddenColumn"  runat="server" Text='<%# Eval("HiddenColumn")%>'></asp:Label>
                </ItemTemplate>
            </asp:TemplateField> 
        </Columns>
    </asp:GridView>

    <asp:Button ID="btnExport" runat="server" Text="Export" OnClick="btnExport_Click" />

后端代码:

        public class MyDataColumn
        {
            public string visibleColumn { get; set; }
            public string hiddenColumn { get; set; }
        }

        protected void Page_Load(object sender, EventArgs e)
        {
            if (!IsPostBack)
            {
                DataTable dataTable = new DataTable();
                List<MyDataColumn> dataColumns = new List<MyDataColumn>();

                for (int i = 0; i < 10; i++)
                {
                    dataColumns.Add(new MyDataColumn()
                    {
                        visibleColumn = string.Format("Visible Column {0}", i),
                        hiddenColumn = string.Format("Hidden Column {0}", i)
                    });
                }

                gridView.DataSource = dataColumns;
                gridView.DataBind();
            }
        }

        protected void btnExport_Click(object sender, EventArgs e)
        {
            List<MyDataColumn> dataColumnsToExport = new List<MyDataColumn>();

            foreach (GridViewRow row in gridView.Rows) 
            {
                if (row.RowType == DataControlRowType.DataRow)
                {
                    CheckBox cb = row.FindControl("CheckBoxID") as CheckBox;

                    if (cb != null && cb.Checked)
                    {
                        Label lblVisibleColumn = row.FindControl("lblVisibleColumn") as Label;
                        Label lblHiddenColumn = row.FindControl("lblHiddenColumn") as Label;

                        dataColumnsToExport.Add(new MyDataColumn()
                        {
                            visibleColumn = lblVisibleColumn.Text,
                            hiddenColumn = lblHiddenColumn.Text
                        });
                    }
                }
            }

            GridView gridViewToExport = new GridView();
            gridViewToExport.DataSource = dataColumnsToExport;
            gridViewToExport.DataBind();

            //Do Something With gridViewToExport
            //GridViewExportUtil.Export("GridView.xls", gridViewToExport);
        }

如果需要,这应该很容易转换为DataTable - 我使用自己的类来缩短代码。