NPOI 创建Excel,数据读取与写入

<1>

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.SS.Formula.Functions;
using System.IO;
using System.Text;


namespace 导入导出Excel
{
    /// <summary>
    /// Excel导入导出 的摘要说明
    /// </summary>
    public class Excel导入导出 : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            context.Response.ContentType = "application/x-excel";

            //------------------------------------------创建Excel,并将数据写入--------  



            HSSFWorkbook workbook = new HSSFWorkbook();//创建一个Excel文件    

            ISheet sheet = workbook.CreateSheet("Sheet1");//创建一个页   

            IRow row = sheet.CreateRow(0); //创建sheet页的第0行(索引从0開始)    

          
            row.CreateCell(0, CellType.String).SetCellValue("C罩杯");//创建第0行第0列string类型表格,并赋值"A罩杯"
            row.CreateCell(1, CellType.String).SetCellValue("D罩杯");//创建第0行第1列string类型表格,并赋值"B罩杯"
            row.CreateCell(2, CellType.String).SetCellValue("A罩杯");//创建第0行第2列string类型表格,并赋值"C罩杯"
            row.CreateCell(3, CellType.String).SetCellValue("F罩杯");//创建第0行第3列string类型表格,并赋值"D罩杯"
            row.CreateCell(18, CellType.Numeric).SetCellValue(5);  //创建第0行第17列Numeric类型表格,并赋值5

            //得到一个excel.xls文件的文件流 【开打指定路径下的文件,假设文件不存在则创建文件,并打开,以进行写入】    
            using (Stream stream = File.OpenWrite("d:/excel.xls"))
            {

                workbook.Write(stream); //将这个workbook文件写入到stream流中
            }






            //------------------------------------------读取Excel的数据-------------  


            using (Stream stream1 = File.OpenRead("d:/excel.xls"))
            {

                //读取workbook这个工作薄的第0个Sheet(GetSheetAt(0)),第0行(GetRow(0)),第0格(GetCell(0))的值                 
                //string s = workbook.GetSheetAt(0).GetRow(0).GetCell(0).StringCellValue;  

                int cellRows = sheet.LastRowNum;

                //获取workbook中sheet页的最后一行的行号【行号从0開始】
                int sheetRowCount = sheet.LastRowNum;

                //这个循环是获取shee1页中"全部的行中"具有"最多列"的"列数"
                int maxCellCount = 0;
                for (int i = sheet.FirstRowNum; i <= cellRows; i++) //遍历sheet页的全部的行
                {
                    row = sheet.GetRow(i); //获取当前行
                    if (row == null) ////这一句非常关键,由于没有数据的行默认是null 
                    {
                        continue; //既然当前行无数据那就结束本次循环,进行下次循环
                    }
                    else
                    {
                        int cellCount = row.LastCellNum;  //获取当前行的列数
                        if (cellCount > maxCellCount)    //假设当前行的列数大于"最大列数maxCellCount",那么我就将当前行的列数设置为最大的列数
                        {
                            maxCellCount = cellCount;  //for循环结束后,maxCellCount就得到了"全部的行中"具有"最多列"的"列数"
                        }
                    }
                }






                //-----------------创建一个新的Excel文件 workbook2工作薄,并将workbook的内容拷贝到workbook2中---------------------




                HSSFWorkbook workbook2 = new HSSFWorkbook();//创建一个workbook2工作薄,事实上就是我们常说的Excel文件    

                ISheet sheet2 = workbook2.CreateSheet("Sheet1");//为workbook2工作创建一个Sheet1页   



                //依据sheet页的总行数,来创建sheet2页的总行数  
                for (int i = 0; i <= cellRows; i++)
                {
                    row = sheet.GetRow(i);
                    if (row == null)  //假设数据源的当前行为null ,就结束本次循环,開始下次循环
                    {
                        continue;
                    }
                    else
                    {
                        sheet2.CreateRow(i); //否则就 创建workbook2中sheet2页的第i行
                    }

                    //依据shee1页的总列数,创建shee2页的总列数  
                    for (int j = 0; j < maxCellCount; j++)
                    {
                        ICell cell = row.GetCell(j);
                        if (cell != null)  //假设数据源的当前格不为null
                        {
                            if (cell.CellType == CellType.String) //cell.CellType是获取数据源当前格的数据类型,假设它的数据类型为String类型
                            {
                                string sourceCellValue = sheet.GetRow(i).GetCell(j).StringCellValue; //获取数据源当前格的值

                                //将这个值赋给workbook2中sheet2页的第i行,第j列
                                sheet2.GetRow(i).CreateCell(j, CellType.String).SetCellValue(sourceCellValue);
                            }

                            if (cell.CellType == CellType.Numeric) //假设数据源的当前格的类型为Numeric类型
                            {
                                double sourceCellValue = sheet.GetRow(i).GetCell(j).NumericCellValue;
                                sheet2.GetRow(i).CreateCell(j, CellType.Numeric).SetCellValue(sourceCellValue);
                            }

                        }



                    }

                }

                //开打指定路径下的文件,假设文件不存在则创建文件,并打开,以进行写入
                using (Stream stream = File.OpenWrite("d:/excel2.xls"))
                {
                    workbook2.Write(stream);  //将这个workbook2文件写入到stream流中    
                }

                context.Response.Write("OK");  //提示OK
            }


        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}




using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.SS.Formula.Functions;
using System.IO;
using System.Text;


namespace 导入导出Excel
{
    /// <summary>
    /// Excel导入导出 的摘要说明
    /// </summary>
    public class Excel导入导出 : IHttpHandler
    {

        public void ProcessRequest(HttpContext context)
        {
            //context.Response.ContentType = "application/x-excel";
            string name = HttpUtility.UrlEncode("Excel文件.xls"); //给要下载的文件命名为Excel文件.xls

            context.Response.AddHeader("Content-disposition", "attachment; filename="+name);//加入�下面载文件的形式打开文件的报文头
           

            //------------------------------------------创建Excel,并将数据写入--------  



            HSSFWorkbook workbook = new HSSFWorkbook();//创建一个Excel文件    

            ISheet sheet = workbook.CreateSheet("Sheet1");//创建一个页   

            IRow row = sheet.CreateRow(0); //创建sheet页的第0行(索引从0開始)    

          
            row.CreateCell(0, CellType.String).SetCellValue("C罩杯");//创建第0格
            row.CreateCell(1, CellType.String).SetCellValue("D罩杯");//创建第二格并为赋值
            row.CreateCell(2, CellType.String).SetCellValue("A罩杯");//创建第三格并为赋值
            row.CreateCell(3, CellType.String).SetCellValue("F罩杯");//创建第四格并为赋值
            row.CreateCell(18, CellType.Numeric).SetCellValue(5);//创建第17格并为赋值

            //得到一个excel.xls文件的文件流 【开打指定路径下的文件,假设文件不存在则创建文件,并打开,以进行写入】    
            using (Stream stream = File.OpenWrite("d:/excel.xls"))
            {

                workbook.Write(stream); //将这个workbook文件写入到stream流中
            }






            //------------------------------------------读取Excel的数据-------------  


            using (Stream stream1 = File.OpenRead("d:/excel.xls"))
            {

                //读取workbook这个工作薄的第0个Sheet(GetSheetAt(0)),第0行(GetRow(0)),第0格(GetCell(0))的值                 
                //string s = workbook.GetSheetAt(0).GetRow(0).GetCell(0).StringCellValue;  

                int cellRows = sheet.LastRowNum;

                //获取workbook中sheet页的最后一行的行号【行号从0開始】
                int sheetRowCount = sheet.LastRowNum;

                //这个循环是获取shee1页中"全部的行中"具有"最多列"的"列数"
                int maxCellCount = 0;
                for (int i = sheet.FirstRowNum; i <= cellRows; i++) //遍历sheet页的全部的行
                {
                    row = sheet.GetRow(i); //获取当前行
                    if (row == null) ////这一句非常关键,由于没有数据的行默认是null 
                    {
                        continue; //既然当前行无数据那就结束本次循环,进行下次循环
                    }
                    else
                    {
                        int cellCount = row.LastCellNum;  //获取当前行的列数
                        if (cellCount > maxCellCount)    //假设当前行的列数大于"最大列数maxCellCount",那么我就将当前行的列数设置为最大的列数
                        {
                            maxCellCount = cellCount;  //for循环结束后,maxCellCount就得到了"全部的行中"具有"最多列"的"列数"
                        }
                    }
                }






                //-----------------创建一个新的Excel文件 workbook2工作薄,并将workbook的内容拷贝到workbook2中---------------------




                HSSFWorkbook workbook2 = new HSSFWorkbook();//创建一个workbook2工作薄,事实上就是我们常说的Excel文件    

                ISheet sheet2 = workbook2.CreateSheet("Sheet1");//为workbook2工作创建一个Sheet1页   



                //依据sheet页的总行数,来创建sheet2页的总行数  
                for (int i = 0; i <= cellRows; i++)
                {
                    row = sheet.GetRow(i);
                    if (row == null)  //假设数据源的当前行为null ,就结束本次循环,開始下次循环
                    {
                        continue;
                    }
                    else
                    {
                        sheet2.CreateRow(i); //否则就 创建workbook2中sheet2页的第i行
                    }

                    //依据shee1页的总列数,创建shee2页的总列数  
                    for (int j = 0; j < maxCellCount; j++)
                    {
                        ICell cell = row.GetCell(j);
                        if (cell != null)  //假设数据源的当前格不为null
                        {
                            if (cell.CellType == CellType.String) //cell.CellType是获取数据源当前格的数据类型,假设它的数据类型为String类型
                            {
                                string sourceCellValue = sheet.GetRow(i).GetCell(j).StringCellValue; //获取数据源当前格的值

                                //将这个值赋给workbook2中sheet2页的第i行,第j列
                                sheet2.GetRow(i).CreateCell(j, CellType.String).SetCellValue(sourceCellValue);
                            }

                            if (cell.CellType == CellType.Numeric) //假设数据源的当前格的类型为Numeric类型
                            {
                                double sourceCellValue = sheet.GetRow(i).GetCell(j).NumericCellValue;
                                sheet2.GetRow(i).CreateCell(j, CellType.Numeric).SetCellValue(sourceCellValue);
                            }

                        }



                    }

                }

                workbook2.Write(context.Response.OutputStream); //将文件写入到一个context的输出流中,在用户的浏览器中显示出来,注意,我在开头加入�了一个context.Response.AddHeader("Content-disposition", "attachment; filename="+name);报文头。意思是让它下面载文件的形式打开



                //开打指定路径下的文件,假设文件不存在则创建文件,并打开,以进行写入
                //using (Stream stream = File.OpenWrite("d:/excel2.xls"))
                //{
                //    workbook2.Write(stream);  //将这个workbook2文件写入到stream流中    
                //}

                context.Response.Write("OK");  //提示OK
            }


        }

        public bool IsReusable
        {
            get
            {
                return false;
            }
        }
    }
}


posted @ 2014-10-09 20:04  hrhguanli  阅读(1305)  评论(0编辑  收藏  举报