我正在尝试将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时它会导致问题
答案 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++;
}
}