C#使用NOPI庫實現(xiàn)導(dǎo)入Excel文檔
使用NOPI導(dǎo)入Excel文檔
NOPI版本:2.3.0,依賴于NPOI的SharpZipLib版本:0.86,經(jīng)測試適用于.net4.0+
記錄遇到的幾個問題
1.NOPI中的IWorkbook接口:xls使用HSSFWorkbook類實現(xiàn),xlsx使用XSSFWorkbook類實現(xiàn)
2.日期轉(zhuǎn)換,判斷row.GetCell(j).CellType == NPOI.SS.UserModel.CellType.Numeric && HSSFDateUtil.IsCellDateFormatted(row.GetCell(j)
不能直接使用row.GetCell(j).DateCellValue,這玩意會直接拋出異常來~
1. 將文件流轉(zhuǎn)換為DataTable
/// <summary>
/// 根據(jù)Excel格式讀取Excel
/// </summary>
/// <param name="stream">文件流</param>
/// <param name="type">Excel格式枚舉類型,xls/xlsx</param>
/// <param name="sheetName">表名,默認(rèn)取第一張</param>
/// <returns>DataTable</returns>
private static DataTable ImportExcel(Stream stream, ExcelExtType type, string sheetName)
{
DataTable dt = new DataTable();
IWorkbook workbook;
try
{
//xls使用HSSFWorkbook類實現(xiàn),xlsx使用XSSFWorkbook類實現(xiàn)
switch (type)
{
case ExcelExtType.xlsx:
workbook = new XSSFWorkbook(stream);
break;
default:
workbook = new HSSFWorkbook(stream);
break;
}
ISheet sheet = null;
//獲取工作表 默認(rèn)取第一張
if (string.IsNullOrWhiteSpace(sheetName))
sheet = workbook.GetSheetAt(0);
else
sheet = workbook.GetSheet(sheetName);
if (sheet == null)
return null;
IEnumerator rows = sheet.GetRowEnumerator();
#region 獲取表頭
IRow headerRow = sheet.GetRow(0);
int cellCount = headerRow.LastCellNum;
for (int j = 0; j < cellCount; j++)
{
ICell cell = headerRow.GetCell(j);
if (cell != null)
{
dt.Columns.Add(cell.ToString());
}
else
{
dt.Columns.Add("");
}
}
#endregion
#region 獲取內(nèi)容
for (int i = (sheet.FirstRowNum + 1); i <= sheet.LastRowNum; i++)
{
IRow row = sheet.GetRow(i);
DataRow dataRow = dt.NewRow();
for (int j = row.FirstCellNum; j < cellCount; j++)
{
if (row.GetCell(j) != null)
{
//判斷單元格是否為日期格式
if (row.GetCell(j).CellType == NPOI.SS.UserModel.CellType.Numeric && HSSFDateUtil.IsCellDateFormatted(row.GetCell(j)))
{
if (row.GetCell(j).DateCellValue.Year >=1970)
{
dataRow[j] = row.GetCell(j).DateCellValue.ToString();
}
else
{
dataRow[j] = row.GetCell(j).ToString();
}
}
else
{
dataRow[j] = row.GetCell(j).ToString();
}
}
}
dt.Rows.Add(dataRow);
}
#endregion
}
catch (Exception ex)
{
dt=null;
}
finally
{
//if (stream != null)
//{
// stream.Close();
// stream.Dispose();
//}
}
return dt;
}
2. 文件上載導(dǎo)入
/// <summary>
/// 上傳Excel導(dǎo)入
/// </summary>
/// <param name="file">上載文件對象</param>
/// <param name="errorMsg">錯誤信息</param>
/// <param name="sheetName">表名,默認(rèn)取第一張</param>
/// <returns></returns>
public static DataTable Import(System.Web.HttpPostedFileBase file, ref string errorMsg, string sheetName = "")
{
if (file == null || file.InputStream == null || file.InputStream.Length == 0)
{
errorMsg = "請選擇要導(dǎo)入的Excel文件";
return null;
}
var excelType = GetExcelFileType(file.FileName);
if (excelType == null)
{
errorMsg = "請選擇正確的Excel文件";
return null;
}
using (var stream = new MemoryStream())
{
file.InputStream.Position = 0;
file.InputStream.CopyTo(stream);
var dt = ImportExcel(stream, excelType.Value, sheetName);
if (dt == null)
errorMsg = "導(dǎo)入失敗,請選擇正確的Excel文件";
return dt;
}
}
3. 本地路徑讀取導(dǎo)入
/// <summary>
/// 根據(jù)文件路徑導(dǎo)入Excel
/// </summary>
/// <param name="filePath"></param>
/// <param name="errorMsg">錯誤信息</param>
/// <param name="sheetName">表名,默認(rèn)取第一張</param>
/// <returns>可能為null的DataTable</returns>
public static DataTable Import(string filePath, ref string errorMsg, string sheetName = "")
{
var excelType = GetExcelFileType(filePath);
if (GetExcelFileType(filePath) == null)
{
errorMsg = "請選擇正確的Excel文件";
return null;
}
if (!File.Exists(filePath))
{
errorMsg = "沒有找到要導(dǎo)入的Excel文件";
return null;
}
DataTable dt;
using (var stream = new FileStream(filePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
dt = ImportExcel(stream, excelType.Value, sheetName);
}
if (dt == null)
errorMsg = "導(dǎo)入失敗,請選擇正確的Excel文件";
return dt;
}
4.完整demo
附贈一個winform導(dǎo)入Excel的Demo。
https://github.com/yimogit/NopiExcelDemo
- C#導(dǎo)入導(dǎo)出Excel數(shù)據(jù)的兩種方法
- 讓C# Excel導(dǎo)入導(dǎo)出 支持不同版本Office
- C#導(dǎo)入導(dǎo)出EXCEL文件的代碼實例
- C#數(shù)據(jù)導(dǎo)入/導(dǎo)出Excel文件及winForm導(dǎo)出Execl總結(jié)
- C# Winform實現(xiàn)導(dǎo)入和導(dǎo)出Excel文件
- C#的Excel導(dǎo)入、導(dǎo)出
- C#使用NPOI導(dǎo)入Excel的方法詳解
- C#實現(xiàn)Excel表數(shù)據(jù)導(dǎo)入Sql Server數(shù)據(jù)庫中的方法
- C#數(shù)據(jù)導(dǎo)入到EXCEL的方法
- C#使用NPOI實現(xiàn)Excel導(dǎo)入導(dǎo)出功能
相關(guān)文章
C#打包部署并把.net framework框架打到安裝包的方法步驟
打包c#程序時,有時需要添加.net framework組件到安裝包,本文就來介紹一下C#打包部署并把.net framework框架打到安裝包的方法步驟,具有一定的參考價值,感興趣的可以了解一下2023-10-10
結(jié)合Visual C#開發(fā)環(huán)境講解C#中事件的訂閱和取消訂閱
這篇文章主要介紹了C#中事件的訂閱和取消訂閱,結(jié)合Visual C#開發(fā)環(huán)境來進(jìn)行講解,Visual C#被集成在微軟的IDE程序Visual Studio中,需要的朋友可以參考下2016-01-01

