ASP.NET MVC中Excel的操作
Excel数据的导入和导出
Excel数据导入和导出操作,本文针ASP.NET MVC,为自己做一个记录。
Excel数据的导入
对Excel数据的导入方法有很多,针对使用过的方法做一个总结,所有方法的前提基本都是要先把Excel保存到服务器端,这个方法比较简单,文件的保存,返回路径即可:
//前端代码
<form action="" method="post" enctype="multipart/form-data">
<input name="myfile" type="file" accept="application/vnd.ms-excel">
</form>
//后台代码
HttpPostedFileBase file = Request.Files["myfile"];
file.SaveAs("保存路径.xlsx");//保存文件
- NPOI ,NPOI是源于一个用于读取xls,doc,ppt文档的POI 项目,POI是Java项目,后面因为有.Net的市场,于是将POI移植到.Net上;
- LinqToExcel, 感觉这个库文件用起来简单,实用,操作方便,而且结合了Linq的查询特性,excel版本不仅支持03,而且连wps表格都支持(后缀名为.et),csv文件更不在话下了;
- OLEDB,用OLEDB方式读取EXCEL的速度是非常快的。但是当Excel数据量很大时。会非常占用内存,当内存不够时会抛出内存溢出的异常,需要安装([AccessDatabaseEngine];
- Microsoft.Office.Interop.Excel ,首先服务器需要安装office软件;
NPOI
首先下载DLL,然后添加引用
- using NPOI.SS.UserModel;
- using NPOI.HSSF.UserModel;
- using NPOI.XSSF.UserModel;
DataTable dt = new DataTable();
IWorkbook workbook = null; //新建IWorkbook对象
string extension = System.IO.Path.GetExtension(fullPath);
FileStream fileStream = new FileStream(fullPath,FileMode.Open,FileAccess.Read);
if (extension ==".xlsx") // 2007版本
{
workbook = new XSSFWorkbook(fileStream); //xlsx数据读入workbook
}
else if (extension ==".xls") // 2003版本
{
workbook = new HSSFWorkbook(fileStream); //xls数据读入workbook
}
ISheet sheet = workbook.GetSheetAt(0); //获取第一个工作表
IRow row;//新建当前工作表行数据
for (int i = 0; i < sheet.LastRowNum; i++) //对工作表每一行
{
row = sheet.GetRow(i); //row读入第i行数据
if (row != null)
{
if (row.LastCellNum >= 3)
{
DataRow rows = dt.NewRow();
rows[0] = row.GetCell(0).ToString();
rows[1] = row.GetCell(1).ToString();
dt.Rows.Add(rows);
}
}
}
fileStream.Close();
System.IO.File.Delete(fullPath);
return dt;
LinqToExcel
//直接转接实体类
public List<Admin_Login> GetImportData(string fileName)
{
List<Admin_Login> List = new List<Admin_Login>();
var excelFile = new ExcelQueryFactory(fileName);
//对应列头
excelFile.AddMapping<Admin_Login>(x => x.UserName, "UserName");
excelFile.AddMapping<Admin_Login>(x => x.Power, "Power");
excelFile.AddMapping<Admin_Login>(x => x.CreateTime, "CreateTime");
//SheetName
var excelContent = excelFile.Worksheet<Admin_Login>(0);
int rowIndex = 1;
//检查数据正确性
foreach (var row in excelContent)
{
var model = new Admin_Login();
model.UserName = row.UserName;
model.Power = row.Power;
model.CreateTime = row.CreateTime;
List.Add(model);
rowIndex += 1;
}
return List;
}
OLEDB
public static DataSet Get_ExcelSheet_Source(string P_str_Excel, string P_str_SheetName)
{
DataSet myds = new DataSet();//实例化数据集对象
//--HDR = Yes;”指示第一行中包含列名,而不是数据,
//-----"IMEX=1;”通知驱动程序始终将“互混”数据列作为文本读取。
//---------Excel 8.0 针对Excel2000及以上版本,Excel5.0 针对Excel97。
string P_str_OledbCon = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" + P_str_Excel + ";Extended Properties=Excel 8.0;";
OleDbConnection oledbcon = new OleDbConnection(P_str_OledbCon);//实例化Oledb数据库连接对象
string P_str_ExcelSql = "";//定义变量,用来记录要执行的Excel查询语句
OleDbDataAdapter oledbda = null;//实例化Oledb数据桥接器对象
P_str_ExcelSql = string.Format("select * from [{0}]", P_str_SheetName);//记录要执行的Excel查询语句
oledbda = new OleDbDataAdapter(P_str_ExcelSql, P_str_OledbCon);//使用数据桥接器执行Excel查询
oledbda.Fill(myds, P_str_SheetName);//填充数据
return myds;
}