将GridView导出到Excel会导致将空白列插入到GridView的中间

时间:2011-09-23 20:50:08

标签: c# asp.net excel

我正在尝试将gridview中的元素导出到Excel电子表格中。该网格根据条件隐藏了几列,这里有一些代码

在按钮的def中,这是我有出口问题的部分

    worksheet = workbook.Worksheets["Sheet1"];
    //string wname = tab.Text.Replace(" ", "_");
    //worksheet.Name = wname;
    range = worksheet.Cells["A1"];

    for (int i = 0; i < fr_chart_grid.Columns.Count; i++)//count = 7
    {
        if (fr_chart_grid.Columns[i].Visible == true)
            dtData.Columns.Add(fr_chart_grid.HeaderRow.Cells[i].Text);
    }


    //  add each of the data rows to the table
    foreach (GridViewRow row in fr_chart_grid.Rows)
    {
        DataRow drData;
        drData = dtData.NewRow();
        for (int i = 0; i < row.Cells.Count; i++)
        {
            if (fr_chart_grid.Columns[i].Visible == true)
                drData[i] = row.Cells[i].Text;
        }
        dtData.Rows.Add(drData);
    }

    range.CopyFromDataTable(dtData, SpreadsheetGear.Data.SetDataFlags.None);

以下是我的网格定义方式

<asp:GridView ID="fr_chart_grid" runat="server" AutoGenerateColumns="False">
  <Columns>
     <asp:BoundField DataField="Dateval" HeaderText="Date" DataFormatString="{0:d}" HtmlEncode="false" />
     <asp:BoundField DataField="Col1" HeaderText="Data" DataFormatString="{0:f3}" />
     <asp:BoundField DataField="Col2" HeaderText=""  DataFormatString="{0:f3}"/>
     <asp:BoundField DataField="Col3" HeaderText=""  DataFormatString="{0:f3}"/>
     <asp:BoundField DataField="Col4" HeaderText=""  DataFormatString="{0:f3}"/>
     <asp:BoundField DataField="Col5" HeaderText=""  DataFormatString="{0:f3}"/>
     <asp:BoundField DataField="Col6" HeaderText=""  DataFormatString="{0:f3}"/>
   </Columns>
</asp:GridView>

我的问题是,当我导出数据字段时,我有空白列,有时假设在col 3中的wuts进入col 4,col 3为空。 othertimes我有5行,它告诉我它找不到第5行...这是令人沮丧的....有没有办法,我可以摆脱空白列?它是随机的,当我运行网站时它没有显示,但是当我导出到excel时它会导致问题

1 个答案:

答案 0 :(得分:0)

看起来你至少有一个问题...你在新行中为一个单元格设置数据,你在两行中编制索引.Cells和drData - 当某些列为时,它们不同步不可见。

这一行很麻烦:

drData[i] = row.Cells[i].Text; 
由于不可见的列,

drData可能比i少。您将覆盖用于其他列的数据或获取异常。您需要确保使用可见列的索引索引drData。

这样的事情应该有效:

int j = 0;
for (int i = 0; i < row.Cells.Count; i++)
{
    if (fr_chart_grid.Columns[i].Visible == true)
    {
        drData[j] = row.Cells[i].Text;
        j++;
    }
}