|
|
using System; |
|
|
using System.Collections.Generic; |
|
|
using System.Data; |
|
|
using System.Diagnostics; |
|
|
using NPOI.HSSF.UserModel; |
|
|
using NPOI.SS.UserModel; |
|
|
using NPOI.XSSF.UserModel; |
|
|
|
|
|
namespace Elight.Utility.Extensions |
|
|
{ |
|
|
public class ExcelReader |
|
|
{ |
|
|
private string fileName = null; //文件名 |
|
|
private IWorkbook workbook = null; |
|
|
private FileStream fs = null; |
|
|
private bool disposed; |
|
|
public ExcelReader(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 DataTable ExcelToDataTable(string sheetName = default, bool isFirstRowColumn = true) |
|
|
{ |
|
|
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); |
|
|
|
|
|
if (sheetName != null) |
|
|
{ |
|
|
sheet = workbook.GetSheet(sheetName); |
|
|
//sheet = workbook.CreateSheet(sheetName); |
|
|
if (sheet == null) //如果没有找到指定的sheetName对应的sheet,则尝试获取第一个sheet |
|
|
{ |
|
|
sheet = workbook.GetSheetAt(0); |
|
|
} |
|
|
} |
|
|
else |
|
|
{ |
|
|
sheet = workbook.GetSheetAt(0); |
|
|
} |
|
|
if (sheet != null) |
|
|
{ |
|
|
IRow firstRow = sheet.GetRow(0); |
|
|
if (firstRow == null) |
|
|
{ |
|
|
return null; |
|
|
} |
|
|
int cellCount = firstRow.LastCellNum; //一行最后一个cell的编号 即总的列数 |
|
|
|
|
|
if (isFirstRowColumn) |
|
|
{ |
|
|
for (int i = firstRow.FirstCellNum; i < cellCount; ++i) |
|
|
{ |
|
|
ICell cell = firstRow.GetCell(i); |
|
|
if (cell != null) |
|
|
{ |
|
|
string cellValue = cell.StringCellValue; |
|
|
if (!string.IsNullOrEmpty(cellValue)) |
|
|
{ |
|
|
Trace.WriteLine(cellValue); |
|
|
DataColumn column = new DataColumn(cellValue); |
|
|
data.Columns.Add(column); |
|
|
} |
|
|
} |
|
|
} |
|
|
startRow = sheet.FirstRowNum + 1; |
|
|
} |
|
|
else |
|
|
{ |
|
|
startRow = sheet.FirstRowNum; |
|
|
} |
|
|
|
|
|
//最后一列的标号 |
|
|
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) |
|
|
{ |
|
|
Console.WriteLine("Exception: " + ex.Message); |
|
|
return null; |
|
|
} |
|
|
} |
|
|
|
|
|
public void ExportToExcel(DataTable dt, string fileName) |
|
|
{ |
|
|
IWorkbook workbook; |
|
|
string fileExt = Path.GetExtension(fileName).ToLower(); |
|
|
//XSSFWorkbook 适用XLSX格式,HSSFWorkbook 适用XLS格式 |
|
|
if (fileExt == ".xlsx") |
|
|
{ |
|
|
workbook = new XSSFWorkbook(); |
|
|
} |
|
|
else if (fileExt == ".xls") |
|
|
{ |
|
|
workbook = new HSSFWorkbook(); |
|
|
} |
|
|
else |
|
|
{ |
|
|
workbook = null; |
|
|
return; |
|
|
} |
|
|
|
|
|
ISheet sheet = string.IsNullOrEmpty(dt.TableName) ? workbook.CreateSheet("Sheet1") : workbook.CreateSheet(dt.TableName); |
|
|
|
|
|
//表头 |
|
|
IRow row = sheet.CreateRow(0); |
|
|
for (int i = 0; i < dt.Columns.Count; i++) |
|
|
{ |
|
|
ICell cell = row.CreateCell(i); |
|
|
cell.SetCellValue(dt.Columns[i].ColumnName); |
|
|
} |
|
|
|
|
|
//数据 |
|
|
for (int i = 0; i < dt.Rows.Count; i++) |
|
|
{ |
|
|
IRow row1 = sheet.CreateRow(i + 1); |
|
|
for (int j = 0; j < dt.Columns.Count; j++) |
|
|
{ |
|
|
ICell cell = row1.CreateCell(j); |
|
|
cell.SetCellValue(dt.Rows[i][j].ToString()); |
|
|
} |
|
|
} |
|
|
|
|
|
//保存为Excel文件 |
|
|
using (FileStream fs = new FileStream(fileName, FileMode.Create, FileAccess.Write)) |
|
|
{ |
|
|
workbook.Write(fs); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/// <summary> |
|
|
/// EXCEL第一列读取到list |
|
|
/// </summary> |
|
|
/// <returns></returns> |
|
|
public List<string> ExcelToList() |
|
|
{ |
|
|
List<string> list = new List<string>(); |
|
|
DataTable dt = ExcelToDataTable("Sheet1", true); |
|
|
foreach (DataRow item in dt.Rows) |
|
|
{ |
|
|
list.Add(item[0].ToString()); |
|
|
} |
|
|
return list; |
|
|
} |
|
|
/// <summary> |
|
|
/// 读取指定EXCEL列 |
|
|
/// </summary> |
|
|
/// <param name="columnIndex"></param> |
|
|
/// <returns></returns> |
|
|
public List<string> ExcelToList(int columnIndex) |
|
|
{ |
|
|
List<string> list = new List<string>(); |
|
|
DataTable dt = ExcelToDataTable("Sheet1", true); |
|
|
foreach (DataRow item in dt.Rows) |
|
|
{ |
|
|
list.Add(item[columnIndex].ToString()); |
|
|
} |
|
|
return list; |
|
|
} |
|
|
public List<string> ExcelToList(string columnName) |
|
|
{ |
|
|
List<string> list = new List<string>(); |
|
|
DataTable dt = ExcelToDataTable("Sheet1", true); |
|
|
foreach (DataRow item in dt.Rows) |
|
|
{ |
|
|
list.Add(item[columnName].ToString()); |
|
|
} |
|
|
return list; |
|
|
} |
|
|
/// <summary> |
|
|
/// list转datatable |
|
|
/// </summary> |
|
|
/// <param name="collection"></param> |
|
|
/// <returns></returns> |
|
|
public DataTable ToDataTable(List<string> collection) |
|
|
{ |
|
|
DataTable dt = new DataTable(); |
|
|
dt.Columns.Add("ID"); |
|
|
foreach (var item in collection) |
|
|
{ |
|
|
DataRow dr = dt.NewRow(); |
|
|
dr[0] = item.ToString(); |
|
|
dt.Rows.Add(dr); |
|
|
} |
|
|
return dt; |
|
|
} |
|
|
|
|
|
public int ListToExcel(List<string> collection) |
|
|
{ |
|
|
DataTable dt = ToDataTable(collection); |
|
|
return DataTableToExcel(dt, "Sheet1", true); |
|
|
} |
|
|
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; |
|
|
} |
|
|
} |
|
|
} |
|
|
}
|
|
|
|