Excel导出方法选择(转自gwf25sz)

前台:
ContractedBlock.gif ExpandedBlockStart.gif Code
<%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Default.aspx.cs" Inherits="ExampleForExport._Default" %>  
  
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">  
<html xmlns="http://www.w3.org/1999/xhtml">  
<head runat="server">  
    
<title>无标题页</title>  
</head>  
<body>  
    
<form id="form1" runat="server">  
    
<div align="center">  
        黄色区域为需导出的数据区
<br />  
        
<asp:Button ID="btnExport" Text="Export1" runat="server" OnClick="btnExport_Click" />  
        
<asp:Button ID="btnExportT" Text="Export2" runat="server"    
            onclick
="btnExportT_Click" />  
        
<asp:Button ID="btnExportTh" Text="Export3" runat="server"    
            onclick
="btnExportTh_Click" />  
        
<table style="background-color: Yellow;" mce_style="background-color: Yellow;" id = "tabExportArea" runat = "server">  
            
<tr>  
                
<td colspan="2">  
                    Example for export Excel!   
                
</td>  
            
</tr>  
            
<tr>  
                
<td align="left">  
                    
<img id="imgLogo" src="img/logo.jpg" mce_src="img/logo.jpg" />  
                
</td>  
                
<td align="right">  
                    NO:
<%=DateTime.Now.ToString("yyyy-MM-dd"%>  
                
</td>  
            
</tr>  
            
<tr>  
                
<td colspan="2">  
                    
<asp:GridView ID="gvTest" runat="server" AllowPaging = "true" PageSize = "10"    
                        onpageindexchanging
="gvTest_PageIndexChanging">  
                    
</asp:GridView>  
                
</td>  
            
</tr>  
            
<tr>  
                
<td colspan="2">  
                    Here we will use two function to export the data!   
                
</td>  
            
</tr>  
        
</table>  
    
</div>  
    
</form>  
</body>  
</html> 
后台实现:
ContractedBlock.gif ExpandedBlockStart.gif Code
using System;   
using System.Collections;   
using System.Configuration;   
using System.Data;   
using System.Linq;   
using System.Web;   
using System.Web.Security;   
using System.Web.UI;   
using System.Web.UI.HtmlControls;   
using System.Web.UI.WebControls;   
using System.Web.UI.WebControls.WebParts;   
using System.Xml.Linq;   
using NPOI.HSSF.UserModel;   
using System.IO;   
using NPOI.HSSF.Util;   
using NPOI.HPSF;   
using NPOI.POIFS.FileSystem;   
//using Excel;   
  
namespace ExampleForExport   
{   
    
public partial class _Default : System.Web.UI.Page   
    {  
        
#region other function   
        
//just for function one   
        public override void  VerifyRenderingInServerForm(Control control)   
        {   
             
//注释掉下面的代码,否则在asp.net2.0下会报错(注:GridView是asp.net 2.0下的控件,1.1下一些控件也可以导出成Excel或者Word)   
             
//base.VerifyRenderingInServerForm(control);   
        }   
  
        
private DataTable dt = new DataTable();   
        
protected void Page_Load(object sender, EventArgs e)   
        {   
            CreateTable();   
            GridViewBind();   
        }   
  
        
private void CreateTable()   
        {   
            dt 
= new DataTable("Names");   
  
            
// Add three column objects to the table.   
            DataColumn dc1 = new DataColumn();   
            dc1.DataType 
= System.Type.GetType("System.String");   
            dc1.ColumnName 
= "Num";   
            dc1.DefaultValue 
= "Num";   
            dt.Columns.Add(dc1);   
  
            DataColumn dc2 
= new DataColumn();   
            dc2.DataType 
= System.Type.GetType("System.String");   
            dc2.ColumnName 
= "Content";   
            dt.Columns.Add(dc2);   
  
            DataColumn dc3 
= new DataColumn();   
            dc3.DataType 
= System.Type.GetType("System.String");   
            dc3.ColumnName 
= "DateTime";   
            dt.Columns.Add(dc3);   
  
            DataColumn dc4 
= new DataColumn();   
            dc4.DataType 
= System.Type.GetType("System.String");   
            dc4.ColumnName 
= "DateTime1";   
            dt.Columns.Add(dc4);   
  
            DataColumn dc5 
= new DataColumn();   
            dc5.DataType 
= System.Type.GetType("System.String");   
            dc5.ColumnName 
= "DateTime2";   
            dt.Columns.Add(dc5);   
  
            DataColumn dc6 
= new DataColumn();   
            dc6.DataType 
= System.Type.GetType("System.String");   
            dc6.ColumnName 
= "DateTime3";   
            dt.Columns.Add(dc6);   
            
// Create an array for DataColumn objects.   
            DataColumn[] keys = new DataColumn[1];   
            keys[
0= dc1;   
            dt.PrimaryKey 
= keys;   
  
            
for (int i = 0; i < 20; i++)   
            {   
                DataRow dr 
= dt.NewRow();   
                dr[
"Num"= i.ToString();   
                dr[
"Content"= "这是第" + i.ToString() + "行!";   
                dr[
"DateTime"= DateTime.Now.ToLongTimeString();   
                dt.Rows.Add(dr);   
            }   
        }   
  
        
private void GridViewBind()   
        {   
            gvTest.DataSource 
= dt;   
            gvTest.DataBind();   
        }   
  
        
protected void gvTest_PageIndexChanging(object sender, GridViewPageEventArgs e)   
        {   
            gvTest.PageIndex 
= e.NewPageIndex;   
            GridViewBind();   
        }  
        
#endregion  
 
        
#region Export Excel   
        
/*function one of export  
         * 本方法适合导出纯数据,可以方便的导出<table></table>标签内的数据  
         * 但本方法无法导出图片,所以不适合导出有图片的数据  
         
*/  
        
protected void btnExport_Click(object sender, EventArgs e)   
        {   
            Response.Clear();
//清空缓冲区流中的所有输出内容   
            Response.AddHeader("content-disposition""attachment;filename=ExportOne.xls");//这里可以指定导出后默认的文件名   
            Response.ContentType = "application/vnd.xls";//设置输出流的HTTP的 HTTP MIME 类型   
            Response.Charset = "";//设置输出流的HTTP字符集为空   
            this.EnableViewState = false;   
            System.IO.StringWriter sw 
= new System.IO.StringWriter();   
            System.Web.UI.HtmlTextWriter hw 
= new HtmlTextWriter(sw);   
  
            
//如果有数据,先取消分页,得到文件流后再恢复分页   
            if (gvTest.Rows.Count > 0)   
            {   
                gvTest.AllowPaging 
= false;   
                GridViewBind();   
                tabExportArea.RenderControl(hw);   
                gvTest.AllowPaging 
= true;   
            }   
            Response.Write(sw.ToString());   
            Response.End();
//结束   
        }   
  
  
        
/* function two of export  
         * 这种方法需要一个EXCEL模板(事先建好的)  
         * EXCEL模板里面的内容都是固定不动的,如标题/数据源表头,并且在数据源位置不能有任何数据,否则将有可能被覆盖掉  
         * 这种方法可以导出任意类型的数据  
         * 但这种方法比较烦琐,样式很难搞,所以,如果没有特殊必要,用第一个方法就够了  
         * *
*/  
        
protected void btnExportT_Click(object sender, EventArgs e)   
        {   
            gvTest.AllowPaging 
= false;   
            GridViewBind();   
            DataTable dt 
= (DataTable)gvTest.DataSource;   
            
if (dt.Rows.Count >= 2)   
            {   
                
//定义一个EXCEL生成类   
                Cls_Templete Obj_Templete;   
  
                String[] columns 
= new String[4];   
                String[] columns1 
= new String[0];   
                columns[
0= "Example for export Excel!";   
                columns[
1= "8,1";   
                columns[
2= "Here we will use two function to export the data!";   
                columns[
3= (dt.Rows.Count + 11).ToString() + ",1";   
                
//为EXCEL生成类赋初值   
                Obj_Templete = new Cls_Templete("ExcelMaster.xls""ExportOne.xls", dt, columns, Server.MapPath("img/logo.jpg"), "A""C", columns1);   
                
//生成并下载EXCEL文件   
                Obj_Templete.ToExcel(101true);   
                
//清空对象   
                Obj_Templete = null;   
                dt.Dispose();   
            }   
            gvTest.AllowPaging 
= true;   
        }   
  
        
protected void btnExportTh_Click(object sender, EventArgs e)   
        {   
            HSSFWorkbook hssfworkbook 
= new HSSFWorkbook();//初始化一个新的HSSFWorkbook实例   
  
  
            
//#region 1.创建一个空的Excel   
            ////*************************************创建一个空的Excel******************************************   
            
////HSSFSheet sheet = hssfworkbook.CreateSheet("new sheet");   
            
////hssfworkbook.CreateSheet("Sheet1");//必须加入创建Sheet的代码才能保证生成的文件正常(如果需要多个,用同样的方法,换个名字就可以了)   
            //#endregion   
  
  
            
//#region 2.创建单元格   
            ////*************************************创建单元格******************************************   
            
////要创建单元格首先要创建单元格所在的行,比如,下面的代码创建了第0行:   
            //HSSFSheet sheet = hssfworkbook.CreateSheet("Sheet1");   
            
//HSSFRow row1=sheet.CreateRow(0);//设置单元格行位置   
            ////行建好了,就可以建单元格了,比如创建A1位置的单元格:   
            //row1.CreateCell(0).SetCellValue("Just for Test");//设置单元格列位置,并填写参数   
            ////这里要说明一下,SetCellValue有好几种重载,你可以设置单元格为bool、double、DateTime、string和HSSFRichTextString类型。   
            
////其中对于string类型的重载调用的就是HSSFRichTextString类型的重载,所以是一样的,HSSFRichTextString可用于有字体或者Unicode的文本。   
  
            
////如果你觉得每一行要声明一个HSSFRow很麻烦,可以用下面的方式:   
            
////sheet1.CreateRow(0).CreateCell(0).SetCellValue("This is a Sample");   
            
////这么用有个前提,那就是第0行还没创建过,否则得这么用:   
            
////sheet1.GetRow(0).CreateCell(0).SetCellValue("This is a Sample");   
            
////注意:这里的行在Excel里是从1开始的,但是NPOI内部是从0开始的;   
            
////列在Excel里面是用字母表示的,而NPOI中也是用从0开始的数字表示的,所以要注意转换。   
            
////如果你要获得某一个已经创建的单元格对象,可以用下面的代码:   
            
////sheet1.GetRow(row_index).GetCell(column_index);   
            //#endregion   
  
  
            
//#region 3.创建批注   
            ////**************************************创建批注******************************************   
            
////批注的位置和大小,在Excel中是与单元格密切相关的,NPOI中通过HSSFClientAnchor的实例来表示,它的构造函数比较复杂,有8个参数,它们分别是   
            
////dx1 第1个单元格中x轴的偏移量    
            
////dy1 第1个单元格中y轴的偏移量    
            
////dx2 第2个单元格中x轴的偏移量    
            
////dy2 第2个单元格中y轴的偏移量    
            
////col1 第1个单元格的列号    
            
////row1 第1个单元格的行号    
            
////col2 第2个单元格的列号    
            
////row2 第2个单元格的行号    
  
            
////如果我们打算让注释显示在B3和E5之间,就应该这么写:   
            //HSSFPatriarch patr = sheet.CreateDrawingPatriarch();   
            
//HSSFComment comment1 = patr.CreateComment(new HSSFClientAnchor(0, 0, 0, 0, 1, 2 , 4, 4));   
            ////下面我们设置这个批注的内容和作者,这个比较简单:   
            //comment1.String = new HSSFRichTextString("Hello World");   
            
//comment1.Author = "NPOI Team";   
            ////最后一步就是把批注赋给某个单元格:   
            //HSSFCell cell = sheet.CreateRow(1).CreateCell(0);   
            
//cell.CellComment = comment1;   
            ////对于批注,你有两种选择,一种是隐藏(默认),一种是显示(即表单一打开就显示该批注),可以通过comment1.Visible属性来控制。   
            //#endregion   
  
  
            
//#region 4.设置单元格格式   
            ////**************************************设置单元格格式******************************************   
            
////使用NPOI时要注意,所有的格式都是通过CellStyle.DataFormat赋给单元格的,而不是直接赋给单元格。   
  
  
            
////案例一  日期格式   
            
////假设我们现在需要显示的日期的格式为2008年5月5日,可以用下面的代码生成:   
            
////HSSFSheet sheet1 = hssfworkbook.CreateSheet("new sheet");   
            //HSSFCell cell0 = sheet.CreateRow(2).CreateCell(0);   
            
//cell0.SetCellValue(new DateTime(2008,5,5));   
            ////set date format   
            //HSSFCellStyle cellStyle = hssfworkbook.CreateCellStyle();   
            
//HSSFDataFormat format = hssfworkbook.CreateDataFormat();   
            
//cellStyle.DataFormat = format.GetFormat("yyyy年m月d日");   
            
//cell0.CellStyle=cellStyle;   
            ////由于这里的“yyyy年m月d日”属于自定义格式(区别于Excel内嵌的格式),   
            
////所以必须用hssfworkbook.CreateDataFormat()创建一个HSSFDataFormat实例,然后使用format.GetFormat来获取相应的格式,   
            
////只要是Excel支持的格式表示方式,这种方式都能够实现。   
  
  
            
////案例二 保留2位小数   
            
////假设我们有个单元格的值为1.2,怎么显示成1.20呢?在Excel中可以用“0.00”来表示,所以下面的代码就能完成:   
            
//// Create a row and put some cells in it. Rows are 0 based.   
            //HSSFCell cell1 = sheet.CreateRow(2).CreateCell(1);   
            ////set value for the cell   
            //cell1.SetCellValue(1.2);   
            ////number format with 2 digits after the decimal point - "1.20"   
            //HSSFCellStyle cellStyle1 = hssfworkbook.CreateCellStyle();   
            
//cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00");   
            
//cell.CellStyle = cellStyle;   
            ////这里与上面有所不同,用的是HSSFDataFormat.GetBuiltinFormat()方法,之所以用这个,是因为0.00是Excel内嵌的格式,   
            
////完整的Excel内嵌格式列表大家可以看EXCEL---设置单元格格式------数字   
  
  
            
////案例三 货币格式   
            
////货币格式在金融的项目中经常用到,比如说人民币符号¥,美元符号$等,这里可以用下面的代码表示:   
            //HSSFCell cell2 = sheet.CreateRow(2).CreateCell(2);   
            
//cell2.SetCellValue(20000);   
            
//HSSFCellStyle cellStyle2 = hssfworkbook.CreateCellStyle();   
            
//HSSFDataFormat format2 = hssfworkbook.CreateDataFormat();   
            
//cellStyle2.DataFormat = format.GetFormat("¥#,##0");   
            
//cell2.CellStyle = cellStyle2;   
            ////注意,这里还加入了千分位分隔符,所以是#,##,至于为什么这么写,你得去问微软,呵呵。   
  
  
            
////案例四 百分比   
            
////百分比在报表中也很常用,其实基本上和上面一样,只是格式表示是0.00%,代码如下:   
            //HSSFCell cell3 = sheet.CreateRow(2).CreateCell(3);   
            
//cell3.SetCellValue(50);   
            
//HSSFCellStyle cellStyle3 = hssfworkbook.CreateCellStyle();   
            
//cellStyle3.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00%");   
            
//cell3.CellStyle = cellStyle3;   
            ////由于这里是内嵌格式,所以直接用HSSFDataFormat.GetBuiltinFormat即可。   
  
  
            
////案例五 中文大写   
            
////在表示金额时,我们时常会用到,我也见过不少兄弟实现了数字转中文大小写的工具类,以后你可以尝试让Excel去处理这一切,   
            
////代码和刚才差不多,也是改格式的表示:   
            //HSSFCell cell4 = sheet.CreateRow(2).CreateCell(4);   
            
//cell4.SetCellValue("共和国");   
            
//HSSFCellStyle cellStyle4 = hssfworkbook.CreateCellStyle();   
            
//HSSFDataFormat format4 = hssfworkbook.CreateDataFormat();   
            
//cellStyle4.DataFormat = format.GetFormat("[DbNum2][$-804]0");   
            
//cell4.CellStyle = cellStyle4;   
            ////由于是自定义格式,所以用了HSSFDataFormat.GetFormat,相信你对这两种获取格式的形式的区别越来越熟悉了。   
  
  
            
////案例六 科学计数法   
            
////这东西数学课上我们都学过,虽然用的不多,但是既然Excel支持,这里也提一下:   
            
////cellStyle3.DataFormat = HSSFDataFormat.GetBuiltinFormat("0.00E+00");   
  
  
  
            
///*最后总结一下HSSFDataFormat.GetFormat和HSSFDataFormat.GetBuiltinFormat的区别:   
  
            
//当使用Excel内嵌的(或者说预定义)的格式时,直接用HSSFDataFormat.GetBuiltinFormat静态方法即可。   
  
            
//当使用自己定义的格式时,必须先调用HSSFWorkbook.CreateDataFormat(),因为这时在底层会先找有没有匹配的内嵌FormatRecord,   
            
//如果没有就会新建一个FormatRecord,所以必须先调用这个方法,然后你就可以用获得的HSSFDataFormat实例的GetFormat方法了,   
            
//当然相对而言这种方式比较麻烦,所以内嵌格式还是用HSSFDataFormat.GetBuiltinFormat静态方法更加直接一些。   
            
//不过自定义的格式也不是天马行空随便定义,还是要参照Excel的格式表示来定义,具体请看相关的Excel教程。   
  
            
//注意:自定义的FormatRecord是嵌入xls文件内部的,所以不用担心对方Excel中有没有定义过这种格式,都是能够正常使用的。   
            
// */   
            
//#endregion   
  
  
            
//#region 5.单元格合并   
            ////*************************************单元格合并******************************************   
            
////为了实现这一功能,NPOI引入了新的概念,即Region,因为合并单元格,其实就是设定一个区域。下面说一下Region类的参数,Region总共有4个参数:   
            
////FirstRow 区域中第一个单元格的行号    
            
////FirstColumn 区域中第一个单元格的列号    
            
////LastRow 区域中最后一个单元格的行号    
            
////LastColumn 区域中最后一个单元格的列号    
  
            
////由于单元格的合并都是在表的基础上建立的,所以我们得先建Sheet:   
            
////HSSFWorkbook hssfworkbook = new HSSFWorkbook();   
            //HSSFSheet sheet5 = hssfworkbook.CreateSheet("单元格合并");   
            ////接下来我们根据实际场景来做一些演示。   
  
  
            
////场景一 标题行的合并   
            
////这种场景是最常见的,比如说我们要建立一张销售情况表,英文叫Sales Report   
            
////我们先设置居中和字体样式,这里我们采用20号字体,代码如下:   
            //HSSFRow row5 = sheet5.CreateRow(0);   
            
//HSSFCell cell5 = row5.CreateCell(0);   
            
//cell5.SetCellValue("Sales Report");   
            
//HSSFCellStyle style5 = hssfworkbook.CreateCellStyle();   
            
//style5.Alignment = HSSFCellStyle.ALIGN_CENTER;   
            
//HSSFFont font5 = hssfworkbook.CreateFont();   
            
//font5.FontHeight = 20*20;   
            
//style5.SetFont(font5);   
            
//cell5.CellStyle = style5;   
            ////要产生图中的效果,即把A1:F1这6个单元格合并,然后添加合并区域:   
            //sheet5.AddMergedRegion(new Region(0, 0, 0, 5));   
  
  
            
////场景二 多行合并   
            
////看完场景一,你可不要认为多行合并就需要一行一行做,其实也只需要一行代码,比如说我们要把C3:E5合并为一个单元格,那么就可以用下面的代码:   
            //sheet5.AddMergedRegion(new Region(2, 2, 4, 4));   
            ////提示 即使你没有用CreateRow和CreateCell创建过行或单元格,也完全可以直接创建区域然后把这一区域合并,   
            
////Excel的区域合并信息是单独存储的,和RowRecord、ColumnInfoRecord不存在直接关系。   
            //#endregion   
  
  
            
//#region 6.单元格对齐相关设置   
            ////*************************************单元格对齐相关设置******************************************   
            
////本节将围绕“对齐”选项卡中的设置展开,虽然实际上你会发现该选项卡中的很多设置和对齐没有什么关系。   
            
////首先我们用代码创建必要的单元格,代码如下:   
            
////HSSFWorkbook hssfworkbook = new HSSFWorkbook();   
            //HSSFSheet sheet6 = hssfworkbook.CreateSheet("单元格对齐相关设置");   
            
//HSSFRow row6 = sheet6.CreateRow(0);   
            
//row6.CreateCell(0).SetCellValue("Test");   
            ////这里我们假设在A0单元格中加入了文本Test。   
            
////请注意接下来我们要做的所有操作都是在CellStyle的基础上完成的,所以我们创建一个HSSFCellStyle:   
            //HSSFCellStyle style6 = hssfworkbook.CreateCellStyle();   
  
  
            
////水平对齐   
            
////这里用的是HSSFCellStyle.Alignment,默认值自然是常规,即HSSFCellStyle.ALIGN_GENERAL。   
            
////如果是左侧对齐就是   
            //style6.Alignment = HSSFCellStyle.ALIGN_LEFT;   
            ////如果是居中对齐就是   
            //style6.Alignment = HSSFCellStyle.ALIGN_CENTER;   
            ////如果是右侧对齐就是   
            //style6.Alignment = HSSFCellStyle.ALIGN_RIGHT;   
            ////如果是跨列举中就是   
            //style6.Alignment = HSSFCellStyle.ALIGN_CENTER_SELECTION;   
            ////如果是两端对齐就是   
            //style6.Alignment = HSSFCellStyle.ALIGN_JUSTIFY;   
            ////如果是填充就是   
            //style6.Alignment = HSSFCellStyle.ALIGN_Fill;   
            ////注意:以上选项仅当有足够的宽度时才能产生效果,不设置宽度恐怕看不出区别。   
  
  
            
////垂直对齐   
            
////这里用的是HSSFCellStyle.VerticalAlignment,默认值为居中,即HSSFCellStyle.VERTICAL_CENTER   
            
////如果是靠上就是   
            //style6.VerticalAlignment = HSSFCellStyle.VERTICAL_TOP;   
            ////如果是居中就是   
            //style6.VerticalAlignment = HSSFCellStyle.VERTICAL_CENTER;   
            ////如果是靠下就是   
            //style6.VerticalAlignment = HSSFCellStyle.VERTICAL_BOTTOM;   
            ////如果是两端对齐就是   
            //style6.VerticalAlignment = HSSFCellStyle.VERTICAL_JUSTIFY;   
            ////注意:以上选项仅当有足够的高度时才能产生效果,不设置高度恐怕看不出区别。   
  
  
            
////自动换行   
            
////自动换行翻译成英文其实就是Wrap的意思,所以这里我们应该用WrapText属性,这是一个布尔属性   
            //style6.WrapText = true;   
  
  
            
////文本缩进   
            
////这是一个不太引人注意的选项,所以这里给张图出来,让大家知道是什么,缩进说白了就是文本前面的空白,我们同样可以用属性来设置,   
            
////这个属性叫做Indention。   
            //style6.Indention = 3;   
                
  
            
////文本旋转   
            
////文本方向大家一定在Excel中设置过,上图中就是调整界面,主要参数是度数,那么我们如何在NPOI中设置呢?   
            //style6.Rotation=(short)90;   
            ////以上代码是把单元格A1中的文本逆时针旋转90度   
            
///*   
            // * 请注意,这里的Rotation取值是从-90到90,而不是0-180度。   
            
// * 最后别忘了把样式变量style赋给HSSFCellStyle.CellStyle,否则就前功尽弃了,呵呵!   
            
// * **/   
            
//#endregion   
  
  
            
//#region 7.设置单元格边框   
            ////*************************************设置单元格边框******************************************   
            
////边框和其他单元格设置一样也是在HSSFCellStyle上操作的,HSSFCellStyle有2种和边框相关的属性,分别是:   
            
////边框相关属性 说明 范例    
            
////Border+方向 边框类型 BorderTop, BorderBottom,BorderLeft, BorderRight    
            
////方向+BorderColor 边框颜色 TopBorderColor,BottomBorderColor, LeftBorderColor, RightBorderColor    
  
            
////其中边框类型分为以下几种:   
            
////边框范例图 对应的静态值    
            
////  HSSFCellStyle.BORDER_DOTTED    
            
////  HSSFCellStyle.BORDER_HAIR    
            
////  HSSFCellStyle.BORDER_DASH_DOT_DOT    
            
////  HSSFCellStyle.BORDER_DASH_DOT    
            
////  HSSFCellStyle.BORDER_DASHED    
            
////  HSSFCellStyle.BORDER_THIN    
            
////  HSSFCellStyle.BORDER_MEDIUM_DASH_DOT_DOT    
            
////  HSSFCellStyle.BORDER_SLANTED_DASH_DOT    
            
////  HSSFCellStyle.BORDER_MEDIUM_DASH_DOT    
            
////  HSSFCellStyle.BORDER_MEDIUM_DASHED    
            
////  HSSFCellStyle.BORDER_MEDIUM    
            
////  HSSFCellStyle.BORDER_THICK    
            
////  HSSFCellStyle.BORDER_DOUBLE    
            
////至于颜色那就很多了,全部在HSSFColor下面,如HSSFColor.GREEN, HSSFColor.RED,都是静态实例,可以直接引用。   
            
////下面我们假设我们要把一个单元格的四周边框都设置上,可以用下面的代码:   
  
            
//HSSFSheet sheet7 = hssfworkbook.CreateSheet("设置单元格边框");   
            //// Create a row and put some cells in it. Rows are 0 based.   
            //HSSFRow row7 = sheet7.CreateRow(1);   
            //// Create a cell and put a value in it.   
            //HSSFCell cell7 = row7.CreateCell(1);   
            //// Style the cell with borders all around.   
            //HSSFCellStyle style7 = hssfworkbook.CreateCellStyle();   
            
//style7.BorderBottom= HSSFCellStyle.BORDER_THIN;   
            
//style7.BorderLeft= HSSFCellStyle.BORDER_THIN;   
            
//style7.BorderRight= HSSFCellStyle.BORDER_THIN;   
            
//style7.BorderTop = HSSFCellStyle.BORDER_THIN ;   
            
//cell7.CellStyle= style7;   
            ////这段代码使用了最普通的细边框,使得这个单元格看上去像块空心砖头。   
            
////注意:这里我们没有设置边框的颜色,但这不会影响最终的效果,因为Excel会用默认的黑色给边框上色。   
            
////如果要设置颜色的话,也很简单,如下:   
            //style7.BottomBorderColor = HSSFColor.GREEN.index;   
            ////以上代码将底部边框设置为绿色,要注意,不是直接把HSSFColor.GREEN赋给XXXXBorderColor属性,而是把index的值赋给它。   
            //#endregion   
  
  
            
//#region 8.设置单元格字体   
            ////*************************************设置单元格字体******************************************   
            
////本节我们将继续使用NPOI来设置单元格格式,这一节我们主要讲如何设置“字体”。   
            
////在设置字体之前,我们首先要做的就是创建字体对象,这和创建数字格式很相似。   
  
            
//HSSFFont font8 = hssfworkbook.CreateFont();   
            ////这句话会在Excel文件内部创建相应的FontRecord,所以你不用客户因为自己机器上的Excel没有相应的字体设置而导致设置丢失。   
  
            
////字体在设置完成后,我们就可以把它赋给单元格样式,代码如下:   
            //HSSFSheet sheet8 = hssfworkbook.CreateSheet("设置单元格字体");   
            
//HSSFRow row8 = sheet8.CreateRow(0);   
            
//HSSFCell cell8 = row8.CreateCell(0);   
            
//HSSFCellStyle style8 = hssfworkbook.CreateCellStyle();   
            
//style8.SetFont(font8);   
            
//cell8.CellStyle=style8;   
            ////这里的cell1是HSSFCell的一个实例。   
  
            
////好了,下面我们就开始对字体进行设置。   
            
////字体名称   
  
  
            
////这里的字体名称是通过HSSFFont.FontName进行设置的,至于具体的名称,只要是常用字体都可以,比如说Arial, Verdana等   
            
////,当然也可以是中文字体名,如宋体、黑体等。不过设置字体名称有个前提,那就是假设打开这个xls文件的客户机上有这种字体   
            
////,如果没有,Excel将使用默认字体。   
            
////下面就是设置字体名称为“宋体”的代码:   
            //font8.FontName = "宋体";   
  
  
            
////字号   
            
////与字号有关的属性有两个,一个是FontHeight,一个是FontHeightInPoints。区别在于,FontHeight的值是FontHeightInPoints的20倍   
            
////,通常我们在Excel界面中看到的字号,比如说12,对应的是FontHeightInPoints的值,而FontHeight要产生12号字体的大小   
            
////,值应该是240。所以通常建议你用FontHeightInPoint属性。   
            
////如果要设置字号为12,代码就是   
            //font8.FontHeightInPoints = 12;   
                
  
            
////字体颜色   
            
////这里可能会与CellStyle上的ForegroundColor和BackgroundColor产生混淆,其实所有的字体颜色都是在HSSFFont的实例上设置的   
            
////,CellStyle的ForegroundColor和BackgroundColor分别指背景填充色和填充图案的颜色,和文本颜色无关。   
            
////要设置字体颜色,我们可以用HSSFFont.Color属性,颜色可以通过HSSFColor获得,代码如下所示:   
            //font8.Color = HSSFColor.RED.index;   
            ////这行代码把文本设置为红色。   
                
  
            
////下划线   
            
////通常我们所说的下划线都是单线条的,其实Excel支持好几种下划线,如下所示:   
            
////类型 对应的值    
            
////单下划线 HSSFFont.U_SINGLE    
            
////双下划线 HSSFFont.U_DOUBLE    
            
////会计用单下划线 HSSFFont.U_SINGLE_ACCOUNTING    
            
////会计用双下划线 HSSFFont.U_DOUBLE_ACCOUNTING    
            
////无下划线 HSSFFont.U_NONE    
            
////当你要设置下划线时,可以用HSSFFont.Underline属性,这是一个byte类型的值,例如   
            //font8.Underline = HSSFFont.U_SINGLE;   
            ////这行代码就是设置单下划线的代码。   
  
  
            
////上标下标   
            
////设置这东西可以用HSSFFont.TypeOffset属性,值有以下几种:   
            
////TypeOffset的值 说明    
            
////HSSFFont.SS_SUPER 上标    
            
////HSSFFont.SS_SUB 下标    
            
////HSSFFont.SS_NONE 普通,默认值    
            
////所以如果你要上标的话,可以用下面的代码:   
            //font8.TypeOffset=HSSFFont.SS_SUPER;   
  
  
            
////删除线   
            
////设置这东西可以用HSSFFont.IsStrikeout属性,当为true时,表示有删除线;为false则表示没有删除线。   
            //#endregion   
  
  
            
//#region 9.设置单元格的背景和图案   
            ////*************************************设置单元格的背景和图案******************************************   
            
////在之前的教程中,我们已经提到HSSFCellStyle有两个背景颜色属性,一个叫FillBackgroundColor,另一个叫FillForegroundColor   
            
////,但其实这指的都是背景颜色,那为什么还有ForegroundColor呢?为了能够帮助大家理解,我们举一个实际的例子   
            
////,下面这个图案是Excel的一个单元格:(白线红格的网格)   
            
////线是白色的,背景是红色的。这里的线其实就是下面的Excel界面中的图案:   
            
////至于线的颜色则是图案颜色,即白色。   
            
////所以以上单元格如果要用NPOI来设置就可以用以下代码完成:   
            
////fill background   
            //HSSFSheet sheet9 = hssfworkbook.CreateSheet("设置单元格的背景和图案");   
            
//HSSFCellStyle style9 = hssfworkbook.CreateCellStyle();   
            
//style9.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.WHITE.index;   
            
//style9.FillPattern = HSSFCellStyle.SQUARES;   
            
//style9.FillBackgroundColor = NPOI.HSSF.Util.HSSFColor.RED.index;   
            
//sheet9.CreateRow(7).CreateCell(0).CellStyle = style9;   
            ////现在是不是清楚一些了,这里的FillPattern就图案样式,所有的枚举值都是HSSFCellStyle的常量;FillForegroundColor就是图案的颜色   
            
////,而FillBackgroundColor则是背景的颜色,即红色。   
            //#endregion   
  
  
            
//#region 10.设置单元格的宽度和高度   
            ////*************************************设置单元格的宽度和高度******************************************   
            
////在Excel中,单元格的宽度其实就是列的宽度,因为Excel假设这一列的单元格的宽度肯定一致。所以要设置单元格的宽度   
            
////,我们就得从列的宽度下手,HSSFSheet有个方法叫SetColumnWidth,共有两个参数:一个是列的索引(从0开始),一个是宽度。   
            
////现在假设你要设置B列的宽度,就可以用下面的代码:   
            
////HSSFWorkbook hssfworkbook = new HSSFWorkbook();   
            //HSSFSheet sheet10 = hssfworkbook.CreateSheet("设置单元格的宽度和高度");   
            
//sheet10.SetColumnWidth(1, 100 * 256);   
            ////这里你会发现一个有趣的现象,SetColumnWidth的第二个参数要乘以256,这是怎么回事呢?其实,这个参数的单位是1/256个字符宽度   
            
////,也就是说,这里是把B列的宽度设置为了100个字符。   
            
////刚才说的是如何设置,那如何去读取一个列的宽度呢?直接用GetColumnWidth方法,这个方法只有一个参数,那就是列的索引号。如下所示:   
            //int col1width = sheet10.GetColumnWidth(1);   
            ////说完宽度,我们来说高度,在Excel中,每一行的高度也是要求一致的,所以设置单元格的高度,其实就是设置行的高度   
            
////,所以相关的属性也应该在HSSFRow上,它就是HSSFRow.Height和HeightInPoints,这两个属性的区别在于HeightInPoints的单位是点   
            
////,而Height的单位是1/20个点,所以Height的值永远是HeightInPoints的20倍。   
            
////要设置第一行的高度,可以用如下代码:   
            //sheet10.CreateRow(0).Height = 200*20;   
            ////或者   
            //sheet10.CreateRow(0).HeightInPoints = 200;   
            ////如果要获得某一行的行高,可以直接拿HSSFRow.Height属性的返回值。   
            
////你可能觉得一行一行设置行高或者一列一列设置列宽很麻烦,那你可以考虑使用HSSFSheet.DefaultColumnWidth   
            
////、HSSFSheet.DefaultRowHeight和HSSFSheet.DefaultRowHeightInPoints属性。   
            
////一旦设置了这些属性,如果某一行或者某一列没有设置宽度,就会使用默认宽度或高度。代码如下:   
            //sheet10.DefaultColumnWidth=100*256;   
            
//sheet10.DefaultRowHeight=30*20;   
            
//#endregion   
  
  
            
////把HSSFWorkbook实例写入文件   
            //FileStream file = new FileStream(Server.MapPath("test.xls"), FileMode.Create);   
            
//hssfworkbook.Write(file);   
            
//file.Close();   
  
  
            
//*************************************基于模板******************************************   
            
//read the template via FileStream, it is suggested to use FileAccess.Read to prevent file lock.   
            
//book1.xls is an Excel-2007-generated file, so some new unknown BIFF records are added.    
            FileStream file11 = new FileStream(Server.MapPath("PayMain.xls"), FileMode.Open, FileAccess.Read);   
  
            HSSFWorkbook hssfworkbook11 
= new HSSFWorkbook(file11);   
            HSSFSheet sheet11 
= hssfworkbook11.GetSheet("Sheet2");   
            HSSFCellStyle style11 
= hssfworkbook11.CreateCellStyle();   
            style11.BorderBottom 
= HSSFCellStyle.BORDER_THIN;   
            style11.BorderLeft 
= HSSFCellStyle.BORDER_THIN;   
            style11.BorderRight 
= HSSFCellStyle.BORDER_THIN;   
            style11.BorderTop 
= HSSFCellStyle.BORDER_THIN;   
            HSSFRow row11;   
            
for (int i = 0; i < dt.Rows.Count; i++)   
            {   
                row11 
= sheet11.CreateRow(7 + i);   
                
for (int j = 0; j < 6; j++)   
                {   
                    HSSFCell cell11 
= row11.CreateCell(j);   
                    cell11.SetCellValue(dt.Rows[i][j].ToString());   
                    cell11.CellStyle 
= style11;   
                }   
            }   
  
            row11 
= sheet11.CreateRow(dt.Rows.Count + 7);   
            HSSFCell cell11_ 
= row11.CreateCell(0);   
            cell11_.SetCellValue(
"合计:");   
            cell11_ 
= row11.CreateCell(3);   
            cell11_.SetCellValue(
"建表人:");   
            
//HSSFRow row11 = sheet11.CreateRow(7);   
            
//HSSFCell cell10 = row11.CreateCell(0);   
            
//HSSFCell cell11 = row11.CreateCell(1);   
            
//HSSFCell cell12 = row11.CreateCell(2);   
            
//HSSFCell cell13 = row11.CreateCell(3);   
            
//HSSFCell cell14 = row11.CreateCell(4);   
            
//HSSFCell cell15 = row11.CreateCell(5);   
            
//cell10.SetCellValue("tessssss");   
            
//cell11.SetCellValue("teffffff");   
            
//cell12.SetCellValue("tegggggsss");   
            
//cell13.SetCellValue("tesssssfwefsss");   
            
//cell14.SetCellValue("tesssssfwefsss");   
            
//cell15.SetCellValue("tesssssfwefsss");   
            
//sheet11.GetRow(9).GetCell(0).SetCellValue(300);   
            
//sheet11.GetRow(10).GetCell(1).SetCellValue(500050);   
            
//sheet11.GetRow(11).GetCell(1).SetCellValue(8000);   
            
//sheet11.GetRow(12).GetCell(1).SetCellValue(110);   
            
//sheet11.GetRow(13).GetCell(1).SetCellValue(100);   
            
//sheet11.GetRow(14).GetCell(1).SetCellValue(200);   
            
//sheet11.GetRow(15).GetCell(1).SetCellValue(210);   
            
//sheet11.GetRow(16).GetCell(1).SetCellValue(2300);   
            
//sheet11.GetRow(17).GetCell(1).SetCellValue(240);   
            
//sheet11.GetRow(18).GetCell(1).SetCellValue(180123);   
            
//sheet11.GetRow(19).GetCell(1).SetCellValue(150);   
  
            
//Force excel to recalculate all the formula while open   
            Response.ContentType = "application/vnd.ms-excel";   
            Response.AddHeader(
"Content-Disposition"string.Format("attachment;filename={0}""T3"));   
            Response.Clear();   
  
            DocumentSummaryInformation dsi 
= PropertySetFactory.CreateDocumentSummaryInformation();   
            dsi.Company 
= "NPOI Team";   
            hssfworkbook.DocumentSummaryInformation 
= dsi;   
  
            
////create a entry of SummaryInformation   
            SummaryInformation si = PropertySetFactory.CreateSummaryInformation();   
            si.Subject 
= "NPOI SDK Example";   
            hssfworkbook11.SummaryInformation 
= si;   
  
            MemoryStream file 
= new MemoryStream();   
            hssfworkbook11.Write(file);   
            Response.BinaryWrite(file.GetBuffer());   
            Response.End();   
  
  
  
            
//sheet11.ForceFormulaRecalculation = true;    
            
//FileStream file111 = new FileStream(Server.MapPath("T2.xls"), FileMode.Create);    
            
//hssfworkbook11.Write(file111);   
            
//file111.Close();   
        }  
        
#endregion   
    }   
}  
如果只是导出数据那么用方法一就可以了

如果需要加图片什么的,那么就用方法二吧,但方法二通常会牵涉到权限问题,

所以最终推荐方法三(NPOI),注意:方法三中本人为了导出图片所以使用了EXCEL母板(就是自己先写一个空的EXCEL里面放些表头),另外方法三中的SAVE AS可能有些朋友不怎么会,可以参考一下!方法三,已近写的很详细了,注释掉的都是一些细微的方法值得一看。非常感谢CSDN_gwf25sz(郭文峰)的分享

 

转载于:https://www.cnblogs.com/mikechang/archive/2009/10/10/1580258.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值