C# 将数据导出到Execl汇总

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

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

1、将整个html全部输出execl


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

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控件中的数据导出Execl


上述方法虽然实现了导出的功能,但同时把按钮、分页框等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中的数据导出Execl

有了上边的思路,就是将在导出的信息,输出(Response)客户端,这样就可以导出了。那么把DataSet中的数据导出,也就是把DataSet中的表中的各行信息,以ms-excel的格式Response到http流,这样就OK了。说明:参数ds应为填充有数据表的DataSet,文件名是全名,包括后缀名,如execl2006.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<cl;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<cl;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(); 
  }

4、将dataview导出execl

若想实现更加富于变化或者行列不规则的execl导出时,可用本法。

public void OutputExcel(DataView dv,string str)
{

   //dv为要输出到Excel的数据,str为标题名称
   GC.Collect();

   Application excel;// = new Application();
   int
rowIndex=4;
   int colIndex=1;
 
  
_Workbook xBk;
   _Worksheet xSt;
 
  
excel= new ApplicationClass();
  
   xBk =
excel.Workbooks.Add(true);
   
   xSt =
(_Worksheet)xBk.ActiveSheet;
 
   //
  
//取得标题
   //
   foreach(DataColumn col in
dv.Table.Columns)
   {
    colIndex++;

    excel.Cells[4,colIndex] = col.ColumnName;

   
xSt.get_Range(excel.Cells[4,colIndex],excel.Cells[4,colIndex]).HorizontalAlignment
= XlVAlign.xlVAlignCenter;//设置标题格式为居中对齐
   }
 

   //
   //取得表格中的数据
   //
  
foreach(DataRowView row in dv)
   {
   
rowIndex ++;
    colIndex = 1;
   
foreach(DataColumn col in dv.Table.Columns)
    {

     colIndex ++;
    
if(col.DataType == System.Type.GetType("System.DateTime"))

     {
     
excel.Cells[rowIndex,colIndex] =
(Convert.ToDateTime(row[col.ColumnName].ToString())).ToString("yyyy-MM-dd");

     
xSt.get_Range(excel.Cells[rowIndex,colIndex],excel.Cells[rowIndex,colIndex]).HorizontalAlignment
= XlVAlign.xlVAlignCenter;//设置日期型的字段格式为居中对齐
     }

     else
      if(col.DataType
== System.Type.GetType("System.String"))
     {

      excel.Cells[rowIndex,colIndex] =
"‘"+row[col.ColumnName].ToString();
     
xSt.get_Range(excel.Cells[rowIndex,colIndex],excel.Cells[rowIndex,colIndex]).HorizontalAlignment
= XlVAlign.xlVAlignCenter;//设置字符型的字段格式为居中对齐
     }

     else
     {

      excel.Cells[rowIndex,colIndex] =
row[col.ColumnName].ToString();
     }

    }
   }
   //
  
//加载一个合计行
   //
   int rowSum = rowIndex + 1;

   int colSum = 2;
   excel.Cells[rowSum,2] = "合计";

  
xSt.get_Range(excel.Cells[rowSum,2],excel.Cells[rowSum,2]).HorizontalAlignment =
XlHAlign.xlHAlignCenter;
   //
   //设置选中的部分的颜色

   //
  
xSt.get_Range(excel.Cells[rowSum,colSum],excel.Cells[rowSum,colIndex]).Select();

  
xSt.get_Range(excel.Cells[rowSum,colSum],excel.Cells[rowSum,colIndex]).Interior.ColorIndex
= 19;//设置为浅黄色,共计有56种
   //
   //取得整个报表的标题

   //
   excel.Cells[2,2] = str;
   //

   //设置整个报表的标题格式
   //
  
xSt.get_Range(excel.Cells[2,2],excel.Cells[2,2]).Font.Bold = true;

   xSt.get_Range(excel.Cells[2,2],excel.Cells[2,2]).Font.Size = 22;

   //
   //设置报表表格为最适应宽度
   //

  
xSt.get_Range(excel.Cells[4,2],excel.Cells[rowSum,colIndex]).Select();

  
xSt.get_Range(excel.Cells[4,2],excel.Cells[rowSum,colIndex]).Columns.AutoFit();

   //
   //设置整个报表的标题为跨列居中
   //

   xSt.get_Range(excel.Cells[2,2],excel.Cells[2,colIndex]).Select();

  
xSt.get_Range(excel.Cells[2,2],excel.Cells[2,colIndex]).HorizontalAlignment =
XlHAlign.xlHAlignCenterAcrossSelection;
   //
  
//绘制边框
   //
  
xSt.get_Range(excel.Cells[4,2],excel.Cells[rowSum,colIndex]).Borders.LineStyle =
1;
  
xSt.get_Range(excel.Cells[4,2],excel.Cells[rowSum,2]).Borders[XlBordersIndex.xlEdgeLeft].Weight
= XlBorderWeight.xlThick;//设置左边线加粗
  
xSt.get_Range(excel.Cells[4,2],excel.Cells[4,colIndex]).Borders[XlBordersIndex.xlEdgeTop].Weight
= XlBorderWeight.xlThick;//设置上边线加粗
  
xSt.get_Range(excel.Cells[4,colIndex],excel.Cells[rowSum,colIndex]).Borders[XlBordersIndex.xlEdgeRight].Weight
= XlBorderWeight.xlThick;//设置右边线加粗
  
xSt.get_Range(excel.Cells[rowSum,2],excel.Cells[rowSum,colIndex]).Borders[XlBordersIndex.xlEdgeBottom].Weight
= XlBorderWeight.xlThick;//设置下边线加粗
   //
   //显示效果

   //
   excel.Visible=true;
 

  
//xSt.Export(Server.MapPath(".")+""+this.xlfile.Text+".xls",SheetExportActionEnum.ssExportActionNone,Microsoft.Office.Interop.OWC.SheetExportFormat.ssExportHTML);

   xBk.SaveCopyAs(Server.MapPath(".")+""+this.xlfile.Text+".xls");

 
   ds = null;

           
xBk.Close(false, null,null);
   

            excel.Quit();

           
System.Runtime.InteropServices.Marshal.ReleaseComObject(xBk);

           
System.Runtime.InteropServices.Marshal.ReleaseComObject(excel);

    System.Runtime.InteropServices.Marshal.ReleaseComObject(xSt);

            xBk =
null;
           
excel = null;
   xSt = null;

            GC.Collect();

   string path = Server.MapPath(this.xlfile.Text+".xls");

 
   System.IO.FileInfo file = new System.IO.FileInfo(path);

   Response.Clear();
   Response.Charset="GB2312";

   Response.ContentEncoding=System.Text.Encoding.UTF8;

   // 添加头信息,为"文件下载/另存为"对话框指定默认文件名
  
Response.AddHeader("Content-Disposition", "attachment; filename=" +
Server.UrlEncode(file.Name));
   // 添加头信息,指定文件大小,让浏览器能够显示下载进度

   Response.AddHeader("Content-Length", file.Length.ToString());

   
   // 指定返回的是一个不能被客户端读取的流,必须被下载
  
Response.ContentType = "application/ms-excel";
   

   // 把文件流发送到客户端
   Response.WriteFile(file.FullName);

   // 停止页面的执行
  
   Response.End();

}

上面的方面,均将要导出的execl数据,直接给浏览器输出文件流,下面的方法是首先将其存到服务器的某个文件夹中,然后把文件发送到客户端。这样可以持久的把导出的文件存起来,以便实现其它功能。

5、将execl文件导出到服务器上,再下载。


二、winForm中导出Execl的方法:

1、方法1:

SqlConnection conn=new
SqlConnection(System.Configuration.ConfigurationSettings.AppSettings["conn"]);

    SqlDataAdapter da=new SqlDataAdapter("select * from
tb1",conn);
    DataSet ds=new DataSet();

    da.Fill(ds,"table1");
    DataTable
dt=ds.Tables["table1"];
    string
name=System.Configuration.ConfigurationSettings.AppSettings["downloadurl"].ToString()+DateTime.Today.ToString("yyyyMMdd")+new
Random(DateTime.Now.Millisecond).Next(10000).ToString()+".csv";//存放到web.config中downloadurl指定的路径,文件格式为当前日期+4位随机数

   FileStream fs=new
FileStream(name,FileMode.Create,FileAccess.Write);

    StreamWriter sw=new
StreamWriter(fs,System.Text.Encoding.GetEncoding("gb2312"));

    sw.WriteLine("自动编号,姓名,年龄");

   foreach(DataRow dr in dt.Rows)
    {

     sw.WriteLine(dr["ID"]+","+dr["vName"]+","+dr["iAge"]);

    }
    sw.Close();

    Response.AddHeader("Content-Disposition", "attachment;
filename=" + Server.UrlEncode(name));

    Response.ContentType = "application/ms-excel";//
指定返回的是一个不能被客户端读取的流,必须被下载
   Response.WriteFile(name); //
把文件流发送到客户端
   Response.End();

public void Out2Excel(string sTableName,string url)
{

Excel.Application oExcel=new Excel.Application();
Workbooks oBooks;

Workbook oBook;
Sheets oSheets;
Worksheet oSheet;
Range oCells;

string sFile="",sTemplate="";
//
System.Data.DataTable
dt=TableOut(sTableName).Tables[0];

sFile=url+"myExcel.xls";

sTemplate=url+"MyTemplate.xls";
//
oExcel.Visible=false;

oExcel.DisplayAlerts=false;
//定义一个新的工作簿
oBooks=oExcel.Workbooks;

oBooks.Open(sTemplate,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,Type.Missing,
Type.Missing, Type.Missing);
oBook=oBooks.get_Item(1);

oSheets=oBook.Worksheets;
oSheet=(Worksheet)oSheets.get_Item(1);

//命名该sheet
oSheet.Name="Sheet1";

oCells=oSheet.Cells;

//调用dumpdata过程,将数据导入到Excel中去
DumpData(dt,oCells);
//保存

oSheet.SaveAs(sFile,Excel.XlFileFormat.xlTemplate,Type.Missing,Type.Missing,
Type.Missing, Type.Missing, Excel.XlSaveAsAccessMode.xlNoChange, Type.Missing,
Type.Missing, Type.Missing);
oBook.Close(false,
Type.Missing,Type.Missing);
//退出Excel,并且释放调用的COM资源
oExcel.Quit();

GC.Collect();
KillProcess("Excel");
}

private void
KillProcess(string processName)
{
System.Diagnostics.Process myproc= new
System.Diagnostics.Process();
//得到所有打开的进程
try
{
foreach (Process
thisproc in Process.GetProcessesByName(processName))
{

if(!thisproc.CloseMainWindow())
{
thisproc.Kill();
}
}
}

catch(Exception Exc)
{
throw new Exception("",Exc);
}
}

2、方法2:

protected void ExportExcel()
   {

    gridbind();
    if(ds1==null) return;

 
    string saveFileName="";

//   bool fileSaved=false;
    SaveFileDialog
saveDialog=new SaveFileDialog();
    saveDialog.DefaultExt
="xls";
    saveDialog.Filter="Excel文件|*.xls";

    saveDialog.FileName ="Sheet1";

    saveDialog.ShowDialog();

    saveFileName=saveDialog.FileName;

    if(saveFileName.IndexOf(":")<0) return; //被点了取消

//   excelapp.Workbooks.Open   (App.path &
工程进度表.xls)
  
    Excel.Application xlApp=new
Excel.Application();
    object
missing=System.Reflection.Missing.Value;
 

    if(xlApp==null)
    {

     MessageBox.Show("无法创建Excel对象,可能您的机子未安装Excel");

     return;
    }

    Excel.Workbooks workbooks=xlApp.Workbooks;

    Excel.Workbook
workbook=workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);

    Excel.Worksheet
worksheet=(Excel.Worksheet)workbook.Worksheets[1];//取得sheet1

    Excel.Range range;
   
 

    string oldCaption=Title_label .Text.Trim ();

    long totalCount=ds1.Tables[0].Rows.Count;

    long rowRead=0;
    float percent=0;

 
    worksheet.Cells[1,1]=Title_label .Text.Trim
();
    //写入字段
   for(int
i=0;i<ds1.Tables[0].Columns.Count;i++)
    {

     worksheet.Cells[2,i+1]=ds1.Tables[0].Columns.ColumnName; 

     range=(Excel.Range)worksheet.Cells[2,i+1];

     range.Interior.ColorIndex = 15;

     range.Font.Bold = true;
 

    }
    //写入数值
   Caption
.Visible = true;
    for(int
r=0;r<ds1.Tables[0].Rows.Count;r++)
    {

     for(int i=0;i<ds1.Tables[0].Columns.Count;i++)

     {

      worksheet.Cells[r+3,i+1]=ds1.Tables[0].Rows[r];    

     }
     rowRead++;

     percent=((float)(100*rowRead))/totalCount;   

     this.Caption.Text= "正在导出数据["+
percent.ToString("0.00")  +"%]...";

     Application.DoEvents();
    }

    worksheet.SaveAs(saveFileName,missing,missing,missing,missing,missing,missing,missing,missing);

   
    this.Caption.Visible= false;

    this.Caption.Text= oldCaption;
 

    range=worksheet.get_Range(worksheet.Cells[2,1],worksheet.Cells[ds1.Tables[0].Rows.Count+2,ds1.Tables[0].Columns.Count]);

    range.BorderAround(Excel.XlLineStyle.xlContinuous,Excel.XlBorderWeight.xlThin,Excel.XlColorIndex.xlColorIndexAutomatic,null);

  

    range.Borders[Excel.XlBordersIndex.xlInsideHorizontal].ColorIndex
= Excel.XlColorIndex.xlColorIndexAutomatic;

    range.Borders[Excel.XlBordersIndex.xlInsideHorizontal].LineStyle
=Excel.XlLineStyle.xlContinuous;

    range.Borders[Excel.XlBordersIndex.xlInsideHorizontal].Weight
=Excel.XlBorderWeight.xlThin;
 

    if(ds1.Tables[0].Columns.Count>1)

    {

     range.Borders[Excel.XlBordersIndex.xlInsideVertical].ColorIndex=Excel.XlColorIndex.xlColorIndexAutomatic;

     }

    workbook.Close(missing,missing,missing);

    xlApp.Quit();
   }

三、附注:

虽然都是实现导出execl的功能,但在asp.net和winform的程序中,实现的代码是各不相同的。在asp.net中,是在服务器端读取数据,在服务器端把数据以ms-execl的格式,以Response输出到浏览器(客户端);而在winform中,是把数据读到客户端(因为winform运行端就是客户端),然后调用客户端安装的office组件,将读到的数据写在execl的工作簿中。

转自:http://hi.csdn.net/bat800

时间: 2024-08-26 01:50:06

C# 将数据导出到Execl汇总的相关文章

将ASP.NET 数据导出到execl

将上图数据保存到execl //导出到execl protected void Execl_Click(object sender, EventArgs e) { System.Web.UI.Control ctl = this.Repeater1; //Repeater1是你在窗体中拖放的控件 HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=Excel

jsp表格数据导出到Execl

1.关于“下载” 需要设置页面header的一个属性为:Content-Disposition: attachment; filename=下载的文件.txt 如: <a href="down.jsp">下载</a> down.jsp: <% response.setHeader("Content-Disposition", "attachment;fileName=download.txt"); %> 2.关

asp.net大数据导出execl实现分开压缩并下载

asp.net大数据导出execl实现分开压缩并下载 /// <summary> /// 导出数据到EXCEL 多个表的 /// </summary> /// <param name="ds">数据集</param> /// <param name="AbosultedFilePath">导出的 EXCEL 路径</param> /// <param name="name&quo

C#:将数据网格内的数据导出到Excel

? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 public void ExportDataToExecel(DataGridView  dataGridView1) {     SaveF

DevExpress- GridControl数据导出到EXCEL

将DevExpress-GridControl数据导出到EXCEL,目前用过两种,一为利用GridControl函数操作,一为用流(IO)操作.区别在于前者可以将你在GridControl所见格式全部导入EXCEL,比如有时候我们在Bands里面拖拽出来的Title样式,后者最大优点在于速度很快,亲测10W条数据导出只需2秒左右; ? ? No.1:用GridControl函数导出数据到EXCEL,建议设置Options下OptionsPrint-AutoWidth=False,使导出后单元格宽

C#将网页数据导出Excel时编码设置

1 public void DGToExcel() 2 { 3 Response.ClearContent(); 4 Response.Charset = "GB2312";//内容编码 5 Response.ContentType = "application/ms-excel"; 6 Response.ContentEncoding = System.Text.Encoding.GetEncoding("GB2312");//内容编码 7 R

【基于WinForm+Access局域网共享数据库的项目总结】之篇二:WinForm开发扇形图统计和Excel数据导出

篇一:WinForm开发总体概述与技术实现 篇二:WinForm开发扇形图统计和Excel数据导出 篇三:Access远程连接数据库和窗体打包部署 [小记]:最近基于WinForm+Access数据库完成一个法律咨询管理系统.本系统要求类似网页后台管理效果,并且基于局域网内,完成多客户端操作同一数据库,根据权限不同分别执行不同功能模块.核心模块为级联统计类型管理.数据库咨询数据扇形统计.树的操作.咨询数据的管理.手写分页.Excel数据的导出.多用户操作服务器数据等.并支持多用户同时操作,远程连

php 数据导出到excel 2种带有合并单元格的导出

具体业务层面 可能会有所不同.以下两种方式涉及的合并单元格地方有所不同,不过基本思路是一致的. 第一种是非插件版本.可能更容易理解点,基本思路就是 组装table 然后 读取 输出到excel上.缺点是要设置样式不太好设置. 第二种是利用插件  PHPExcel   有点是可以对输出格式做各种设置.缺点是初次接触这个插件的同学,并且对表格合并不熟悉的同学,可能要花点时间理解 另外注意excel对数字过长会处理成你不想要的数据,记得对该数据格式化成字符串 貌似就可以解决.以前遇到过 /** * *

干货 | Elasticsearch、Kibana数据导出实战

1.问题引出 以下两个导出问题来自Elastic中文社区. 问题1.kibana怎么导出查询数据? 问题2:elasticsearch数据导出 就像数据库数据导出一样,elasticsearch可以么? 或者找到它磁盘上存放数据的位置,拷贝出来,放到另一个es服务器上或者转成自己要的数据格式? 实际业务实战中,大家或多或少的都会遇到导入.导出问题. 根据数据源的不同,基本可以借助: 1.程序写入 2.数据同步 logstash/flume/cana/es_hadoopl等来实现关系型数据库(如: