C# ASP.net中NPOI实现Excel文件导入

NPOI导入优势

继之前NPOI导出文件,其实这个更多人都会选择用IO流,既不用考虑服务器上有无Office插件,又方便快捷。 那要说到NPOI的好处也就在文件导入比较能提现了。有些服务器是没有Office插件的,那么导入就会成为问题,如果大家还用之前的方法在服务器是不可用的,那么就需要用到NPOI了。比起Office API来说NPOI更加方便,更人性化。

准备工作

大家在使用Npoi之前需要准备几个Nuget引用

  1. NPOI.dll
  2. NPOI.OOXML.dll
  3. NPOI.OpenXml4Net.dll
  4. NPOI.OpenXmlFormats.dll

大家可以从VS里添加Nuget引用,也可以去Nuget官网下载手动添加引用

PS:要是大家遇到 ICSharpCode.SharpZipLib 的版本冲突问题,你也可以尝试添加 ICSharpCode.SharpZipLib.dll 引用

Excel直接导入数据库

只需要调用如下代码,更换sql语句其他的再根据自身情况替换就ok了。

public void fileUp(string url)
        {
            List getID = new List();
            try
            {
                using (FileStream fileReader = System.IO.File.OpenRead(url))
                {
                    //创建工作簿对象接收文件流(Excel信息)
                    IWorkbook workbook;
                    string fileExt = Path.GetExtension(url).ToLower();
                    if (fileExt == ".xlsx") { workbook = new XSSFWorkbook(fileReader); } else if (fileExt == ".xls") { workbook = new HSSFWorkbook(fileReader); } else { workbook = null; }
                    //创建工作表读取工作簿表信息
                    ISheet sheet = workbook.GetSheetAt(0);
                    string sql = @" Insert Into Users (UserID,Name) Values(@UserID,@Name)";
                    string ii = "";
                    //r = 1,剔除表头一行
                    for (int r = 1; r <= sheet.LastRowNum; r++)
                    {
                        //定义参数数组para
                        SqlParameter[] para = new SqlParameter[] {
                     new SqlParameter("UserID",SqlDbType.NVarChar,100),
                     new SqlParameter("Name",SqlDbType.NVarChar,100)
                    };
                        //创建一行获取sheet行数据
                        IRow row = sheet.GetRow(r);
                        //int c = 1 即不读取自动编号的Id列
                        for (int c = 0; c < row.LastCellNum; c++)
                        {
                            //将每行的每个单元格的数据添加到para中 c-1即从0 开始记录参数
                            para[c].Value = row.GetCell(c).ToString();
                        }
						//执行添加sql语句,并将结果累加,一般成功返回1,失败返回0
                        ii += DbHelperSQL.ExecuteSql(sql, para).ToString();
                        DataTable dt = mydb.ExecSQL("select UserID from Users order by id desc");
                        if (!ii.ToString().Contains("0")) { getID.Add(Convert.ToInt32(dt.Rows[0]["ID"])); }
                    }
                    if (!ii.ToString().Contains("0"))
                    {
                        Response.Write("");
                        try
                        {
                            //删除临时文件
                            if (File.Exists(url))
                            {
                                FileInfo fi = new FileInfo(url);
                                if (fi.Attributes.ToString().IndexOf("ReadOnly") != -1)
                                    fi.Attributes = FileAttributes.Normal;
                                File.Delete(url);
                            }
                        }
                        catch (Exception ex)
                        {
                            help.ShowMessage(ex.Message);
                            return;
                        }
                    }
                    else
                    {
						//如果失败删除之前添加的所有数据
                        for (int i = 0; i < getID.Count; i++)
                        {
                            string Delsql = @"delete Users where id='"+getID[i]+"'";
                            DbHelperSQL.ExecuteSql(Delsql);
                        }
                        Response.Write("");
                    }

                }
            }
            catch (Exception ex)
            {
                for (int i = 0; i < getID.Count; i++)
                {
					//如果失败删除之前添加的所有数据
                    string Delsql = @"delete Users where id='" + getID[i] + "'";
                    DbHelperSQL.ExecuteSql(Delsql);
                }
                Response.Write("");
            }
        }

Excel导入DataTable

这个就只将Excel转换成DataTable,并没有添加数据库,您可以自己添加

这个您可以放在公用类里,调用就好了。

        /// 
        /// 将Excel单表转为Datatable
        /// 
        /// 
        /// 
        /// 
        /// 
        public static DataTable ExcelToDatatable(FileStream stream, string fileType,  string sheetName = null)
        {
            DataTable dt = new DataTable();
            ISheet sheet = null;
            IWorkbook workbook = null;
            try
            {
                #region 判断excel版本
                //2007以上版本excel
                if (fileType == ".xlsx")
                {
                    workbook = new XSSFWorkbook(stream);
                }
                //2007以下版本excel
                else if (fileType == ".xls")
                {
                    workbook = new HSSFWorkbook(stream);
                }
                else
                {
                    throw new Exception("传入的不是Excel文件!");
                }
                #endregion
                if (!string.IsNullOrEmpty(sheetName))
                {
                    sheet = workbook.GetSheet(sheetName);
                    if (sheet == null)
                    {
                        sheet = workbook.GetSheetAt(0);
                    }
                }
                else
                {
                    sheet = workbook.GetSheetAt(0);
                }
                if (sheet != null)
                {
                    IRow firstRow = sheet.GetRow(0);
                    int cellCount = firstRow.LastCellNum;
                    for (int i = firstRow.FirstCellNum; i < cellCount; i++)
                    {
                        ICell cell = firstRow.GetCell(i);
                        if (cell != null)
                        {
                            string cellValue = cell.StringCellValue.Trim();
                            if (!string.IsNullOrEmpty(cellValue))
                            {
                                DataColumn dataColumn = new DataColumn(cellValue);
                                dt.Columns.Add(dataColumn);
                            }
                        }
                    }
                    DataRow dataRow = null;
                    //遍历行
                    for (int j = sheet.FirstRowNum + 1; j <= sheet.LastRowNum; j++)
                    {
                        IRow row = sheet.GetRow(j);
                        dataRow = dt.NewRow();
                        if (row == null || row.FirstCellNum < 0)
                        {
                            continue;
                        }
                        //遍历列
                        for (int i = row.FirstCellNum; i < cellCount; i++)
                        {
                            ICell cellData = row.GetCell(i);
                            if (cellData != null)
                            {
                                //判断是否为数字型,必须加这个判断不然下面的日期判断会异常
                                if (cellData.CellType == CellType.Numeric)
                                {
                                    //判断是否日期类型
                                    if (DateUtil.IsCellDateFormatted(cellData))
                                    {
                                        dataRow[i] = cellData.DateCellValue;
                                    }
                                    else
                                    {
                                        dataRow[i] = cellData.ToString().Trim();
                                    }
                                }
                                else
                                {
                                    dataRow[i] = cellData.ToString().Trim();
                                }
                            }
                        }
                        dt.Rows.Add(dataRow);
                    }
                }
                else
                {
                    throw new Exception("没有获取到Excel中的数据表!");
                }
            }
            catch (Exception ex)
            {
                Response.Write("");
            }
            return dt;
        }

由于上述代码形参比较多这边提供一下调用解释

public void ExcelToDataTable()
{
    //获取相对路径并添加虚拟相对路径
    string savePath = Server.MapPath((@"~/Files/") + FileUpload1.FileName);
    FileUpload1.SaveAs(savePath);
    //创建IO流读写操作
    FileStream fileReader = System.IO.File.OpenRead(savePath);
    //获取文件路径
    string fileExt = Path.GetExtension(savePath).ToLower();
    string strMsg="";
    //创建DataTable 
    DataTable dt = new DataTable();
    dt = DoExcel.ExcelToDatatable(fileReader, fileExt, strMsg);
}

以上就是我总结的几个比较简单适用的方法,效果图的话考虑到种种原因我就不提供了,给大家的好奇心留点马赛克

其实网上多的是方法,我在这只是总结了自己比较常用的方法,如有雷同请见谅!

要是有大佬有更好更简单的方法或是我的代码有什么问题,大可在评论区留言供大家参考!

你可能感兴趣的:(nginx,C#,Npoi,NPOI导入,NPOI导入)