首先先了解下一个Excel文件的组成
1.一个Excel包含多个工作表(Sheet)
2.一个工作表(Sheet)包含多行(Row)
3.一行(Row)包含多个单元格(Cell)
如何判断一个单元格中的数据是数字类型,还是字符串类型?
字符串在左边,数值类型在右边 如果单元格式string类型,则用ToString() |
工具准备:
两个程序集NOPI.dll和Ionic.Zip.dll
对以上程序集的介绍
描述工作簿的类型:IWorkbook(接口),HSSFWorkbook(具体实现类)
描述工作表的类型:ISheet(接口),HSSFSheet(具体实现类)
1.读取Excel中文件
Student.xls文件如下
输出结果如下
代码
private void ReadExcel( ) { //1.将Excel读到文件流中 using (FileStream fsRead=File.OpenRead("Student.xls")) { //2.根据文件流,创建一个工作簿对象(workbook) IWorkbook wk=new HSSFWorkbook(fsRead); //3.读取工作簿中的工作表 for (int i = 0; i < wk.NumberOfSheets; i++) { //3.1根据索引,获取一个工作表 ISheet sheet = wk.GetSheetAt(i); //3.2输出工作表的名称 Console.WriteLine("====={0}=====",sheet.SheetName); //4.遍历工作表每一行的数据 for (int r= 0; r <=sheet.LastRowNum; r++) { //获取当前行 IRow row = sheet.GetRow(r); //5.遍历一行中的每一个单元格,当这一行为空时,row会返回null if (row!=null) { //遍历一行的每一个单元格 for (int c = 0; c < row.LastCellNum; c++) { //创建单元格对象 ICell cell = row.GetCell(c); //如果单元格未使用,则为null if (cell!=null) { Console.Write(cell.ToString()+" "); } } } Console.WriteLine(); } } } }
2.写入Excel
private void WriteExcel( ) { List<Person>listPersons=new List<Person>() { new Person(){Name="张三 1",Age=11,Gender='男'}, new Person(){Name="张三 2",Age=21,Gender='女'}, new Person(){Name="张三 3",Age=31,Gender='男'}, new Person(){Name="张三 4",Age=41,Gender='女'} }; //1.创建Workbook对象 IWorkbook wk=new HSSFWorkbook(); //2.创建工作表对象 ISheet sheet = wk.CreateSheet("Persons"); //3.向工作表中添加行 for (int i = 0; i <= listPersons.Count-1; i++) { IRow row = sheet.CreateRow(i); row.CreateCell(0).SetCellValue(listPersons[i].Name); row.CreateCell(1).SetCellValue(listPersons[i].Age); row.CreateCell(2).SetCellValue(listPersons[i].Gender.ToString()); } using (FileStream writer=File.OpenWrite("Persons.xls")) { wk.Write(writer); } Console.WriteLine("ok"); }
查看Excel文件
3.表中数据读到Excel
数据库中列的类型
其中Age为int类型,而且为可空类型
代码
private void TableToExcel( ) { //1.读取数据 string strSql = "select * from Persons"; using (SqlDataReader reader=SQLHelper.ExecuteReader(strSql,CommandType.Text)) { if (reader.HasRows) { IWorkbook wk=new HSSFWorkbook(); ISheet sheet = wk.CreateSheet("Person1"); int rowIndex = 0; while (reader.Read()) { int id = reader.GetInt32(0); string name = reader.GetString(1); //数据库中Age为可空类型 int? age = reader.IsDBNull(2) ? null : (int?) reader.GetInt32(2); string gender = reader.GetString(3); IRow row = sheet.CreateRow(rowIndex); rowIndex++; //向行中创建单元格 row.CreateCell(0).SetCellValue(id); row.CreateCell(1).SetCellValue(name); //对于数据库中可空的类型 ICell cellAge = row.CreateCell(2); if (age == null) { //设置单元格的数据类型为Blank,即空单元格 cellAge.SetCellType(CellType.BLANK); } else { cellAge.SetCellValue((int)age); } row.CreateCell(3).SetCellValue(gender); } using (FileStream write=File.OpenWrite("TablePersons.xls")) { wk.Write(write); } } } Console.WriteLine("ok"); }
输出结果
4.Excel中数据读取到数据库中
Excel中数据
代码运行后,数据库中数据
代码
private void ExcelToTable( ) { using (FileStream read=File.OpenRead("Persons.xls")) { //1.创建工作簿对象 IWorkbook wk=new HSSFWorkbook(read); //2.读取第一张工作表 ISheet sheet = wk.GetSheetAt(0); string strSql = "insert into Persons values(@Name,@Age,@Gender)"; //遍历工作表中的每一行:从0开始 for (int i = 0; i <= sheet.LastRowNum-1; i++) { //遍历每一行中的每一个单元格:从0开始 //字符串类型 IRow row = sheet.GetRow(i); string name = row.GetCell(0).StringCellValue; //可空类型 ICell cellAge = row.GetCell(1); int? age = null; if (cellAge != null && cellAge.CellType != CellType.BLANK) { age = Convert.ToInt32(cellAge.NumericCellValue); } //字符类型 char[] genders = row.GetCell(2).StringCellValue.ToCharArray(); char gender = genders[0]; SqlParameter[] paras=new SqlParameter[] { new SqlParameter("@Name",name), new SqlParameter("@Age",age==null?DBNull.Value:(object)age), new SqlParameter("@Gender",gender), }; SQLHelper.ExecuteNonquery(strSql, CommandType.Text, paras); } } Console.WriteLine("ok"); }