【问题标题】:Strategy - Gridview to Excel export full records策略 - Gridview 到 Excel 导出完整记录
【发布时间】:2013-01-07 20:41:33
【问题描述】:

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

我有一个网格视图,它显示来自搜索的五个字段的记录。用户可以在复选框中选中任意数量的记录。单击按钮后,我可以仅将检查的记录成功导出到 Excel。导出为 HTML。我在这里使用了 Matt Berseth 的技术:http://mattberseth.com/blog/2007/04/export_gridview_to_excel_1.html

我添加了一个检查记录是否由用户检查,这工作正常。

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

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

我已尝试检索网格视图中的所有字段,并将除五个所需字段之外的所有字段设置为不可见。然后在导出按钮单击事件中,将字段设置为可见并重新绑定。运气不好。

感谢您的帮助。

【问题讨论】:

  • 您导出的数据现在是什么样子的,您是从逗号分隔列表中构建 HTML 吗?请更具体..如果您只能获取选中的记录..那么您应该能够成功获取所选记录的整行..显示您当前用于获取选中记录的代码..跨度>
  • 我在这里使用了 Matt Berseth 的技术:mattberseth.com/blog/2007/04/export_gridview_to_excel_1.html

标签: c# asp.net excel gridview export


【解决方案1】:

听起来您应该遍历行以查看已检查的行。

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/

-- 编辑

阅读您的 cmets 后,也许这会有所帮助。

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——我使用自己的类来缩短代码。

【讨论】:

  • 谢谢,但这几乎就是我用来测试并将检查记录添加到数据表的内容。我无法确定如何获取记录中的其余字段。即从记录中的 5 个字段到完整的 22 个字段。用户希望在导出时看到所有内容。
  • 如果 cb.Checked 使用相同类型的逻辑,然后在该 foreach 逻辑中添加您需要执行的其余操作,然后在其他 21 个字段的末尾中断
  • 我需要对数据库进行另一个查询以获取其余字段吗?对于每条记录?或者,如果我从头开始查询所有字段(例如:select * from...),是否所有这些值都可用,无论它们是否设置为显示?比如说,我查询所有内容,但只显示 5 个字段,其他 17 个字段值是否可用而无需重新查询?这就是我遇到麻烦的地方。其他值似乎不存在,但也许我试图错误地访问它们。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
相关资源
最近更新 更多