一.基本介绍:
今天给大家带来的是Excel导入导出的多种实现方式,以及他们的各自的优势以及劣势,首先第一种方式是使用Office组件的方式 ,第二种方式是使用OleDb以及StreamWriter进行Excel的导入导出,第三中方式是使用NPIO进行Excel的导入导出。
二.第一种方式:使用Office组件进行导入导出
导入:
public void ioExcel() { DataTable dt = new DataTable(); string fileName = @"d:\测试.xlsx"; APExcel.Application exApp = new APExcel.Application(); //excel应用 APExcel.Workbooks wbs = exApp.Workbooks; //Excel的工作簿集合 APExcel._Workbook _wbk = null; //excel的一个工作簿文件 try { //打开一个已有的Excel的文件 _wbk = wbs.Add(fileName); APExcel.Worksheet sheet = _wbk.Sheets["sheet1"]; int rowCounts = sheet.UsedRange.Rows.Count; int columnsCounts = sheet.UsedRange.Columns.Count; //获取列Excel工作表的第一列为列名,索引从1开始 for (int i = 1; i <= columnsCounts; i++) { dt.Columns.Add(((APExcel.Range)sheet.Cells[1, i]).Value()); } for (int i = 2; i <= rowCounts; i++) { DataRow dr = dt.NewRow(); for (int j = 1; j <= columnsCounts; j++) { dr[j - 1] = ((APExcel.Range)sheet.Cells[i, j]).Value(); } dt.Rows.Add(dr); } } catch (Exception e) { //记录日志 } finally { _wbk.Close(); wbs.Close(); exApp.Quit(); }
导出:
public void OutputExcel(DataTable Data) { APExcel.Application exApp = new APExcel.Application(); //excel应用 APExcel.Workbooks wbs = exApp.Workbooks; //Excel的工作簿集合 APExcel._Workbook _wbk = null; //excel的一个工作簿文件 try { _wbk = wbs.Add(true); //新建一个Excel工作簿文件 //取得第一个工作表 APExcel.Worksheet sheet = _wbk.Sheets[1]; sheet.Name = "测试数据"; //第一行:写入列名 for (int i = 0; i < Data.Columns.Count; i++) { APExcel.Range r = sheet.Cells[1, i + 1]; r.Value = Data.Columns[i].ColumnName; } for (int i = 0; i < Data.Rows.Count; i++) { for (int j = 0; j < Data.Columns.Count; j++) { APExcel.Range r = sheet.Cells[i + 2, j + 1]; r.Value = Data.Rows[i][j].ToString(); } } exApp.DisplayAlerts = false; _wbk.Saved = true; _wbk.SaveCopyAs(@"d:\\测试数据11.xlsx"); } catch (Exception E) { // } finally { _wbk.Close(); wbs.Close(); exApp.Quit(); } }
缺点:
速度慢,问题多,效率低-----废弃
三.第二种方式:OleDb导入,StreamWriter进行导出写入Excel
导入:
public void InPutExcel(string FileName) { string extensionName = Path.GetExtension(FileName); string strCon = null; if (extensionName == ".xls") { strCon = @"Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" + FileName + ";Extended Properties='Excel8.0;HDR=YES;IMEX=1'"; } else { strCon = @"Provider=Microsoft.Jet.OLEDB.12.0;Data Source=" + FileName + ";Extended Properties='Excel12.0;HDR=YES;IMEX=1'"; } //OLEDB 是建立在ODBC功能之上的开发规范,ODBC是为了访问关系型数据库进行而专门开发的而OLEDB是用于访问关系型和非关系型数据源 //整体过程相当于连接数据库访问数据表的过程 DataTable dt = new DataTable(); using (OleDbConnection conn = new OleDbConnection(strCon)) { conn.Open(); DataTable dtNames = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "Table" }); string shName = dtNames.Rows[0][2].ToString(); string sql = $"select * from {shName}"; OleDbDataAdapter da = new OleDbDataAdapter(sql, strCon); da.Fill(dt); } }
导出:
public void OutPutExcel(DataTable data) { string path = @"d:\测试数据.xlsx"; StreamWriter sw = new StreamWriter(path, false, Encoding.UTF8); StringBuilder sb = new StringBuilder(); for (int i = 0; i < data.Columns.Count; i++) { sb.Append(data.Columns[i].ColumnName + "\t");//相当于tab不能省略 } sb.Append(Environment.NewLine); for (int i = 0; i < data.Rows.Count; i++) { for (int j = 0; j < data.Columns.Count; j++) { sb.Append(data.Rows[i + 1][j].ToString() + "\t"); } sb.Append(Environment.NewLine); } sw.Write(sb); sw.Flush(); //将数据从暂存区刷到基础存储设备 落库 }
优缺点:
优点:加载速度比较快
缺点:受版本的限制,不同的版本链接字符串不一样
四.使用NPIO进行Excel的导入导出
优势:
导入:
public void InputExcel(string sheetName) { DataTable dt = new DataTable(); string fileName = @"d:\测试数据.xlsx"; bool isColumnName = true; IWorkbook workbook; ISheet sheet = null; string Ext = Path.GetExtension(fileName).ToLower(); using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Read)) { if (Ext == ".xls") { workbook = new HSSFWorkbook(fs); } else if (Ext == ".xlsx") { workbook = new HSSFWorkbook(fs); } else { workbook = null; } } if (string.IsNullOrEmpty(sheetName)) { sheet = workbook.GetSheet(sheetName); if (sheet == null) { workbook.GetSheetAt(0); } } else { workbook.GetSheetAt(0); } //获取表头 FirstRowNum 第一行索引0 IRow header = sheet.GetRow(sheet.FirstRowNum); int StartRow = 0; //数据的第一行索引 if (isColumnName) {//表示第一行是列名的信息 StartRow = sheet.FirstRowNum + 1; for (int i = header.FirstCellNum; i < header.LastCellNum; i++) { //获取指定索引的单元格 ICell cell = header.GetCell(i); if (cell != null) { //获取指定的列名 string cellValue=cell.ToString(); if (cellValue != null) { DataColumn dc = new DataColumn(cellValue); dt.Columns.Add(dc); } else { DataColumn dc = new DataColumn(cellValue); dt.Columns.Add(dc); } } } //数据 LastRowNum 最后一行的索引如第九行的索引---8 for (int i = StartRow; i < sheet.LastRowNum; i++) { IRow row = sheet.GetRow(i); if (row == null) { continue; } DataRow dr = dt.NewRow(); //遍历每行的单元格 for (int j = row.FirstCellNum; j < row.LastCellNum; j++) { if (row.GetCell(j) != null) { dr[j] = row.GetCell(j).ToString(); } } dt.Rows.Add(dr); } } }
导出:
public void OutPutExcel(DataTable data) { string sheetName = "测试数据"; //创建一个工作簿对象 IWorkbook workBook = new HSSFWorkbook(); //创建一个工作表的实例 ISheet sheet = string.IsNullOrEmpty(sheetName) ? workBook.GetSheet("sheet1") : workBook.GetSheet(sheetName); int rowIndex = 0; if (data.Columns.Count > 0) { IRow header = sheet.GetRow(rowIndex); //创建第一行 //设置列名 for (int i = 0; i < data.Columns.Count; i++) { ICell cell = header.CreateCell(i); //创建单元格 cell.SetCellValue(data.Columns[i].ColumnName);//设置单元格的值 } } //添加数据 if (data.Rows.Count > 0) { for (int i = 0; i < data.Rows.Count; i++) { rowIndex++; IRow row = sheet.GetRow(rowIndex); for (int j = 0; j < data.Columns.Count; j++) { ICell cell = row.CreateCell(j);//创建单元格 cell.SetCellValue(data.Rows[i][j].ToString()); //设置值 } } } for (int i = 0; i < data.Rows.Count; i++) { sheet.AutoSizeColumn(i); } using (FileStream fs = new FileStream(@"d:\测试数据11.xlsx", FileMode.Create, FileAccess.Write)) { workBook.Write(fs); //写入指定的路径 创建excel文件 } }
总结:
我们介绍了目前主要使用的几种进行Excel的导入导出的方式,并且进行他们使用的简单的举例子,目前我们使用最为广泛的Excel,Word的操作,使用的还是NPOI的方式,我们也进行了NPOI的基本介绍列举了他的优点,前两种方式可以作为了解进行学习,主要是掌握最后一种方法即可。