1. 程式人生 > 程式設計 >c# 根據NPOI 讀取一個excel 檔案的多個Sheet

c# 根據NPOI 讀取一個excel 檔案的多個Sheet

大家都知道NPOI元件可以在你本地沒有安裝office的情況下來 讀取,建立excel檔案。但是大家一般都是隻預設讀取一個excel檔案的第一個sheet。那麼如果要讀取一個excel 的所有sheet 要怎麼做呢?

下面就來告訴大家如何操作NPOI 讀取excel 的所有sheet。

首先我們先講解操作excel 單獨建立的一個類,我命名為EXECLHELP

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System;
using System.Collections.Generic;
using System.Data;
using System.IO;
using System.Linq;
using System.Text;
using System.Threading.Tasks;


public class ExcelHelper : IDisposable
{
private string fileName = null; //檔名
private IWorkbook workbook = null;
private FileStream fs = null;
private bool disposed;

public ExcelHelper(string fileName)
{
this.fileName = fileName;
disposed = false;
}

/// <summary>
/// 將DataTable資料匯入到excel中
/// </summary>
/// <param name="data">要匯入的資料</param>
/// <param name="isColumnWritten">DataTable的列名是否要匯入</param>
/// <param name="sheetName">要匯入的excel的sheet的名稱</param>
/// <returns>匯入資料行數(包含列名那一行)</returns>
public int DataTableToExcel(DataTable data,string sheetName,bool isColumnWritten)
{
int i = 0;
int j = 0;
int count = 0;
ISheet sheet = null;

fs = new FileStream(fileName,FileMode.OpenOrCreate,FileAccess.ReadWrite);
if (fileName.IndexOf(".xlsx") > 0) // 2007版本
workbook = new XSSFWorkbook();
else if (fileName.IndexOf(".xls") > 0) // 2003版本
workbook = new HSSFWorkbook();

try
{
if (workbook != null)
{
sheet = workbook.CreateSheet(sheetName);
}
else
{
return -1;
}

if (isColumnWritten == true) //寫入DataTable的列名
{
IRow row = sheet.CreateRow(0);
for (j = 0; j < data.Columns.Count; ++j)
{
row.CreateCell(j).SetCellValue(data.Columns[j].ColumnName);
}
count = 1;
}
else
{
count = 0;
}

for (i = 0; i < data.Rows.Count; ++i)
{
IRow row = sheet.CreateRow(count);
for (j = 0; j < data.Columns.Count; ++j)
{
row.CreateCell(j).SetCellValue(data.Rows[i][j].ToString());
}
++count;
}
workbook.Write(fs); //寫入到excel
return count;
}
catch (Exception ex)
{
Console.WriteLine("Exception: " + ex.Message);
return -1;
}
}

/// <summary>
/// 將excel中的資料匯入到DataTable中
/// </summary>
/// <param name="sheetName">excel工作薄sheet的名稱</param>
/// <param name="isFirstRowColumn">第一行是否是DataTable的列名</param>
/// <returns>返回的DataTable</returns>
///


public Dictionary<int,string> ReturnSheetList()
{
Dictionary<int,string> t = new Dictionary<int,string>();
ISheet sheet = null;
DataTable data = new DataTable();
int startRow = 0;
try
{
fs = new FileStream(fileName,FileMode.Open,FileAccess.Read);
if (fileName.IndexOf(".xlsx") > 0) // 2007版本
workbook = new XSSFWorkbook(fs);
else if (fileName.IndexOf(".xls") > 0) // 2003版本
workbook = new HSSFWorkbook(fs);
int count = workbook.NumberOfSheets; //獲取所有SheetName
for(int i=0;i<count;i++)
{
sheet = workbook.GetSheetAt(i);
if (sheet.LastRowNum > 0)
{
t.Add(i,workbook.GetSheetAt(i).SheetName);
}
}
return t;
}
catch (Exception ex)
{
throw new Exception(ex.Message);
}


}<br>        ///index excel的第幾個sheet
public DataTable ExcelToDataTable(int index)
{
ISheet sheet = null;
DataTable data = new DataTable();
int startRow = 0;
try
{
fs = new FileStream(fileName,FileAccess.Read);
if (fileName.IndexOf(".xlsx") > 0) // 2007版本
workbook = new XSSFWorkbook(fs);
else if (fileName.IndexOf(".xls") > 0) // 2003版本
workbook = new HSSFWorkbook(fs);
//int coutnts = workbook.NumberOfSheets;

sheet = workbook.GetSheetAt(index);
//string names= sheet.SheetName;
if (sheet != null)
{
IRow firstRow = sheet.GetRow(0);
int cellCount = firstRow.LastCellNum; //一行最後一個cell的編號 即總的列數


for (int i = firstRow.FirstCellNum; i < cellCount; ++i)
{
ICell cell = firstRow.GetCell(i);
CellType c = cell.CellType;
if (cell != null)
{
string cellValue = cell.StringCellValue;
if (cellValue != null)
{
DataColumn column = new DataColumn(cellValue);
data.Columns.Add(column);
}
}
}
startRow = sheet.FirstRowNum + 1;


//最後一列的標號
int rowCount = sheet.LastRowNum;
for (int i = startRow; i <= rowCount; ++i)
{
IRow row = sheet.GetRow(i);
if (row == null) continue; //沒有資料的行預設是null       

DataRow dataRow = data.NewRow();
for (int j = row.FirstCellNum; j < cellCount; ++j)
{
if (row.GetCell(j) != null) //同理,沒有資料的單元格都預設是null
dataRow[j] = row.GetCell(j).ToString();
}
data.Rows.Add(dataRow);
}
}

return data;
}
catch (Exception ex)
{
return null;
throw new Exception(ex.Message);

}
}

public void Dispose()
{
Dispose(true);
GC.SuppressFinalize(this);
}

protected virtual void Dispose(bool disposing)
{
if (!this.disposed)
{
if (disposing)
{
if (fs != null)
fs.Close();
}

fs = null;
disposed = true;
}
}
}<br><br>

DataTableToExcel 這個方法是講資料匯出為excel,引數在程式碼裡面都寫了註釋,可以直接套用。 ExcelToDataTable 這個方法主要是將excel資料匯入到 databtable裡面 同理引數也在註釋裡面。 主要講一下 ReturnSheetList 方法 在讀取之前我們是需要判斷匯入的excel版本是高版本還是低版本,這是因為npoi 提供高低版本的操作類是不一樣的 大於03小於07版本提供的是HSSFWorkbook,小於07版本提供的是 XSSFWorkbook。 然後 workbook.NumberOfSheets 這個主要是獲取一個excel檔案中有多少個sheet,我們根據迴圈遍歷讀取sheet 然後將sheetname 的名字和對應的index傳到一個數據字典中儲存。 於是這個資料字典就存在了你匯入的excel 檔案所有的 有內容的sheet和對應的index。 搭配上ExcelToDataTable 使用 就可以達到切換讀取一個excel 的不同sheet 的目的。

以上就是c# 根據NPOI 讀取一個excel 檔案的多個Sheet的詳細內容,更多關於c# 讀取excel 的sheet的資料請關注我們其它相關文章!