asp.net 导出excel与单元格中图片的方法:

asp教程.net 导出excel与单元格中图片的方法:

在asp.net教程中导出excel有两种方法,一种是将导出的文件存放在服务器某个文件夹下面,然后将文件地址输出在浏览器上;一种是将文件直接将文件输出流写给浏览器。在response输出时,t分隔的数据,导出excel时,等价于分列,n等价于换行。
1、将整个html全部输出excel

此法将html中所有的内容,如按钮,表格,图片等全部输出到excel中。

   response.clear();    
   response.buffer=   true;    
   response.appendheader("content-disposition","attachment;filename="+datetime.now.tostring("yyyymmdd")+".xls");          
   response.contentencoding=system.text.encoding.utf8;  
   response.contenttype   =   "application/vnd.ms-excel";  
   this.enableviewstate   =   false;  

这里我们利用了contenttype属性,它默认的属性为text/html,这时将输出为超文本,即我们常见的网页格式到客户端,如果改为ms-excel将将输出excel格式,也就是说以电子表格的格式输出到客户端,这时浏览器将提示你下载保存。contenttype的属性还包括:image/jpeg;text/html;image/gif;vnd.ms-excel/msword 。同理,我们也可以输出(导出)图片、word文档等。下面的方法,也均用了这个属性。

 

2、将datagrid控件中的数据导出excel

上述方法虽然实现了导出的功能,但同时把按钮、分页框等html中的所有输出信息导了进去。而我们一般要导出的是数据,datagrid控件上的数据。

system.web.ui.control ctl=this.datagrid1;
//datagrid1是你在窗体中拖放的控件
httpcontext.current.response.appendheader("content-disposition","attachment;filename=excel.xls");
httpcontext.current.response.charset ="utf-8";    
httpcontext.current.response.contentencoding =system.text.encoding.default;
httpcontext.current.response.contenttype ="application/ms-excel";
ctl.page.enableviewstate =false;   
system.io.stringwriter  tw = new system.io.stringwriter() ;
system.web.ui.htmltextwriter hw = new system.web.ui.htmltextwriter (tw);
ctl.rendercontrol(hw);
httpcontext.current.response.write(tw.tostring());
httpcontext.current.response.end();

如果你的datagrid用了分页,它导出的是当前页的信息,也就是它导出的是datagrid中显示的信息。而不是你select语句的全部信息。

为方便使用,写成方法如下:

public void dgtoexcel(system.web.ui.control ctl)  
  {
   httpcontext.current.response.appendheader("content-disposition","attachment;filename=excel.xls");
   httpcontext.current.response.charset ="utf-8";    
   httpcontext.current.response.contentencoding =system.text.encoding.default;
   httpcontext.current.response.contenttype ="application/ms-excel";
   ctl.page.enableviewstate =false;   
   system.io.stringwriter  tw = new system.io.stringwriter() ;
   system.web.ui.htmltextwriter hw = new system.web.ui.htmltextwriter (tw);
   ctl.rendercontrol(hw);
   httpcontext.current.response.write(tw.tostring());
   httpcontext.current.response.end();
  }
   用法:dgtoexcel(datagrid1);
  

3、将dataset中的数据导出excel

有了上边的思路,就是将在导出的信息,输出(response)客户端,这样就可以导出了。那么把dataset中的数据导出,也就是把dataset中的表中的各行信息,以ms-excel的格式response到http流,这样就ok了。说明:参数ds应为填充有数据表的dataset,文件名是全名,包括后缀名,如excel2006.xls

public  void createexcel(dataset ds,string filename) 
{
 httpresponse resp;
 resp = page.response;
 resp.contentencoding = system.text.encoding.getencoding("gb2312");
 resp.appendheader("content-disposition", "attachment;filename="+filename);   
 string colheaders= "", ls_item="";  
 
 //定义表对象与行对象,同时用dataset对其值进行初始化
 datatable dt=ds.tables[0];
 datarow[] myrow=dt.select();//可以类似dt.select("id>10")之形式达到数据筛选目的
        int i=0;
        int cl=dt.columns.count;
   
 //取得数据表各列标题,各标题之间以t分割,最后一个列标题后加回车符
 for(i=0;i  {
 if(i==(cl-1))//最后一列,加n
 {
 colheaders +=dt.columns[i].caption.tostring() +"n";
 }
 else
 {
 colheaders+=dt.columns[i].caption.tostring()+"t";
 }
      
 }
 resp.write(colheaders);
 //向http输出流中写入取得的数据信息
  
 //逐行处理数据  
 foreach(datarow row in myrow)
 {    
 //当前行数据写入http输出流,并且置空ls_item以便下行数据    
 for(i=0;i  {
 if(i==(cl-1))//最后一列,加n
 {
 ls_item +=row[i].tostring()+"n";
 }
 else
 {
 ls_item+=row[i].tostring()+"t";
 }
 }
 resp.write(ls_item);
 ls_item="";
 }   
 resp.end(); 
 }

一、asp.net中导出execl的方法:

在asp.net中导出excel有两种方法,一种是将导出的文件存放在服务器某个文件夹下面,然后将文件地址输出在浏览器上;一种是将文件直接将文件输出流写给浏览器。在response输出时,t分隔的数据,导出excel时,等价于分列,n等价于换行。
1、将整个html全部输出excel

此法将html中所有的内容,如按钮,表格,图片等全部输出到excel中。
   response.clear();    
   response.buffer=   true;    
   response.appendheader("content-disposition","attachment;filename="+datetime.now.tostring("yyyymmdd")+".xls");          
   response.contentencoding=system.text.encoding.utf8;  
   response.contenttype   =   "application/vnd.ms-excel";  
   this.enableviewstate   =   false;  

这里我们利用了contenttype属性,它默认的属性为text/html,这时将输出为超文本,即我们常见的网页格式到客户端,如果改为ms-excel将将输出excel格式,也就是说以电子表格的格式输出到客户端,这时浏览器将提示你下载保存。contenttype的属性还包括:image/jpeg;text/html;image/gif;vnd.ms-excel/msword 。同理,我们也可以输出(导出)图片、word文档等。下面的方法,也均用了这个属性。

 

2、将datagrid控件中的数据导出excel

上述方法虽然实现了导出的功能,但同时把按钮、分页框等html中的所有输出信息导了进去。而我们一般要导出的是数据,datagrid控件上的数据。
system.web.ui.control ctl=this.datagrid1;
//datagrid1是你在窗体中拖放的控件
httpcontext.current.response.appendheader("content-disposition","attachment;filename=excel.xls");
httpcontext.current.response.charset ="utf-8";    
httpcontext.current.response.contentencoding =system.text.encoding.default;
httpcontext.current.response.contenttype ="application/ms-excel";
ctl.page.enableviewstate =false;   
system.io.stringwriter  tw = new system.io.stringwriter() ;
system.web.ui.htmltextwriter hw = new system.web.ui.htmltextwriter (tw);
ctl.rendercontrol(hw);
httpcontext.current.response.write(tw.tostring());
httpcontext.current.response.end();

如果你的datagrid用了分页,它导出的是当前页的信息,也就是它导出的是datagrid中显示的信息。而不是你select语句的全部信息。

为方便使用,写成方法如下:
public void dgtoexcel(system.web.ui.control ctl)  
  {
   httpcontext.current.response.appendheader("content-disposition","attachment;filename=excel.xls");
   httpcontext.current.response.charset ="utf-8";    
   httpcontext.current.response.contentencoding =system.text.encoding.default;
   httpcontext.current.response.contenttype ="application/ms-excel";
   ctl.page.enableviewstate =false;   
   system.io.stringwriter  tw = new system.io.stringwriter() ;
   system.web.ui.htmltextwriter hw = new system.web.ui.htmltextwriter (tw);
   ctl.rendercontrol(hw);
   httpcontext.current.response.write(tw.tostring());
   httpcontext.current.response.end();
  }
   用法:dgtoexcel(datagrid1);
  
3、将dataset中的数据导出excel

有了上边的思路,就是将在导出的信息,输出(response)客户端,这样就可以导出了。那么把dataset中的数据导出,也就是把dataset中的表中的各行信息,以ms-excel的格式response到http流,这样就ok了。说明:参数ds应为填充有数据表的dataset,文件名是全名,包括后缀名,如excel2006.xls

public  void createexcel(dataset ds,string filename) 
{
 httpresponse resp;
 resp = page.response;
 resp.contentencoding = system.text.encoding.getencoding("gb2312");
 resp.appendheader("content-disposition", "attachment;filename="+filename);   
 string colheaders= "", ls_item="";  
 
 //定义表对象与行对象,同时用dataset对其值进行初始化
 datatable dt=ds.tables[0];
 datarow[] myrow=dt.select();//可以类似dt.select("id>10")之形式达到数据筛选目的
        int i=0;
        int cl=dt.columns.count;
   
 //取得数据表各列标题,各标题之间以t分割,最后一个列标题后加回车符
 for(i=0;i  {
 if(i==(cl-1))//最后一列,加n
 {
 colheaders +=dt.columns[i].caption.tostring() +"n";
 }
 else
 {
 colheaders+=dt.columns[i].caption.tostring()+"t";
 }
      
 }
 resp.write(colheaders);
 //向http输出流中写入取得的数据信息
  
 //逐行处理数据  
 foreach(datarow row in myrow)
 {    
 //当前行数据写入http输出流,并且置空ls_item以便下行数据    
 for(i=0;i  {
 if(i==(cl-1))//最后一列,加n
 {
 ls_item +=row[i].tostring()+"n";
 }
 else
 {
 ls_item+=row[i].tostring()+"t";
 }
 }
 resp.write(ls_item);
 ls_item="";
 }   
 resp.end(); 
 }

对于excel中的很多对象,比如单元格(cell),图形(shape),图表(chart)等等,有时需要将它们保存成一张图片。就像截图一样。
最近做一个excel相关的项目,项目中遇到一个很变态的需求, 需要对excel中的一些对象进行拍图,比如,对一个单元格设置一些颜色之后拍图,或者对一个图表,报表拍成图片。经过比较曲折的经历,终于还是完成了。拿出来分享一下。
要做excel,首先当然是查看excel的com对象模型。地址在这里:
http://msdn.microsoft.com/en-us/library/bb149081(v=office.12).aspx
这里说明一下:
官方的excel2010对象参考没有找到,点进去就是死循环,点来点去就是找不到,哪位神人找到了麻烦回复告知一下。 
excel2003的对象模型,需要下下来安装,比较麻烦,我也是安装了之后才知道的,这里推荐大家就通过上面的网址查看excel2007的模型就可以了。    实际上按照微软的兼容惯例,excel2010和excel2003的差别应该不大(是吗?)。
然后是查看range对象的成员,期待它有没有什么现成的方法就爽了:http://msdn.microsoft.com/en-us/library/bb225606(v=office.12).aspx
查看了一圈,也没发现类似什么 exportimage,saveimage之类的方法。表示沮丧,不过也是情理之中。
绝望之中发现了一个亮点,一个方法名字叫做copypicture。 看了一下方法说明,是要把对象当作图片拷到剪贴板里面。    呵呵,一个比较扭曲的想法诞生了,既然能拷到剪贴板里面,我再从剪贴板里面把图片抠出来不就行了吗。 
好,就这么定了,说干就干。
……
此处省略200字(怎么创建excel的com对象, 怎么取到range对象就不说了,不知道的自己查,也可以回复提问。)
……
拿到range对象之后。调用copypicture方法,需要两个参数。第一个参数是xlpictureappearance枚举,1表示按照屏幕的样子拷贝,2表示按照打印时的样子拷贝。 第二个参数是xlcopypictureformat枚举,2表示拷贝成位图,-4147表示拷贝成矢量图片。
于是乎,我写了大概类似如下的代码。

range cell = excel.activesheet.cells[1,1];
cell.copypicture(1,2);
bitmap image = clipboard.getimage() as bitmap;
if(image != null)
{
//可以在这里为所欲为。
}

由于.net的一些限制,一些旧的程序(比如这里遇到的excel2007)复制到剪贴板的数据可能不可用,需要通过本地api来使用。 我去。。。 msdn上也没见半个字的提醒。
楼主是个比较勤快的人,知道了这个,那还不赶快动手

intptr hwnd = excel.hwnd;
try             

时间: 2024-11-05 12:10:22

asp.net 导出excel与单元格中图片的方法:的相关文章

使用NPOI导出EXCEL,设置单元格为货币格式时无效.

问题描述 使用NPOI导出EXCEL,设置单元格为货币格式时无效. 在使用NPOI导出EXCEL时,设置了单元格格式为货币格式,但是导出来的数据格式还是为通用格式, 求解!!! 格式代码: ICell cell = contentRow.CreateCell(2); //cell.SetCellValue((double)result.PeriodPayoffInterest.Value); cell.SetCellValue(20000); //set date format 设置单元格格式

Excel2010单元格中显示图表方法

  Excel2010单元格中显示图表方法           步骤一.首先,打开Excel表格,然后鼠标左键单击选中需创建迷你图表的单元格,切换到"插入"功能选项卡中,在"迷你图"组中,单击一种迷你图表类型(目前只有3种迷你图:拆线图.柱线图.盈亏图)按钮(此处选择"柱形图"),打开"创建迷你图"对话框.如下图: Excel2010 步骤二.利用"位置范围"右侧的折叠按钮,选中显示迷你图表的单元格,单击&

求助!!如何在Excel的单元格中插入图片

问题描述 求助!在单元格中插入图片,不是直接把图片放进去,这样会破坏Excel的样子.是把图片放入某个单元格,当点击这个单元格就可以把图片放大显示出来.只要能实现效果,用其他方法也行.注意:不是像下图这样直接把图图片放进去谢谢各位了 解决方案

Excel运用公式法删掉单元格中空格符

  具体操作步骤如下: 1.在旁边一列输入公式=SUBSTITUTE(B2," ",""),按回车键 2.选中C2单元格,鼠标放在该单元格右下角,当出现+号时点住往下拉,一直到C20再松开. 3.用该公式可以去掉单元格中的空格字符.接着可以通过复制.选择性粘贴将新列中的结果返回原列中就可以了. 回顾之前的Excel运用查找替换法删掉单元格中空格符的方法

excel怎么在单元格中插入勾字符

方法一 1.先打开你要插入勾的excel表中,如图: 2.然后进入菜单栏的"插入"->"特殊符号" 在这里面有很多符号了,像有"标点符号"."数字符号"."特殊符号" 如图所示. 3.在这里我们点击"符号选择卡"中的"数学符号"在这里面我们会发现自己要的东西了,如下图所示. 4.选中符号之后我们再点击"确定"按钮,这样勾就插入到你选中的单元格

excel合并单元格 c#-关于C#读取excel合并字符串,遇到的问题,希望大神们能帮忙,我真的没办法了

问题描述 关于C#读取excel合并字符串,遇到的问题,希望大神们能帮忙,我真的没办法了 在C#读取excel合并单元格中,我用的是如下的办法,就是遇到合并单元格,往上,先是同一列,然后cell(row-1,col)去向上寻找合并值,如果也是合并值,且有value,那么就寻找到值了,如果没有,一直到一个不是单元格的,那么结束,再通过cell(row,col-1)向左去寻找合并值,方法同上,代码如下 private string GetCellText(int row,int col,Excel.

Asp.net导出Excel续:自定义合并单元格,非Office组件

结合上次写的导出Excel方法,这次上头要求我将列头进行一下合并 以前的效果: 改进后的效果: 在上篇文章中写到了Excel的导出方法,这次为了避免在生产环境中使用Office组件,服务器各种权限配置的麻烦,这次就不使用Office组件来生成Excel了. 上篇文章:Asp.net导出Excel(HTML输出)

asp.net C#取Excel 合并单元格内容

asp教程.net c#取excel 合并单元格内容 读取excel数据,填充dataset // 连接字符串 string xlspath = server.mappath("~/www.111cn.net/somefile.xls"); string connstr = "provider=microsoft.jet.oledb.4.0;" + "extended properties="excel 8.0;hdr=no;imex=1&quo

Excel怎么在单元格中输入0值

  一般情况下,在Excel表格中输入诸如"05"."4.00"之类数字后,只要光标一移出该单元格,格中数字就会自动变成"5"."4",Excel默认的这种做法让人使用非常不便,我们可以通过下面的方法来避免出现这种情况: 先选定要输入诸如"05"."4.00"之类数字的单元格,鼠标右键单击,在弹出的快捷菜单中单击"设置单元格格式", 在接着出现的界面中选"数