C# Excel导入与导出
Excel的结构
1、Workbook工作簿(也就是文件)
2、Sheet(也就是一个表)
3、Row(也就是一个数据行)
4、Cell(单元格)
5、Value(单元格中具体的值)
字符串
数字
日期
布尔
空
特殊值:公式
Excel导入、导出
Excel的结构
1、Workbook工作簿(也就是文件)
2、Sheet(也就是一个表)
3、Row(也就是一个数据行)
4、Cell(单元格)
5、Value(单元格中具体的值)
字符串
数字
日期
布尔
空
特殊值:公式
导入
思路
1、要把文件加载到程序中
2、获取sheet
3、获取所有行
4、获取行中所有的数据
5、将获取到的数据,按照原有的数据格式,存储到一个数据容器中
实现(NPOI)
1、选择Excel文件
2、创建一个工作簿(IWrokbook) 接收Excel
子主题 1
3、获取ISheet
4、获取行(IRow)
行分为2种类型:标题行、数据行
sheet.FirstRowNum第一行的行号
sheet.LastRowNum最后一行的行号
5、获取单元格(ICell)
6、根据单元格的类型,获取单元格的值
导出
导入
思路
1、要把文件加载到程序中
2、获取sheet
3、获取所有行
4、获取行中所有的数据
5、将获取到的数据,按照原有的数据格式,存储到一个数据容器中
实现(NPOI)
1、选择Excel文件
2、创建一个工作簿(IWrokbook) 接收Excel
3、获取ISheet
4、获取行(IRow)
行分为2种类型:标题行、数据行
sheet.FirstRowNum第一行的行号
sheet.LastRowNum最后一行的行号
5、获取单元格(ICell)
6、根据单元格的类型,获取单元格的值
1 private void button1_Click(object sender, EventArgs e) 2 { 3 //1、要把文件加载到程序中 4 //2、获取sheet 5 //3、获取所有行 6 //4、获取行中所有的数据 7 //5、将获取到的数据,按照原有的数据格式,存储到一个数据容器中 8 9 10 OpenFileDialog ofd = new OpenFileDialog(); 11 ofd.Filter = "Excel(*.xlsx)|*.xlsx"; 12 if (ofd.ShowDialog() != DialogResult.OK) 13 { 14 return; 15 } 16 //创建一个数据表,用来存储 从Excel中导入的数据 17 DataTable dt = new DataTable(); 18 19 //得到Excel文件地址 是包含路径的fileName 20 string excelFilePath = ofd.FileName; 21 //创建一个工作簿 2007版本及以上 使用XSSFWorkbook ,2007以前的版本 使用 使用HSSFWorkbook 22 IWorkbook workbook = new XSSFWorkbook(excelFilePath); 23 //创建一个sheet ,用来存储Excel中的一个Sheet 24 //ISheet sheet = workbook.GetSheet("Sheet1");//根据sheet的名字获取 25 ISheet sheet = workbook.GetSheetAt(0);//根据sheet的索引,索引从0开始 26 //创建一个Row 存储第一行有效数据,通常 有可能是标题行 27 IRow row = sheet.GetRow(sheet.FirstRowNum); 28 //处理标题行, 遍历标题行中所有的单元格(Cell),每个单元格的值 即为列名 29 foreach (ICell item in row.Cells) 30 { 31 //往DataTable中添加Excel中对应的列的值 32 object cellValue = this.GetCellValueByType(item); 33 string columnName = "";//DataTable的列明 34 if (cellValue == null || cellValue.ToString() =="") 35 { 36 columnName = "column" + dt.Columns.Count;//默认名 37 } 38 else 39 { 40 columnName = cellValue.ToString();//具体值单元格值 作为名字 41 } 42 dt.Columns.Add(columnName); 43 } 44 //遍历所有的有效数据 并将有效数据 添加到DataTable 45 for (int i = sheet.FirstRowNum+1; i <= sheet.LastRowNum; i++) 46 { 47 IRow dataRow = sheet.GetRow(i); 48 DataRow dr = dt.NewRow();// 创建与dt表具有相同架构的新数据行(Row) 49 for (int j = 0; j < dataRow.Cells.Count; j++) 50 { 51 dr[j] = this.GetCellValueByType( dataRow.Cells[j]); 52 } 53 dt.Rows.Add(dr);//向dt数据表中添加一个数据行 54 } 55 //将导入的数据表 绑定到dataGridView1 56 dataGridView1.DataSource = dt; 57 } 58 59 public object GetCellValueByType(ICell cell) 60 { 61 62 switch (cell.CellType) 63 { 64 case CellType.Blank: 65 return ""; 66 case CellType.Boolean: 67 return cell.BooleanCellValue; 68 case CellType.Error: 69 return cell.ErrorCellValue; 70 case CellType.Formula: 71 return cell.CellFormula; 72 case CellType.Numeric: 73 return cell.NumericCellValue; 74 case CellType.String: 75 return cell.StringCellValue; 76 case CellType.Unknown: 77 return null; 78 default: 79 return ""; 80 } 81 } 82 83 private void button2_Click(object sender, EventArgs e) 84 { 85 SaveFileDialog sfd = new SaveFileDialog(); 86 sfd.Filter = "Excel(*.xlsx)|*.xlsx"; 87 if (sfd.ShowDialog() != DialogResult.OK) 88 { 89 return; 90 } 91 string excelFileSavePath = sfd.FileName; 92 DataTable dt = new DataTable(); 93 dt.Columns.Add("姓名"); 94 dt.Columns.Add("性别"); 95 dt.Columns.Add("年龄"); 96 #region 给DataTable 添加模拟数据 97 DataRow dr = dt.NewRow(); 98 dr["姓名"] = "张三1"; 99 dr["性别"] = "男"; 100 dr["年龄"] = "21"; 101 dt.Rows.Add(dr); 102 dr = dt.NewRow(); 103 dr["姓名"] = "张三2"; 104 dr["性别"] = "男"; 105 dr["年龄"] = "22"; 106 dt.Rows.Add(dr); 107 dr = dt.NewRow(); 108 dr["姓名"] = "张三3"; 109 dr["性别"] = "男"; 110 dr["年龄"] = "23"; 111 dt.Rows.Add(dr); 112 #endregion 113 IWorkbook wordbook = new XSSFWorkbook(); 114 ISheet sheet = wordbook.CreateSheet("Sheet1"); 115 IRow row = sheet.CreateRow(0); 116 row.CreateCell(0).SetCellValue("姓名"); 117 row.CreateCell(1).SetCellValue("性别"); 118 row.CreateCell(2).SetCellValue("年龄"); 119 for (int i = 0; i < dt.Rows.Count; i++) 120 { 121 row = sheet.CreateRow(i+1); 122 row.CreateCell(0).SetCellValue(dt.Rows[i]["姓名"].ToString()); 123 row.CreateCell(1).SetCellValue(dt.Rows[i]["性别"].ToString()); 124 row.CreateCell(2).SetCellValue(Convert.ToInt32(dt.Rows[i]["年龄"])); 125 } 126 using (FileStream fs = new FileStream(excelFileSavePath, FileMode.Create, FileAccess.Write)) 127 { 128 wordbook.Write(fs); 129 } 130 MessageBox.Show("导出完成"); 131 } 132 } 133 public class Student { 134 public int ID { get; set; } 135 public string Name { get; set; } 136 }