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; using System.Windows.Forms; namespace NX_ExcelClassLibrary { /// /// 先导智能从Excel操作帮助类 /// Copyright20181102 (C) sunyalong /// 允许修改、添加满足自己项目的需要。 /// 添加、修改后请详细注释。违者会强制删除不予采用。 /// public static class LeadExcelHelper { #region Excel帮助类 私有 操作方法 /// /// 获取要保存的文件名称(含完整路径) /// /// private static string GetSaveFilePath() { SaveFileDialog saveFileDig = new SaveFileDialog { Filter = "Excel Office97-2003(*.xls)|*.xls|Excel Office2007及以上(*.xlsx)|*.xlsx", FilterIndex = 0, Title = "导出到", OverwritePrompt = true }; //saveFileDig.InitialDirectory = Common.DesktopDirectory;//设置对话框初始目录 string filePath = null; if (saveFileDig.ShowDialog() == DialogResult.OK) { filePath = saveFileDig.FileName; } return filePath; } /// /// 获取要打开要导入的文件名称(含完整路径) /// /// private static string GetOpenFilePath() { OpenFileDialog openFileDig = new OpenFileDialog { Filter = "Excel Office97-2003(*.xls)|*.xls|Excel Office2007及以上(*.xlsx)|*.xlsx", FilterIndex = 0, Title = "打开", CheckFileExists = true, CheckPathExists = true }; //openFileDig.InitialDirectory = Common.DesktopDirectory;//设置对话框初始目录 string filePath = null; if (openFileDig.ShowDialog() == DialogResult.OK) { filePath = openFileDig.FileName; } return filePath; } /// /// 判断是否为兼容模式(Excel版本.xls或.xlsx) /// /// Excel路径文件名称字符串路径 /// private static bool GetIsCompatible(string filePath) { return filePath.EndsWith(".xls", StringComparison.OrdinalIgnoreCase); } /// /// 创建工作薄 /// /// true:Excel Office97-2003; false:Excel Office2007及以上 /// private static IWorkbook CreateWorkbook(bool isCompatible) { if (isCompatible) { return new HSSFWorkbook(); } else { return new XSSFWorkbook(); } } /// /// 创建工作薄(依据文件流) /// /// true:Excel Office97-2003; false:Excel Office2007及以上 /// 文件流 /// private static IWorkbook CreateWorkbook(bool isCompatible, dynamic stream) { if (isCompatible) { return new HSSFWorkbook(stream); } else { return new XSSFWorkbook(stream); } } /// /// 创建表格头单元格 /// /// IWorkbook工作薄 /// private static ICellStyle GetCellStyle(IWorkbook workbook) { ICellStyle style = workbook.CreateCellStyle(); style.FillPattern = FillPattern.SolidForeground; style.FillForegroundColor = NPOI.HSSF.Util.HSSFColor.Grey25Percent.Index; return style; } /// /// 从工作表中生成DataTable /// /// 工作表 /// 行索引 /// private static DataTable GetDataTableFromSheet(ISheet sheet, int headerRowIndex) { DataTable table = new DataTable(); IRow headerRow = sheet.GetRow(headerRowIndex); int cellCount = headerRow.LastCellNum; for (int i = headerRow.FirstCellNum; i < cellCount; i++) { if (headerRow.GetCell(i) == null || headerRow.GetCell(i).StringCellValue.Trim() == "") { // 如果遇到第一个空列,则不再继续向后读取 cellCount = i; break; } DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue); table.Columns.Add(column); } for (int i = (headerRowIndex + 1); i <= sheet.LastRowNum; i++) { IRow row = sheet.GetRow(i); //如果遇到某行的第一个单元格的值为空,则不再继续向下读取 if (row != null && !string.IsNullOrEmpty(row.GetCell(0).ToString())) { DataRow dataRow = table.NewRow(); for (int j = row.FirstCellNum; j < cellCount; j++) { dataRow[j] = row.GetCell(j).ToString(); } table.Rows.Add(dataRow); } } return table; } #region 20191116 孙亚龙针对电池测试数据表格开发的方法 private static DataTable GetDataTableFromSheet(ISheet sheet, int headerRowIndex, ref string ipStr, ref string timeStr) { DataTable table = new DataTable(); IRow headerRow = sheet.GetRow(headerRowIndex); int cellCount = headerRow.LastCellNum; #region 获取行索引为1、2的值 IRow indexRow1 = sheet.GetRow(1); IRow indexRow2 = sheet.GetRow(2); ipStr = indexRow1.GetCell(0).StringCellValue.Split(':')[1]; timeStr = indexRow2.GetCell(0).StringCellValue.Split(':')[1]; #endregion for (int i = headerRow.FirstCellNum; i < cellCount; i++) { if (headerRow.GetCell(i) == null || headerRow.GetCell(i).StringCellValue.Trim() == "") { // 如果遇到第一个空列,则不再继续向后读取 cellCount = i; break; } DataColumn column = new DataColumn(headerRow.GetCell(i).StringCellValue); table.Columns.Add(column); } for (int i = (headerRowIndex + 1); i <= sheet.LastRowNum; i++) { IRow row = sheet.GetRow(i); //如果遇到某行的第一个单元格的值为空,则不再继续向下读取 if (row != null && !string.IsNullOrEmpty(row.GetCell(0).ToString())) { DataRow dataRow = table.NewRow(); for (int j = row.FirstCellNum; j < cellCount; j++) { dataRow[j] = row.GetCell(j).ToString(); } table.Rows.Add(dataRow); } } return table; } public static DataSet ImportFromExcel(string excelFilePath, int headerRowIndex, ref string ipStr, ref string timeStr) { if (string.IsNullOrEmpty(excelFilePath)) { excelFilePath = GetOpenFilePath(); } if (string.IsNullOrEmpty(excelFilePath)) { return null; } using (FileStream stream = System.IO.File.OpenRead(excelFilePath)) { bool isCompatible = GetIsCompatible(excelFilePath); return ImportFromExcel(stream, headerRowIndex, isCompatible, ref ipStr, ref timeStr); } } public static DataSet ImportFromExcel(Stream excelFileStream, int headerRowIndex, bool isCompatible, ref string ipStr, ref string timeStr) { DataSet ds = new DataSet(); IWorkbook workbook = CreateWorkbook(isCompatible, excelFileStream); for (int i = 0; i < workbook.NumberOfSheets; i++) { ISheet sheet = workbook.GetSheetAt(i); DataTable table = GetDataTableFromSheet(sheet, headerRowIndex, ref ipStr, ref timeStr); ds.Tables.Add(table); } excelFileStream.Close(); //workbook = null; return ds; } #endregion #endregion #region Excel帮助类 公共 导出方法 /// /// 由DataSet导出为Excel /// /// 要导出的DataSet /// Excel文件存放路径 /// Excel文件存放路径 public static string ExportToExcel(DataSet sourceDs, string filePath = null) { if (string.IsNullOrEmpty(filePath)) { filePath = GetSaveFilePath(); } if (string.IsNullOrEmpty(filePath)) { return null; } bool isCompatible = GetIsCompatible(filePath); IWorkbook workbook = CreateWorkbook(isCompatible); ICellStyle cellStyle = GetCellStyle(workbook); for (int i = 0; i < sourceDs.Tables.Count; i++) { DataTable table = sourceDs.Tables[i]; string sheetName = "result" + i.ToString(); ISheet sheet = workbook.CreateSheet(sheetName); IRow headerRow = sheet.CreateRow(0); // handling header. foreach (DataColumn column in table.Columns) { ICell cell = headerRow.CreateCell(column.Ordinal); cell.SetCellValue(column.ColumnName); cell.CellStyle = cellStyle; } // handling value. int rowIndex = 1; foreach (DataRow row in table.Rows) { IRow dataRow = sheet.CreateRow(rowIndex); foreach (DataColumn column in table.Columns) { dataRow.CreateCell(column.Ordinal).SetCellValue((row[column] ?? "").ToString()); } rowIndex++; } } FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite); workbook.Write(fs); fs.Dispose(); //workbook = null; return filePath; } /// /// 由DataTable导出Excel /// /// 要导出数据的DataTable /// 工作表名称 /// Excel文件存放路径 /// Excel文件存放路径 public static string ExportToExcel(DataTable sourceTable, string sheetName = "result", string filePath = null) { if (sourceTable.Rows.Count <= 0) return null; if (string.IsNullOrEmpty(filePath)) { filePath = GetSaveFilePath(); } if (string.IsNullOrEmpty(filePath)) return null; bool isCompatible = GetIsCompatible(filePath); IWorkbook workbook = CreateWorkbook(isCompatible); ICellStyle cellStyle = GetCellStyle(workbook); ISheet sheet = workbook.CreateSheet(sheetName); IRow headerRow = sheet.CreateRow(0); // handling header. foreach (DataColumn column in sourceTable.Columns) { ICell headerCell = headerRow.CreateCell(column.Ordinal); headerCell.SetCellValue(column.ColumnName); headerCell.CellStyle = cellStyle; } // handling value. int rowIndex = 1; foreach (DataRow row in sourceTable.Rows) { IRow dataRow = sheet.CreateRow(rowIndex); foreach (DataColumn column in sourceTable.Columns) { dataRow.CreateCell(column.Ordinal).SetCellValue((row[column] ?? "").ToString()); } rowIndex++; } FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite); workbook.Write(fs); fs.Dispose(); //sheet = null; //headerRow = null; //workbook = null; return filePath; } /// /// 实体类List集合导出为Excel /// /// 实体类类型 /// 实体类List集合数据 /// 实体类属性的键值对集合 /// 工作表名称 /// Excel文件存放路径 /// Excel文件存放路径 public static string ExportToExcel(List data, IList> headerNameList, string sheetName = "result", string filePath = null) where T : class { if (data.Count <= 0) return null; if (string.IsNullOrEmpty(filePath)) { filePath = GetSaveFilePath(); } if (string.IsNullOrEmpty(filePath)) return null; bool isCompatible = GetIsCompatible(filePath); IWorkbook workbook = CreateWorkbook(isCompatible); ICellStyle cellStyle = GetCellStyle(workbook); ISheet sheet = workbook.CreateSheet(sheetName); IRow headerRow = sheet.CreateRow(0); for (int i = 0; i < headerNameList.Count; i++) { ICell cell = headerRow.CreateCell(i); cell.SetCellValue(headerNameList[i].Value); cell.CellStyle = cellStyle; } Type t = typeof(T); int rowIndex = 1; foreach (T item in data) { IRow dataRow = sheet.CreateRow(rowIndex); for (int n = 0; n < headerNameList.Count; n++) { object pValue = t.GetProperty(headerNameList[n].Key).GetValue(item, null); dataRow.CreateCell(n).SetCellValue((pValue ?? "").ToString()); } rowIndex++; } FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite); workbook.Write(fs); fs.Dispose(); //sheet = null; //headerRow = null; //workbook = null; return filePath; } /// /// 由DataGridView导出为Excel /// /// DataGridView对象 /// 工作表名称 /// Excel文件存放路径 /// Excel文件存放路径 public static string ExportToExcel(DataGridView grid, string sheetName = "result", string filePath = null) { if (grid.Rows.Count <= 0) return null; if (string.IsNullOrEmpty(filePath)) { filePath = GetSaveFilePath(); } if (string.IsNullOrEmpty(filePath)) return null; bool isCompatible = GetIsCompatible(filePath); IWorkbook workbook = CreateWorkbook(isCompatible); ICellStyle cellStyle = GetCellStyle(workbook); ISheet sheet = workbook.CreateSheet(sheetName); IRow headerRow = sheet.CreateRow(0); for (int i = 0; i < grid.Columns.Count; i++) { ICell cell = headerRow.CreateCell(i); cell.SetCellValue(grid.Columns[i].HeaderText); cell.CellStyle = cellStyle; } int rowIndex = 1; foreach (DataGridViewRow row in grid.Rows) { IRow dataRow = sheet.CreateRow(rowIndex); for (int n = 0; n < grid.Columns.Count; n++) { dataRow.CreateCell(n).SetCellValue((row.Cells[n].Value ?? "").ToString()); } rowIndex++; } FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate, FileAccess.ReadWrite); workbook.Write(fs); fs.Dispose(); //sheet = null; //headerRow = null; //workbook = null; return filePath; } #endregion #region Excel帮助类 公共 导入方法 /// /// 由Excel文件流导入DataTable /// /// Excel文件流 /// Excel工作表名称 /// Excel表头行索引 /// 是否为兼容模式 /// DataTable public static DataTable ImportFromExcel(Stream excelFileStream, string sheetName, int headerRowIndex, bool isCompatible) { IWorkbook workbook = CreateWorkbook(isCompatible, excelFileStream); ISheet sheet; if (int.TryParse(sheetName, out int sheetIndex)) { sheet = workbook.GetSheetAt(sheetIndex); } else { sheet = workbook.GetSheet(sheetName); } DataTable table = GetDataTableFromSheet(sheet, headerRowIndex); excelFileStream.Close(); //workbook = null; //sheet = null; return table; } /// /// 由Excel导入DataTable /// /// Excel文件路径,为物理路径。 /// Excel工作表名称 /// Excel表头行索引 /// DataTable public static DataTable ImportFromExcel(string excelFilePath, string sheetName, int headerRowIndex) { if (string.IsNullOrEmpty(excelFilePath)) { excelFilePath = GetOpenFilePath(); } if (string.IsNullOrEmpty(excelFilePath)) { return null; } using (FileStream stream = System.IO.File.OpenRead(excelFilePath)) { bool isCompatible = GetIsCompatible(excelFilePath); return ImportFromExcel(stream, sheetName, headerRowIndex, isCompatible); } } /// /// 由Excel文件流导入DataSet,如果有多个工作表,则导入多个DataTable /// /// Excel文件流 /// Excel表头行索引 /// 是否为兼容模式 /// DataSet public static DataSet ImportFromExcel(Stream excelFileStream, int headerRowIndex, bool isCompatible) { DataSet ds = new DataSet(); IWorkbook workbook = CreateWorkbook(isCompatible, excelFileStream); for (int i = 0; i < workbook.NumberOfSheets; i++) { ISheet sheet = workbook.GetSheetAt(i); DataTable table = GetDataTableFromSheet(sheet, headerRowIndex); ds.Tables.Add(table); } excelFileStream.Close(); //workbook = null; return ds; } /// /// 由Excel文件导入DataSet,如果有多个工作表,则导入多个DataTable /// /// Excel文件路径,为物理路径。 /// Excel表头行索引 /// DataSet public static DataSet ImportFromExcel(string excelFilePath, int headerRowIndex) { if (string.IsNullOrEmpty(excelFilePath)) { excelFilePath = GetOpenFilePath(); } if (string.IsNullOrEmpty(excelFilePath)) { return null; } using (FileStream stream = System.IO.File.OpenRead(excelFilePath)) { bool isCompatible = GetIsCompatible(excelFilePath); return ImportFromExcel(stream, headerRowIndex, isCompatible); } } #endregion #region Excel帮助类 公共 转换方法 /// /// 将Excel的列索引转换为列名,列索引从0开始,列名从A开始。如第0列为A,第1列为B... /// /// 列索引 /// 列名,如第0列为A,第1列为B... public static string ConvertColumnIndexToColumnName(int index) { index += 1; int system = 26; char[] digArray = new char[100]; int i = 0; while (index > 0) { int mod = index % system; if (mod == 0) mod = system; digArray[i++] = (char)(mod - 1 + 'A'); index = (index - 1) / 26; } StringBuilder sb = new StringBuilder(i); for (int j = i - 1; j >= 0; j--) { sb.Append(digArray[j]); } return sb.ToString(); } /// /// 转化日期 /// /// 日期 /// public static DateTime ConvertToDate(object date) { string dtStr = (date ?? "").ToString(); if (DateTime.TryParse(dtStr, out DateTime dt)) { return dt; } try { string spStr = ""; if (dtStr.Contains("-")) { spStr = "-"; } else if (dtStr.Contains("/")) { spStr = "/"; } string[] time = dtStr.Split(spStr.ToCharArray()); int year = Convert.ToInt32(time[2]); int month = Convert.ToInt32(time[0]); int day = Convert.ToInt32(time[1]); string years = Convert.ToString(year); string months = Convert.ToString(month); string days = Convert.ToString(day); if (months.Length == 4) { dt = Convert.ToDateTime(date); } else { string rq = ""; if (years.Length == 1) { years = "0" + years; } if (months.Length == 1) { months = "0" + months; } if (days.Length == 1) { days = "0" + days; } rq = "20" + years + "-" + months + "-" + days; dt = Convert.ToDateTime(rq); } } catch { throw new Exception("日期格式不正确,转换日期类型失败!"); } return dt; } /// /// 转化数字 /// /// 数字字符串 /// public static decimal ConvertToDecimal(object d) { string dStr = (d ?? "").ToString(); if (decimal.TryParse(dStr, out decimal result)) { return result; } else { throw new Exception("数字格式不正确,转换数字类型失败!"); } } /// /// 转化布尔 /// /// /// public static bool ConvertToBoolen(object b) { string bStr = (b ?? "").ToString().Trim(); if (bool.TryParse(bStr, out bool result)) { return result; } else if (bStr == "0" || bStr == "1") { return (bStr == "0"); } else { throw new Exception("布尔格式不正确,转换布尔类型失败!"); } } #endregion } }