继之前NPOI导出文件,其实这个更多人都会选择用IO流,既不用考虑服务器上有无Office插件,又方便快捷。 那要说到NPOI的好处也就在文件导入比较能提现了。有些服务器是没有Office插件的,那么导入就会成为问题,如果大家还用之前的方法在服务器是不可用的,那么就需要用到NPOI了。比起Office API来说NPOI更加方便,更人性化。
大家在使用Npoi之前需要准备几个Nuget引用
大家可以从VS里添加Nuget引用,也可以去Nuget官网下载手动添加引用
PS:要是大家遇到 ICSharpCode.SharpZipLib 的版本冲突问题,你也可以尝试添加 ICSharpCode.SharpZipLib.dll 引用
只需要调用如下代码,更换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
///
///
///
///
///
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);
}
以上就是我总结的几个比较简单适用的方法,效果图的话考虑到种种原因我就不提供了,给大家的好奇心留点马赛克
其实网上多的是方法,我在这只是总结了自己比较常用的方法,如有雷同请见谅!
要是有大佬有更好更简单的方法或是我的代码有什么问题,大可在评论区留言供大家参考!