NPOI对excel文件的导入导出
现理解:将一个Excel文件(工作簿-IWorkBook)看做是一个你要操作的对象,每个工作簿包含多个工作表(ISheet)对象,每个工作表中又包含多个行对象(IRow),每行又包含多个单元格(ICell)对象. 单元格里存储相应数据
下面帮助更直观的展示:IWorkBook --> ISheet --> IRow --> ICell
一:从数据库中将符合条件的数据导出到一个新的Excel中
思路:
0.ado获取导入内容
1.创建一个IWorkBook对象.我们最终将把这个设置好的IworkBook对象写入到一个文件流中,即大功告成.
2.创建这个IWorkBook的ISheet对象.
3.创建这个ISheet的IRow对象.
4.创建IRow的ICell对象,并设置数据库里相应的值
注:SqlHelper将不再附上

//将数据库中的表的数据导出到Execel表中 string sqlstr = "select * from T_Scripts"; using (SqlDataReader dr = SqlHelper.ExecuteReader(sqlstr)) { if (dr.HasRows) { IWorkbook wb = new HSSFWorkbook(); ISheet sheet = wb.CreateSheet("Customers"); IRow title = sheet.CreateRow(0); //添加列名行 for (int i = 0; i < dr.FieldCount; i++) //dr.FieldCount获得当前行的列数 { title.CreateCell(i).SetCellValue(dr.GetName(i)); } int n = 1; while (dr.Read()) { IRow dataRow = sheet.CreateRow(n); for (int i = 0; i < dr.FieldCount; i++) { switch (dr[i].GetType().ToString()) { case "System.Int32": dataRow.CreateCell(i).SetCellValue(dr.GetInt32(i)); break; case "System.String": dataRow.CreateCell(i).SetCellValue(dr.GetString(i)); break; case "System.DBNull": dataRow.CreateCell(i).SetCellValue("null"); break; case "System.DateTime": //dataRow.CreateCell(i).SetCellValue(); ICell cel = dataRow.CreateCell(i); cel.SetCellValue(dr.GetDateTime(i)); //设置单元格格式 ICellStyle cs = wb.CreateCellStyle(); IDataFormat df = wb.CreateDataFormat(); cs.DataFormat = df.GetFormat("yyyy-mm-dd"); cel.CellStyle = cs; break; default: break; } } n++; } //将IWorkBook对象写入到文件流中 using (FileStream fs = File.Create("d:/tscript.xls")) { wb.Write(fs); } MessageBox.Show("out success!"); } }
二:将Excel文件中的内容录入到数据库中
思路:
0.打开一个Excel文件流.
1.将这个流附加到新建的一个IWorkBook对象上.此时已经拿到这个文件的对象
2.获取这个工作簿的ISheet对象
3.获取ISheet的IROw对象
4.进行ado操作,将每行的数据以此添加到数据库表中

1 string sqlstr = "insert into T_Customers ( CC_CustomerName, CC_CellPhone, CC_Landline, CC_CarNum, CC_BracketNum, CC_BuyDate) values (@name,@phone,@sphone,@carnum,@bk,@date)"; 2 //将要录入数据库的xls通过流的方式传给一个IWorkBook对象 3 using (FileStream infs = File.Open(@"客户资料new.xls", FileMode.Open)) 4 { 5 IWorkbook inwb = new HSSFWorkbook(infs); 6 //获取工作簿每行内容 7 ISheet sheet1 = inwb.GetSheetAt(0); 8 for (int i = 1; i <= sheet1.LastRowNum; i++)//从数据行开始读取即索引为1的行; lastrownum获取的是最后一行的索引即 行数-1 9 { 10 IRow datarow = sheet1.GetRow(i); 11 //每次循环都新建一个sqlparameter数组 12 SqlParameter[] spt = new SqlParameter[] { 13 new SqlParameter("@name",SqlDbType.NVarChar), 14 new SqlParameter("@phone",SqlDbType.NVarChar), 15 new SqlParameter("@sphone",SqlDbType.NVarChar), 16 new SqlParameter("@carnum",SqlDbType.NVarChar), 17 new SqlParameter("@bk",SqlDbType.NVarChar), 18 new SqlParameter("@date",SqlDbType.DateTime) 19 }; 20 for (int j = 0; j < datarow.LastCellNum; j++) 21 { 22 ICell cell = datarow.GetCell(j); 23 if (cell!=null) 24 { 25 spt[j].Value = cell.ToString();//添加参数 26 } 27 else 28 { 29 spt[j].Value = DBNull.Value; 30 } 31 } 32 SqlHelper.ExecuteNonquery(sqlstr, spt);//插入到数据库表中的相应列 33 } 34 } 35 MessageBox.Show("access!");
不同版本的NOPI编程貌似有些不同