zoukankan      html  css  js  c++  java
  • 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集合,对数据进行循环遍历操作。

  • 相关阅读:
    MySQL权限整理及授权命令
    netstat
    5.7.20 多实例——MGR部署实战
    ELK(V7)部署与架构分析
    服务器安全之iptables
    记一次MySQL中Waiting for table metadata lock的解决方法
    MySQL在线DDL gh-ost 使用说明
    如何只查看配置文件中未被注释的有效配置行
    nginx的http负载均衡
    nginx实现正向代理和反向代理
  • 原文地址:https://www.cnblogs.com/xsh-cs/p/7492662.html
Copyright © 2011-2022 走看看