在网上找的代码,现在我的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 != " ")
{
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;
}
放在updatepanel里直接输出html代码有问题的,你需要继承实现
public override void VerifyRenderingInServerForm(Control control)
{
//if (!control.GetType().Name.Equals("GridView"))
//{
// base.VerifyRenderingInServerForm(control);
//}
}
导出按钮也使用传统提交的方式
<Triggers>
<asp:PostBackTrigger ControlID="ButtonExport" />
</Triggers>
是 cs 還是bs
bs
@暗夜的萤火虫: 先 保存一個文件
然後,執行
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);
就會出現 文件了。
@無限遐想: 这段代码是在我那段代码后执行么,还是删除我那个,在网上找到过这种类似的,但是没有反应,后来好像说是因为前台有updatepanel的原因,这个有关系么
这段代码好像只是 做了 在服务器上生成了一个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; 这条的意思是 不显示警告信息。
另外 你提到的保存代码 网上应该有很多
额,确实是新手,这段代码是在网上抄下来的,可以直接用就用了
网上确实有很多汇出gridview的代码,可以直接保存,但是我在前台有放了一个updatepanel用来刷新不闪界面,这时点汇出按钮没有反应,而这段代码可以汇出就放这个上去了,求解可用的代码,还有gridview有几页时也只能汇出一页,我是又放了一个隐藏的gridview不翻页,汇出这个来解决的,还有其他的解决办法么
谢谢你啦
@暗夜的萤火虫:
建议你这样 你在导出时 再查询一次数据。再把dataTable 做为参数传入到导出函数中
1.用1楼的那个段代码就可以输出文件了,
1)先用你自己的方法(再去搜索一些,你给出的这个不太实用)生成一个Excel文件,然后再用1楼的方法输出文件。
2.和1楼的一样,把 AnsycTrigger 换为 普通 的 PostBackTrigger ,因为 放在updatepannel 中不允许输出的Response.Write 这样的 函数!
3.注意生成的文件的路径,还有导出后最好能把生成的文件删除掉。
4.注意使用时dcom的配置
5.还有一点 比较头疼的是 用这种方法,会有一个问题,就是如果回收的不好的话(可以以“asp.net excel 导出 Excel进程",这样的关键字,在百度或者谷歌中搜索),就会在服务端有残留的Excel进程。唉!!!