NPOI的使用

NPOI:  对Excel表数据的导入导出(当然也有word之类,不过一般用途为Excel)

准备:  下载NPOI相关文件,http://npoi.codeplex.com  解压,添加项目对:NPOI.dll、NPOI.OOXML.dll、NPOI.OpenXml4Net.dll 的引用,这个涉及到office版本的支持问题,

     office2003版本或更早的excel文件为: .xls  而2010的为  .xlsx ,支持2010版本的工作簿对象要为 XSSFWorkbook,这个同时也对前版本的支持,而HSSFWorkbook工作簿对象不支持2010版本或更新版本。

 

NPOI的用法:

 

 1、写入到excel工作表

IWorkbook wk = new XSSFWorkbook();  //创建一个工作簿的对象

ISheet sheet = wk.CreateSheet("sheetName");    //创建一个工作表

-->从数据库的一张表中导入数据到excel表举例

           //读取数据,给工作表添加行
           using (SqlDataReader reader = SqlHelper.ExcuteReader(sql))
            {
                if (reader.HasRows)
                {

                    //创建第一行,表示列名
                    IRow rowHead = sheet.CreateRow(0);   //第一行

                    for (int i = 0; i < reader.FieldCount; i++)                //获取列数
                    {
                        rowHead.CreateCell(i).SetCellValue(reader.GetName(i));  
                    }

                    int index = 1;
                    while (reader.Read())
                    {
                        //读取到一行,在excel中创建一行
                        IRow currentRow = sheet.CreateRow(index);
                        index++;
                     
                       //创建一个单元格
                        currentRow.CreateCell(0).SetCellValue(int.Parse(reader["UserId"].ToString()));
                        currentRow.CreateCell(1).SetCellValue(reader["UserName"].ToString());
                        currentRow.CreateCell(2).SetCellValue(reader["UserPwd"].ToString());//currentRow.CreateCell(3).SetCellValue(DateTime.Parse(reader["UserTime"].ToString()));

                         //创建一个单元格
                          ICell ic = currentRow.CreateCell(3);
                          //创建单元格样式
                          ICellStyle cellStyle = wk.CreateCellStyle();
                          cellStyle.DataFormat = HSSFDataFormat.GetBuiltinFormat("m/d/yyh:mm");

                          //设置当前单元格应用此样式
                          ic.CellStyle = cellStyle;
                          ic.SetCellValue(DateTime.Parse(reader["UserTime"].ToString()));
                        }
                    }
                }

 

-->写入到电脑磁盘中

            using (FileStream fsWrite = File.OpenWrite("new.xlsx"))
            {
                wk.Write(fsWrite);
            }
            //写入到电脑磁盘中,并命名为new.xlsx

 

 

2、从excel表中导出

-->导入到数据库:

         //创建一个读取execl表的流 ▲
            using (FileStream fsRead = File.OpenRead("workbookName.xlsx"))
            {
                //创建一个工作簿的对象▲
                IWorkbook wk = new XSSFWorkbook(fsRead);
                //遍历工作簿中的每一个工作表▲
                for (int i = 0; i < wk.NumberOfSheets; i++)
                {
                    //获取一个工作表的对象▲
                    ISheet sheet = wk.GetSheetAt(i);        //根据索引来获取
                                                          
                    //判断,如果该行存在才遍历

                    //写sql语句
                    string sql = "insert into Users (UserName,UserPwd,UserTime) values(@name,@pwd,@time)";

                    //遍历表中的行,这里要使用等于▲
                    for (int r = 1; r <=sheet.LastRowNum; r++)
                    {
                        //获取工作表中的每一行,如果该不为空才进行接下来的遍历

                        IRow row = sheet.GetRow(r);
                        SqlParameter[] parma = new SqlParameter[] {
                            new SqlParameter("@name", SqlDbType.NVarChar,16),
                            new SqlParameter("@pwd",SqlDbType.NVarChar,32),
                            new SqlParameter("@time",SqlDbType.DateTime)
                        };
                        if (row != null)
                        {
                            //遍历该行,获取每一个单元格▲
                            for (int c = 1; c < row.LastCellNum; c++)
                            {
                                //获取单元格▲
                                ICell cell = row.GetCell(c);
                                //判断,如果该单元格为空,则向数据库中插入DBNULL
                                if (cell == null || cell.CellType == CellType.Blank)
                                {
                                    parma[c - 1].Value = DBNull.Value;
                                }
                                else
                                {
                                    if (c == 3)
                                    {
                                        parma[c - 1].Value = DateTime.FromOADate(cell.NumericCellValue);

                                    }
                                    else
                                    {
                                        parma[c - 1].Value = cell.ToString();
                                     }
                                }
                            }
                        }
                      int n=  SqlHelper.ExcuteNonQuery(sql, parma); 
                    } 
                }
            }

 

总结:读取或者写入都需要一个流,然后都是创建工作簿对象,然后对应创建行,读取行,写入行,读取单元格,写入单元格,注意对excel行和单元格的遍历,根据逻辑对数据进行操作,

   有时候可以借助List集合,对数据进行循环遍历操作。

 

posted @ 2017-09-13 22:40  蓝色标记  阅读(273)  评论(0编辑  收藏  举报