C#IO之导入导出Excel的多种方式

C#IO之导入导出Excel的多种方式

一.基本介绍:
今天给大家带来的是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
C#IO之导入导出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的导入导出
优势:
C#IO之导入导出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的基本介绍列举了他的优点,前两种方式可以作为了解进行学习,主要是掌握最后一种方法即可。

上一篇:关于MQ的几件小事:如何保证消息队列的高可用


下一篇:java用poi导出excel的工具类