1、Excel .xls 和 .xlsx 有什么區別?
區別如下:
1、文件格式不同。.xls 是一個特有的二進制格式,其核心結構是復合文檔類型的結構,而.xlsx 的核心結構是 XML 類型的結構,
采用的是基於 XML 的壓縮方式,使其占用的空間更小。.xlsx 中最后一個 x 的意義就在於此。
2、版本不同。.xls是excel2003及以前版本生成的文件格式,而.xlsx是excel2007及以后版本生成的文件格式。
3、兼容性不同。.xlsx格式是向下兼容的,可兼容.xls格式。
2、一號種子選手(EppLus)
EPPlus是一個使用Open Office XML(xlsx)文件格式,能讀寫Excel 2007/2010 文件的開源組件,
在導出Excel的時候不需要電腦上安裝office,官網為:http://epplus.codeplex.com/。
基本上Excel上的各種功能(例如圖表、VBA、數據透視表、加密、數據驗證等)Epplus都能實現,
它的一個缺點就是不支持導出2003版的Excel,也就是.XLS文件。
2.1 EppLus實現
(1)添加包 EPPlus (注意:EPPlus.Core已棄用)
(2)Execl導入數據使用EPPlus處理實例:
/// <summary>
/// 獲取Exel批量用戶數據(EppLus)
/// </summary>
/// <param name="context"></param>
/// <param name="msg"></param>
/// <returns></returns>
public List<BatchUsersReq> GetBatchUsersData(HttpContext context,out string msg)
{
msg = "數據處理成功";
// 獲取上傳文件后綴
var extension = Path.GetExtension(context.Request.Form.Files[0].FileName).ToUpper();
if(!extension.Contains("XLSX"))
{
msg = "文件格式不正確,只支持XLSX文件";
return null;
}
// 限制單次只能上傳5M
float fileSize = context.Request.Form.Files[0].Length / 1024 / 1024;
if(fileSize > 5)
{
msg = "文件大小超過限制";
return null;
}
try
{
Stream stream = context.Request.Form.Files[0].OpenReadStream();
using (var package = new ExcelPackage(stream))
{
// 獲取Exel指定工作簿,"Sheet1"也可以用索引代替
ExcelWorksheet worksheet = package.Workbook.Worksheets["Sheet1"];
// 獲取數據行數
int RowNum = worksheet.Dimension.Rows;
// 待處理數據存儲列表
List<BatchUsersReq> usersData = new List<BatchUsersReq>();
// 獲取每行數據
for (int row = 1; row <= RowNum; row++)
{
usersData.Add(new BatchUsersReq
{
// 獲取每列數據
Account = worksheet.Cells[row, 1].Value.ToString(),
Password = worksheet.Cells[row, 2].Value.ToString(),
Name = worksheet.Cells[row, 3].Value.ToString(),
Sex = worksheet.Cells[row, 4].Value.ToString(),
UserRole = worksheet.Cells[row, 5].Value.ToString()
});
}
return usersData;
}
}
catch(Exception e)
{
msg = "數據異常";
}
return null;
}
3、二號種子選手(NPOI)
NPOI是一個開源項目,可以讀/寫xls,doc,ppt文件,有着廣泛的應用。NPIO官網地址:http://npoi.codeplex.com/
使用NPOI能夠幫助開發者在沒有安裝微軟Office的情況下讀寫Office 97-2003的文件,支持的文件格式包括xls, doc, ppt等。
NPOI是構建在POI 3.x版本之上的,它可以在沒有安裝Office的情況 下對Word/Excel文檔進行讀寫操作。
3.1 NPOI實現
(1)添加包 DotNetCore.NPOI
(2)Execl導入數據使用EPPlus處理實例:
/// <summary>
/// 獲取Execl批量用戶數據 NPOI
/// </summary>
/// <param name="file">execl</param>
/// <param name="msg"></param>
/// <returns></returns>
public List<BatchUsersReq> GetBatchUsersData(IFormFile file,out string msg)
{
msg = "數據處理成功";
// 獲取上傳文件后綴
string ext = Path.GetExtension(file.FileName).ToLower();
if(!ext.Contains("xls") && !ext.Contains("xlsx"))
{
msg = "文件有誤,只支持上傳XLS、XLSX文件";
return null;
}
// 限制單次只能上傳5M
float fileSize = file.Length / 1024 / 1024;
if (fileSize > 5)
{
msg = "文件大小超過限制";
return null;
}
try
{
// 文件流處理
MemoryStream ms = new MemoryStream();
file.CopyTo(ms);
ms.Seek(0, SeekOrigin.Begin);
// 根據Excel版本進行處理
IWorkbook workbook = ext == ".xls" ? (IWorkbook)new HSSFWorkbook(ms) : new XSSFWorkbook(ms);
// 獲取Excel第一張工作簿
ISheet sheet = workbook.GetSheetAt(0);
// 獲取數據行數
int num = sheet.LastRowNum;
// 待處理用戶數據
List<BatchUsersReq> users = new List<BatchUsersReq>();
for (int i = 1; i <= num; i++)
{
// 獲取指定行數據
IRow row = sheet.GetRow(i);
BatchUsersReq user = new BatchUsersReq();
// 獲取指定列數據
user.Account = row.GetCell(0).ToString();
user.Password = row.GetCell(1).ToString();
user.Name = row.GetCell(2).ToString();
user.Sex = row.GetCell(3).ToString();
user.UserRole = row.GetCell(4).ToString();
users.Add(user);
}
return users;
}
catch(Exception e)
{
msg = "數據處理出錯";
}
return null;
}
4、踩坑心得
在使用一個庫之前一定要多了解全面,多幾個庫對比然后選擇符合自己需求的。
我剛開始參考的EppLus博文里面並沒有說Epplus不支持.xls,IF判斷邏輯也是兩種都支持。
而我恰巧是上傳的.xls格式,導致代碼在讀取工作簿的時候就報錯,我以為是文件流的問題導致讀取不到所以折騰了很久。
后來百度知道了Epplus不支持.xls,於是機智的我的直接手動把.xls改成了.xlsx。(哭唧唧)
結果當然還是不行,於是我又幾番百度了解到了NPOI……