首页 新闻 会员 周边

gridview汇出问题

0
悬赏园豆:50 [已解决问题] 解决于 2012-03-26 09:46

在网上找的代码,现在我的gridview汇出成excel能汇出,但是点汇出直接就跳出excel,也没有选择保存在哪,求语句实现保存本地

代码如下:

 private void toExcel(System.Web.UI.WebControls.GridView gv)
        {
            if (gv.Rows.Count == 0)
            {
                return;
            }
            Excel.Application exc = new Excel.ApplicationClass();
            if (exc == null)
            {
                throw new Exception("Excel无法启动");
            }

            System.Windows.Forms.Application.DoEvents();//'转让控制权,没有这一句的话提示窗口不能正常显示
            Excel.Workbooks workbooks = exc.Workbooks;
            Excel._Workbook workbook = workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);
            Excel.Sheets sheets = exc.Sheets;
            Excel._Worksheet worksheet = (Excel._Worksheet)sheets[1];
            if (worksheet == null)
            {
                throw new Exception("Excel启动错误");
            }
            //填充表头          
            Excel.Range range;
            int j = 1;
            for (int i = 0; i < gv.Columns.Count; i++)
            {
                if (gv.Columns[i].Visible == true)
                {
                    worksheet.Cells[1, j] = gv.Columns[i].HeaderText;
                    range = (Excel.Range)worksheet.Cells[1, j];
                    range.Borders.LineStyle = 1.5;                                  
                    range.EntireColumn.AutoFit();                                                                          range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;                 
                    range.Font.Bold = true;                                                 
                    range.RowHeight = 25;                      

                    exc.ActiveCell.Font.Size = 12;
                    exc.ActiveCell.Font.Bold = true;
                    exc.ActiveCell.EntireColumn.AutoFit();
                    j++;
                }
            }
            for (int r = 0; r < gv.Rows.Count; r++)
            {
                int jj = 1;
                for (int i = 0; i < gv.Columns.Count; i++)
                {
                    if (i + 1 != gv.Columns.Count + 1 && gv.Columns[i].Visible == true)
                        if (gv.Rows[r].Cells[i].Text != "&nbsp;")
                        {
                            worksheet.Cells[r + 2, jj] = gv.Rows[r].Cells[i].Text.ToString();
                            jj++;
                        }
                        else
                        {
                            worksheet.Cells[r + 2, jj] = "";
                            jj++;
                        }
                }
            }
            range = worksheet.get_Range(worksheet.Cells[2, 1], worksheet.Cells[gv.Rows.Count + 2, gv.Columns.Count]);
            range.EntireColumn.AutoFit();
            range.HorizontalAlignment = Excel.XlHAlign.xlHAlignCenter;
            range.RowHeight = 20;
            range.Font.Size = 11;
            exc.Visible = true;
            exc.DisplayAlerts = false;
        }

暗夜的萤火虫的主页 暗夜的萤火虫 | 初学一级 | 园豆:8
提问于:2012-03-23 15:47
< >
分享
最佳答案
1

放在updatepanel里直接输出html代码有问题的,你需要继承实现

public override void VerifyRenderingInServerForm(Control control)
{
//if (!control.GetType().Name.Equals("GridView"))
//{
// base.VerifyRenderingInServerForm(control);
//}
}

导出按钮也使用传统提交的方式

<Triggers>
<asp:PostBackTrigger ControlID="ButtonExport" />
</Triggers>

收获园豆:10
月漩涡 | 菜鸟二级 |园豆:328 | 2012-03-25 23:47
其他回答(2)
0

是 cs 還是bs

收获园豆:20
無限遐想 | 园豆:3740 (老鸟四级) | 2012-03-23 16:08

bs

支持(0) 反对(0) 暗夜的萤火虫 | 园豆:8 (初学一级) | 2012-03-23 18:34

@暗夜的萤火虫: 先 保存一個文件

然後,執行

    string fullPath = WriteExcel(ds, xlsMapDictionary);
                    string fileName = this.Title + "_" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".xls";
                    Response.ClearHeaders();
                    Response.Clear();
                    Response.Expires = 0;
                    Response.Buffer = true;
                    Response.AddHeader("Accept-Language", currentCulture);
                    string tmp = "attachment;filename=" + System.Web.HttpUtility.UrlEncode(System.Text.Encoding.UTF8.GetBytes(fileName));
                    Response.AddHeader("content-disposition", tmp);
                    Response.ContentType = "Application/octet-stream";
                    byte[] theData = System.IO.File.ReadAllBytes(fullPath);
                    //Response.BinaryWrite(File.ReadAllBytes(fullPath));
                    Response.BinaryWrite(theData);
                    Response.Flush();
                    Response.Close();
                    File.Delete(fullPath);

就會出現 文件了。

支持(0) 反对(0) 無限遐想 | 园豆:3740 (老鸟四级) | 2012-03-23 19:56

@無限遐想: 这段代码是在我那段代码后执行么,还是删除我那个,在网上找到过这种类似的,但是没有反应,后来好像说是因为前台有updatepanel的原因,这个有关系么

支持(0) 反对(0) 暗夜的萤火虫 | 园豆:8 (初学一级) | 2012-03-23 21:27
0

这段代码好像只是 做了 在服务器上生成了一个Excel文件,并且好像也没有执行 workbook.save 之类的保存函数!
根据你的代码看应该你写的程序是Web版的。
因为
一、你的传入参数是 System.Web.UI.WebControls.GridView 这个命名空间应该是 Web版下的
二、在Web下叫 GridView  而在 Windows 下叫 DataGridview 
但是 System.Windows.Forms.Application.DoEvents();  这句感觉没有什么用! 
还有你说的“跳出excel ”,一开始没太明白你说的意思但是看到这句代码“exc.Visible = true;” 这句是把这个Excel文件显示出来。  如果不在服务器端(如果你把你的网页做一个网站),在其他的机器(也就是客户端)访问的时候,你就会看到,在客户端是不会有Excel弹出显示的,而在服务器端是有显示的),所以应该实际上这里 设置的应该是 false 
exc.DisplayAlerts = false; 这条的意思是 不显示警告信息。

另外 你提到的保存代码 网上应该有很多 

收获园豆:20
二十二号同学 | 园豆:790 (小虾三级) | 2012-03-23 16:26

额,确实是新手,这段代码是在网上抄下来的,可以直接用就用了

网上确实有很多汇出gridview的代码,可以直接保存,但是我在前台有放了一个updatepanel用来刷新不闪界面,这时点汇出按钮没有反应,而这段代码可以汇出就放这个上去了,求解可用的代码,还有gridview有几页时也只能汇出一页,我是又放了一个隐藏的gridview不翻页,汇出这个来解决的,还有其他的解决办法么

谢谢你啦

支持(0) 反对(0) 暗夜的萤火虫 | 园豆:8 (初学一级) | 2012-03-23 18:45

@暗夜的萤火虫: 
建议你这样 你在导出时 再查询一次数据。再把dataTable 做为参数传入到导出函数中
1.用1楼的那个段代码就可以输出文件了,
1)先用你自己的方法(再去搜索一些,你给出的这个不太实用)生成一个Excel文件,然后再用1楼的方法输出文件。
2.和1楼的一样,把 AnsycTrigger 换为 普通 的 PostBackTrigger  ,因为 放在updatepannel 中不允许输出的Response.Write 这样的 函数!
3.注意生成的文件的路径,还有导出后最好能把生成的文件删除掉。
4.注意使用时dcom的配置
5.还有一点 比较头疼的是 用这种方法,会有一个问题,就是如果回收的不好的话(可以以“asp.net excel 导出 Excel进程",这样的关键字,在百度或者谷歌中搜索),就会在服务端有残留的Excel进程。唉!!! 

支持(0) 反对(0) 二十二号同学 | 园豆:790 (小虾三级) | 2012-03-26 14:52
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册