From 3a4ae4a0142f070c0a94e6c8412f9c36127b70fd Mon Sep 17 00:00:00 2001 From: admin Date: Mon, 20 Nov 2023 18:05:01 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E4=B8=80=E4=B8=AA=E8=AF=BB?= =?UTF-8?q?=E5=8F=96excel=E7=9A=84=E6=96=B9=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Elight.Utility/Extensions/ExcelReader.cs | 305 +++++++++++++++++++++++ 1 file changed, 305 insertions(+) create mode 100644 Elight.Utility/Extensions/ExcelReader.cs diff --git a/Elight.Utility/Extensions/ExcelReader.cs b/Elight.Utility/Extensions/ExcelReader.cs new file mode 100644 index 0000000..388fd26 --- /dev/null +++ b/Elight.Utility/Extensions/ExcelReader.cs @@ -0,0 +1,305 @@ +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; + } + /// + /// 将DataTable数据导入到excel中 + /// + /// 要导入的数据 + /// DataTable的列名是否要导入 + /// 要导入的excel的sheet的名称 + /// 导入数据行数(包含列名那一行) + 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; + } + } + /// + /// 将excel中的数据导入到DataTable中 + /// + /// excel工作薄sheet的名称 + /// 第一行是否是DataTable的列名 + /// 返回的DataTable + 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); + } + } + + + + /// + /// EXCEL第一列读取到list + /// + /// + public List ExcelToList() + { + List list = new List(); + DataTable dt = ExcelToDataTable("Sheet1", true); + foreach (DataRow item in dt.Rows) + { + list.Add(item[0].ToString()); + } + return list; + } + /// + /// 读取指定EXCEL列 + /// + /// + /// + public List ExcelToList(int columnIndex) + { + List list = new List(); + DataTable dt = ExcelToDataTable("Sheet1", true); + foreach (DataRow item in dt.Rows) + { + list.Add(item[columnIndex].ToString()); + } + return list; + } + public List ExcelToList(string columnName) + { + List list = new List(); + DataTable dt = ExcelToDataTable("Sheet1", true); + foreach (DataRow item in dt.Rows) + { + list.Add(item[columnName].ToString()); + } + return list; + } + /// + /// list转datatable + /// + /// + /// + public DataTable ToDataTable(List 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 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; + } + } + } +}