c#导出datagridvie怎么能让头发长得快把格式也一起导出到excel?我直接导出到excel,连个边框都没有!

C# 将数据导出到Excel汇总
C# 将数据导出到Excel汇总
C# 将数据导出到Excel汇总
分享到Twitter
[作者:佚名 来源: 时间:<font color=#0-12-20 【
在这里在下只是总结一下别人的方法,整理的好一点方便大家使用,呵呵!!!
在asp.net中导出Excel有两种方法,一种是将导出的文件存放在服务器某个文件夹下面,然后将文件地址输出在浏览器上;一种是将文件直接将文件输出流写给浏览器。在Response输出时,t分隔的数据,导出Excel时,等价于分列,n等价于换行。&1、将整个html全部输出Excel此法将html中所有的内容,如按钮,表格,图片等全部输出到Excel中。
Response.Clear();&&&&&&&&&Response.Buffer=&&&true;&&&&&&&&&Response.AppendHeader("Content-Disposition","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","filename=Excel.xls");&HttpContext.Current.Response.Charset&="UTF-8";&&&&&HttpContext.Current.Response.ContentEncoding&=System.Text.Encoding.D&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","filename=Excel.xls");&&&&HttpContext.Current.Response.Charset&="UTF-8";&&&&&&&&HttpContext.Current.Response.ContentEncoding&=System.Text.Encoding.D&&&&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&=&Page.R&resp.ContentEncoding&=&System.Text.Encoding.GetEncoding("GB2312");&resp.AppendHeader("Content-Disposition",&"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.C&&&&&//取得数据表各列标题,各标题之间以t分割,最后一个列标题后加回车符&for(i=0;i&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&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导出excel若想实现更加富于变化或者行列不规则的excel导出时,可用本法。
public&void&OutputExcel(DataView&dv,string&str)&{&&&&//dv为要输出到Excel的数据,str为标题名称&&&&GC.Collect();&&&&Application&//&=&new&Application();&&&&int&rowIndex=4;&&&&int&colIndex=1;&&&&_Workbook&xBk;&&&&_Worksheet&xSt;&&&&excel=&new&ApplicationClass();&&&&&&&xBk&=&excel.Workbooks.Add(true);&&&&&&&&xSt&=&(_Worksheet)xBk.ActiveS&&&&//&&&&//取得标题&&&&//&&&&foreach(DataColumn&col&in&dv.Table.Columns)&&&&{&&&&&colIndex++;&&&&&excel.Cells[4,colIndex]&=&col.ColumnN&&&&&xSt.get_Range(excel.Cells[4,colIndex],excel.Cells[4,colIndex]).HorizontalAlignment&=&XlVAlign.xlVAlignC//设置标题格式为居中对齐&&&&}&&&&//&&&&//取得表格中的数据&&&&//&&&&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.xlVAlignC//设置日期型的字段格式为居中对齐&&&&&&}&&&&&&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.xlVAlignC//设置字符型的字段格式为居中对齐&&&&&&}&&&&&&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.xlHAlignC&&&&//&&&&//设置选中的部分的颜色&&&&//&&&&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]&=&&&&&//&&&&//设置整个报表的标题格式&&&&//&&&&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.xlHAlignCenterAcsS&&&&//&&&&//绘制边框&&&&//&&&&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.xlT//设置左边线加粗&&&&xSt.get_Range(excel.Cells[4,2],excel.Cells[4,colIndex]).Borders[XlBordersIndex.xlEdgeTop].Weight&=&XlBorderWeight.xlT//设置上边线加粗&&&&xSt.get_Range(excel.Cells[4,colIndex],excel.Cells[rowSum,colIndex]).Borders[XlBordersIndex.xlEdgeRight].Weight&=&XlBorderWeight.xlT//设置右边线加粗&&&&xSt.get_Range(excel.Cells[rowSum,2],excel.Cells[rowSum,colIndex]).Borders[XlBordersIndex.xlEdgeBottom].Weight&=&XlBorderWeight.xlT//设置下边线加粗&&&&//&&&&//显示效果&&&&//&&&&excel.Visible=true;&&&&//xSt.Export(Server.MapPath(".")+""+this.xlfile.Text+".xls",SheetExportActionEnum.ssExportActionNone,Micoft.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",&"&filename="&+&Server.UrlEncode(file.Name));&&&&//&添加头信息,指定文件大小,让浏览器能够显示下载进度&&&&Response.AddHeader("Content-Length",&file.Length.ToString());&&&&&&&&//&指定返回的是一个不能被客户端读取的流,必须被下载&&&&Response.ContentType&=&"application/ms-excel";&&&&&&&&//&把文件流发送到客户端&&&&Response.WriteFile(file.FullName);&&&&//&停止页面的执行&&&&&&&Response.End();&}
二、winForm中导出Excel的方法: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",&"&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&oBWorkbook&oBSheets&oSWorksheet&oSRange&oCstring&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.WoBooks.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.WoSheet=(Worksheet)oSheets.get_Item(1);//命名该sheetoSheet.Name="Sheet1";oCells=oSheet.C//调用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=&&&&SaveFileDialog&saveDialog=new&SaveFileDialog();&&&&saveDialog.DefaultExt&="xls";&&&&saveDialog.Filter="Excel文件|*.xls";&&&&saveDialog.FileName&="Sheet1";&&&&saveDialog.ShowDialog();&&&&saveFileName=saveDialog.FileN&&&&if(saveFileName.IndexOf(":")&0)&return;&//被点了取消//&&&&excelapp.Workbooks.Open&&&(App.path&&&工程进度表.xls)&&&&&&&&Excel.Application&xlApp=new&Excel.Application();&&&&object&missing=System.Reflection.Missing.V&&&&&if(xlApp==null)&&&&{&&&&&MessageBox.Show("无法创建Excel对象,可能您的机子未安装Excel");&&&&&return;&&&&}&&&&Excel.Workbooks&workbooks=xlApp.W&&&&Excel.Workbook&workbook=workbooks.Add(Excel.XlWBATemplate.xlWBATWorksheet);&&&&Excel.Worksheet&worksheet=(Excel.Worksheet)workbook.Worksheets[1];//取得sheet1&&&&Excel.Range&&&&&&&&&string&oldCaption=Title_label&.Text.Trim&();&&&&long&totalCount=ds1.Tables[0].Rows.C&&&&long&rowRead=0;&&&&float&percent=0;&&&&&worksheet.Cells[1,1]=Title_label&.Text.Trim&();&&&&//写入字段&&&&for(int&i=0;i&ds1.Tables[0].Columns.Ci++)&&&&{&&&&&worksheet.Cells[2,i+1]=ds1.Tables[0].Columns.ColumnN&&&&&&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.Cr++)&&&&{&&&&&for(int&i=0;i&ds1.Tables[0].Columns.Ci++)&&&&&{&&&&&&worksheet.Cells[r+3,i+1]=ds1.Tables[0].Rows[r];&&&&&&&&&&}&&&&&rowRead++;&&&&&percent=((float)(100*rowRead))/totalC&&&&&&&&&this.Caption.Text=&"正在导出数据["+&percent.ToString("0.00")&+"%]";&&&&&Application.Donts();&&&&}&&&&worksheet.SaveAs(saveFileName,missing,missing,missing,missing,missing,missing,missing,missing);&&&&&&&this.Caption.Visible=&false;&&&&this.Caption.Text=&oldC&&&&&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.xlColorIndexA&&&&range.Borders[Excel.XlBordersIndex.xlInsideHorizontal].LineStyle&=Excel.XlLineStyle.xlC&&&&range.Borders[Excel.XlBordersIndex.xlInsideHorizontal].Weight&=Excel.XlBorderWeight.xlT&&&&&if(ds1.Tables[0].Columns.Count&1)&&&&{&&&&&range.Borders[Excel.XlBordersIndex.xlInsidrtical].ColorIndex=Excel.XlColorIndex.xlColorIndexA&&&&&}&&&&workbook.Close(missing,missing,missing);&&&&xlApp.Quit();&&&}
6.从DataGridView里导出
///&&summary&&&&&&&&&&&&///&常用方法,列之间加\t开。&&&&&&&&&&&///&&/summary&&&&&&&&&&&&///&&remarks&&&&&&&&&&&&///&using&System.IO;&&&&&&&&&&&///&&/remarks&&&&&&&&&&&&///&&param&name="dgv"&&/param&&&&&&&&&&&&private&void&DataGridViewToExcel(DataGridView&dgv)&&&&&&&&{&&&&&&&&&&&&SaveFileDialog&dlg&=&new&SaveFileDialog();&&&&&&&&&&&&dlg.Filter&=&"Execl&files&(*.xls)|*.xls";&&&&&&&&&&&&dlg.CheckFileExists&=&false;&&&&&&&&&&&&dlg.CheckPathExists&=&false;&&&&&&&&&&&&dlg.FilterIndex&=&0;&&&&&&&&&&&&dlg.RestoreDirectory&=&true;&&&&&&&&&&&&dlg.CreatePrompt&=&true;&&&&&&&&&&&&dlg.Title&=&"保存为Excel文件";&&&&&&&&&&&&if&(dlg.ShowDialog()&==&DialogResult.OK)&&&&&&&&&&&&{&&&&&&&&&&&&&&&&Stream&myS&&&&&&&&&&&&&&&&myStream&=&dlg.OpenFile();&&&&&&&&&&&&&&&&StreamWriter&sw&=&new&StreamWriter(myStream,&System.Text.Encoding.GetEncoding(-0));&&&&&&&&&&&&&&&&string&columnTitle&=&"";&&&&&&&&&&&&&&&&try&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&//写入列标题&&&&&&&&&&&&&&&&&&&&&&&for&(int&i&=&0;&i&&&dgv.ColumnC&i++)&&&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&if&(i&&&0)&&&&&&&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&columnTitle&+=&"\t";&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&columnTitle&+=&dgv.Columns[i].HeaderT&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&sw.WriteLine(columnTitle);&&&&&&&&&&&&&&&&&&&&//写入列内容&&&&&&&&&&&&&&&&&&&&&&&for&(int&j&=&0;&j&&&dgv.Rows.C&j++)&&&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&string&columnValue&=&"";&&&&&&&&&&&&&&&&&&&&&&&&for&(int&k&=&0;&k&&&dgv.Columns.C&k++)&&&&&&&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&(k&&&0)&&&&&&&&&&&&&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&columnValue&+=&"\t";&&&&&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&&&&&if&(dgv.Rows[j].Cells[k].Value&==&null)&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&columnValue&+=&"";&&&&&&&&&&&&&&&&&&&&&&&&&&&&else&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&columnValue&+=&dgv.Rows[j].Cells[k].Value.ToString().Trim();&&&&&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&&&&&sw.WriteLine(columnValue);&&&&&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&&&&&sw.Close();&&&&&&&&&&&&&&&&&&&&myStream.Close();&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&catch&(Exception&e)&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&MessageBox.Show(e.ToString());&&&&&&&&&&&&&&&&}&&&&&&&&&&&&&&&&finally&&&&&&&&&&&&&&&&{&&&&&&&&&&&&&&&&&&&&sw.Close();&&&&&&&&&&&&&&&&&&&&myStream.Close();&&&&&&&&&&&&&&&&}&&&&&&&&&&&&}&&&&&&&&}
三、附注:&虽然都是实现导出excel的功能,但在asp.net和winform的程序中,实现的代码是各不相同的。在asp.net中,是在服务器端读取数据,在服务器端把数据以ms-excel的格式,以Response输出到浏览器(客户端);而在winform中,是把数据读到客户端(因为winform运行端就是客户端),然后调用客户端安装的office组件,将读到的数据写在excel
发表评论:
TA的最新馆藏[转]&[转]&[转]&[转]&[转]&[转]&C#&DataGridView导出到Excel&代码实现及详解
一.DataGridView一般都是分页显示数据库中查到的数据的. 这里先做导出当页的数据到 Excel.
&& 流程很简单明了,照着搬就ok了.
&& (1)新建一个 Excel类. C#
很方便的已经提供了这个开发包,不需要第三方控件了.
(2)新增加一个工作薄,workbook.&
(3)为Excel设置表头,通常是把你原来的用for循环复制过来.如果原来就有隐藏一些列,那就做一个判断再复制.
(4)用两层循环,把datagridview里面的数据搬过来..这个再直观不过了.就好比有两个二位数组,数据里头的元素就是行和列交叉的地方那个小格子的内容.一个叫datagridview.一个叫excel.现在做一个copy...把数据一个一个的搬家就ok
&& (5)保存excel并退出.
&& 一些注意:
&Excel的行和列,脚标是从1开始的。
而datagridview是从0开始。因此填数据的时候注意加减1
&代码如下:
void GenerateExcelCurrent(DataGridView dataGridView1)
&int columnCount = 0;
&//导出到execl &
&//没有数据的话就不往下执行 &
(dataGridView1.Rows.Count == 0)
&MessageBox.Show("当前页面没有数据可以导出!", "导出结果",
MessageBoxButtons.OK);
&//实例化一个Excel.Application对象
&Microsoft.Office.Interop.Excel.Application excel
= new Microsoft.Office.Interop.Excel.Application();
&//让后台执行设置为不可见,为true的话会看到打开一个Excel,然后数据在往里写
&excel.Visible =
&//新增加一个工作簿,Workbook是直接保存,不会弹出保存对话框,加上Application会弹出保存对话框,值为false会报错
&excel.Application.Workbooks.Add(true);
&//生成Excel中列头名称,下面的不一定是大家都用得到的,我只是判断有哪些列是显示了的,然后只搬家这些列的数据。如果你是全部搬家,那就直接一个for循环就可以了------------------------------
& & &for(int i =
0; i & dataGridView1.Columns.C i++)
(dataGridView1.Columns[i].Visible)
&columnCount = columnCount + 1;
& & &string[]
headers = new string[columnCount];
& & &int index =
& & &for (int i
= 0; i & dataGridView1.Columns.C i++)
&if(dataGridView1.Columns[i].Visible)
&headers[index] =
dataGridView1.Columns[i].HeaderT
&index = index + 1;
& & &for (int i
= 0; i & columnC i++)
& &excel.Cells[1, i+1] =
headers[i];
(dataGridView1.Columns[i].ValueType == typeof(DateTime))
&Microsoft.Office.Interop.Excel.Range headRange =
excel.Cells[1, i-1] as Microsoft.Office.Interop.Excel.R// as
R//获取表头单元格
&headRange.ColumnWidth = 22;//设置列宽
&//---------------------------------------------------**********************************----------------------------------------
&//把DataGridView当前页的数据保存在Excel中
& & &for (int i
= 0; i & dataGridView1.Rows.C i++)
& &int columnIndex = 0;
& &for (int j = 0; j
& dataGridView1.Columns.C j++)
&if(dataGridView1.Columns[j].Visible)
& & &columnIndex
= columnIndex + 1;
&if (dataGridView1[j, i].ValueType ==
typeof(string))
&excel.Cells[i + 2, columnIndex] = "'" +
dataGridView1[j, i].Value.ToString();
&excel.Cells[i + 2, columnIndex] =
dataGridView1[j, i].Value.ToString();
&//设置禁止弹出保存和覆盖的询问提示框 &
&excel.DisplayAlerts =
&excel.AlertBeforeOverwriting =
& & &//保存工作簿
&//excel.Application.Workbooks.Add(true).Save();
& & &//保存excel文件
&excel.Save();
&//确保Excel进程关闭 &
&excel.Quit();
& & &excel =
&MessageBox.Show("当前页面数据已经成功导出到您指定的目录!", "导出结果",
MessageBoxButtons.OK);
&catch (Exception ex)
&MessageBox.Show(ex.Message, "错误提示");
&& &private
void btnExcelCurrent_Click(object sender, EventArgs e)
&GenerateExcelCurrent(dgvBusiness);
二。导出所有的数据到Excel。
其实原理跟上面基本一样,只需要找到数据搬家的来源---这一次来源就是从数据库查询到的东西。然后进行遍历,复制给excel的每一个单元格。
其实从数据库查出来的数据格式,每个人有自己的偏好,二位数组也好,dataset也好,只要能赋值就行。
我从数据库出来的数据是DataSet格式。但是它不能直接按行列操作。所以要先取到
&DataTable.如下。
&& &DataSet
ds = GetAllForExcel();
&DataTable table = ds.Tables[0];
&& 将所有数据导出到Excel:
&&&private
void GenerateExcelAll(System.Data.DataTable dt,DataGridView
&//导出到execl &
&//没有数据的话就不往下执行 &
(dt.Rows.Count == 0)
&MessageBox.Show("当前页面没有数据可以导出!", "导出结果",
MessageBoxButtons.OK);
&//实例化一个Excel.Application对象
&Microsoft.Office.Interop.Excel.Application excel
= new Microsoft.Office.Interop.Excel.Application();
&//新增加一个工作簿,Workbook是直接保存,不会弹出保存对话框,加上Application会弹出保存对话框,值为false会报错
&excel.Application.Workbooks.Add(true);
&//让后台执行设置为不可见,为true的话会看到打开一个Excel,然后数据在往里写
&excel.Visible =
&//生成Excel中列头名称&
&//生成Excel中列头名称------------------------------**********************************---------------------------------------&
columnCount = 0;
& & &for (int i
= 0; i & dgv.Columns.C i++)
(dgv.Columns[i].Visible)
&columnCount = columnCount + 1;
& & &string[]
headers = new string[columnCount];
& & &int index =
& & &for (int i
= 0; i & dgv.Columns.C i++)
(dgv.Columns[i].Visible)
&headers[index] = dgv.Columns[i].HeaderT
&index = index + 1;
& & &for (int i
= 0; i & columnC i++)
& &excel.Cells[1, i + 1] =
headers[i];
& &//if (dgv.Columns[i].ValueType
== typeof(DateTime))
&Microsoft.Office.Interop.Excel.Range headRange =
excel.Cells[1, i - 1] as Microsoft.Office.Interop.Excel.R// as
R//获取表头单元格
&headRange.ColumnWidth = 22;//设置列宽
&//---------------------------------------------------**********************************----------------------------------------
&////////----------------------------------------**************************************---------------------------------------------
&//把DataGridView当前页的数据保存在Excel中
(dt.Rows.Count & 0)
& &int ccc =
dgv.Columns.C
& &for (int i = 0; i
& dt.Rows.C
i++)//控制Excel中行,上下的距离,就是可以到Excel最下的行数,比数据长了报错,比数据短了会显示不完
&int columnIndex = 0;
&for (int j = 0; j &
dt.Columns.C
j++)//控制Excel中列,左右的距离,就是可以到Excel最右的列数,比数据长了报错,比数据短了会显示不完
(dgv.Columns[j].Visible)
& &columnIndex = columnIndex +
& &string str =
dt.Rows[i][j].ToString();
& &excel.Cells[i + 2,
columnIndex] = "'" +
//i控制行,从Excel中第2行开始输出第一行数据,j控制列,从Excel中第1列输出第1列数据,"'"
+是以string形式保存,所以遇到数字不会转成16进制 &
&//设置禁止弹出保存和覆盖的询问提示框 &
&excel.DisplayAlerts =
&excel.AlertBeforeOverwriting =
&//保存工作簿,值为false会报错 &
&//excel.Application.Workbooks.Add(false);//.Save();
&//确保Excel进程关闭 &
&excel.Save();
&excel.Quit();
& & &excel =
&MessageBox.Show("您所查询的所有数据已经成功导出到您指定的目录!",
"导出结果", MessageBoxButtons.OK);
&catch (Exception ex)
&MessageBox.Show(ex.Message, "错误提示");
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 怎么能让头发长得快 的文章

 

随机推荐