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

作者:袖梨 2022-06-25

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             

相关文章

精彩推荐