欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 科技 > IT业 > .NET C# 读写Excel及转换DataTable

.NET C# 读写Excel及转换DataTable

2024/10/25 3:33:13 来源:https://blog.csdn.net/szy13323042191/article/details/139616696  浏览:    关键词:.NET C# 读写Excel及转换DataTable

目录

  • .NET C# 读写Excel及转换DataTable
    • 1. 依赖库
    • 2. Nuget包与版本
    • 3. ExcelUtil
      • 3.1 Excel sheet 转 DataTable
      • 3.2 Excel sheet 转 DataSet
      • 3.3 DataTable 转 Excel sheet
      • 3.4 DataSet 转 Excel
      • 3.5 私有方法

.NET C# 读写Excel及转换DataTable

1. 依赖库

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;
using System.Data;
using System.IO;
using System.Text;
using System.Text.RegularExpressions;

2. Nuget包与版本

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

3. ExcelUtil

3.1 Excel sheet 转 DataTable

/// <summary>
/// Excel sheet 转 DataTable
/// </summary>
/// <param name="excelFilePath">Excel文件路径</param>
/// <param name="sheetName">Sheet名称</param>
/// <returns>结果DataTable</returns>
public static DataTable? FromExcel(string excelFilePath, string sheetName)
{DataTable dataTable = new DataTable(sheetName);IWorkbook wb = GetWorkbook(excelFilePath);if (wb == null){return null;}ISheet ws = wb.GetSheet(sheetName);if (ws == null){return null;}if (ws.LastRowNum < 1){return dataTable;}int maxColumnNum = 0;int rowNum = ws.LastRowNum + 1;for (int rowIdx = 0; rowIdx < rowNum; rowIdx++){IRow row = ws.GetRow(0);if (row != null && row.LastCellNum > maxColumnNum){maxColumnNum = row.LastCellNum;}}IRow headerRow = ws.GetRow(0);for (int columnIdx = 0; columnIdx < maxColumnNum; columnIdx++){string columnName = string.Empty;if (headerRow != null){ICell cell = headerRow.GetCell(columnIdx);if (cell == null){continue;}columnName = cell.StringCellValue;}if (string.IsNullOrEmpty(columnName)){columnName = $"column_{columnIdx + 1}";}string columnTempName = columnName;int tag = 0;while (dataTable.Columns.Contains(columnTempName)){columnTempName = columnName + $"_{++tag}";}dataTable.Columns.Add(columnTempName);}if (rowNum <= 1){return dataTable;}for (int rowIdx = 1; rowIdx < rowNum; rowIdx++){DataRow dataRow = dataTable.NewRow();for (int columnIdx = 0; columnIdx < maxColumnNum; columnIdx++){IRow row = ws.GetRow(rowIdx);if (row == null){continue;}ICell cell = row.GetCell(columnIdx);if (cell == null){continue;}dataRow[columnIdx] = GetCellValue(cell);}dataTable.Rows.Add(dataRow);}return dataTable;
}

3.2 Excel sheet 转 DataSet

/// <summary>
/// Excel sheet 转 DataSet
/// </summary>
/// <param name="excelFilePath">Excel文件路径</param>
/// <returns>结果DataSet</returns>
public static DataSet? FromExcel(string excelFilePath)
{IWorkbook wb = GetWorkbook(excelFilePath);if (wb == null){return null;}DataSet ds = new DataSet();for (int i = 0; i < wb.NumberOfSheets; i++){ISheet sheet = wb.GetSheetAt(i);DataTable? dt = FromExcel(excelFilePath, sheet.SheetName);if (dt == null){continue;}ds.Tables.Add(dt);}return ds;
}

3.3 DataTable 转 Excel sheet

/// <summary>
/// DataTable 转 Excel sheet
/// </summary>
/// <param name="excelFilePath">Excel文件路径</param>
/// <param name="dataTable">DataTable实例</param>
/// <param name="sheetName">Sheet名称</param>
/// <returns>转换结果</returns>
public static bool ToExcel(string excelFilePath, DataTable dataTable, string sheetName = "")
{IWorkbook wb = GetWorkbook(excelFilePath);if (wb == null){return false;}if (string.IsNullOrEmpty(sheetName)){if (string.IsNullOrEmpty(dataTable.TableName)){sheetName = "Sheet";}else{sheetName = dataTable.TableName;}}int numberOfSheets = wb.NumberOfSheets;if (numberOfSheets > 0){List<string> sheetNames = new List<string>();for (int sheetIdx = 0; sheetIdx < numberOfSheets; sheetIdx++){sheetNames.Add(wb.GetSheetName(sheetIdx).ToLower());}int tag = 0;string sheetTempName = sheetName;while (sheetNames.Contains(sheetTempName.ToLower())){sheetTempName = $"{sheetName}_{++tag}";}sheetName = sheetTempName;}ISheet ws = wb.CreateSheet(sheetName);IRow headerRow = ws.CreateRow(0);for (int columnIdx = 0; columnIdx < dataTable.Columns.Count; columnIdx++){string columnName = dataTable.Columns[columnIdx].ColumnName;ICell newCell = headerRow.CreateCell(columnIdx);newCell.SetCellValue(columnName);}for (int rowIdx = 0; rowIdx < dataTable.Rows.Count; rowIdx++){IRow row = ws.CreateRow(rowIdx + 1);for (int columnIdx = 0; columnIdx < dataTable.Columns.Count; columnIdx++){object value = dataTable.Rows[rowIdx][columnIdx];string cellStringValue = value?.ToString() ?? string.Empty;ICell cell = row.CreateCell(columnIdx);cell.SetCellValue(cellStringValue);}}FileStream fs = File.OpenWrite(excelFilePath);try{wb.Write(fs, false);return true;}catch (Exception ex){// 异常处理...return false;}finally {try { fs?.Close(); } catch { } }
}

3.4 DataSet 转 Excel

/// <summary>
/// DataSet 转 Excel
/// </summary>
/// <param name="excelFilePath">Excel文件路径</param>
/// <param name="dataSet">DataSet实例</param>
/// <returns>转换结果</returns>
public static bool ToExcel(string excelFilePath, DataSet dataSet)
{bool allSuccess = true;foreach (DataTable dataTable in dataSet.Tables){bool success = ToExcel(excelFilePath, dataTable);if (!success){allSuccess = false;}}return allSuccess;
}

3.5 私有方法

private static IWorkbook GetWorkbook(string excelFilePath)
{string extension = Path.GetExtension(excelFilePath);IWorkbook wb = null;FileStream fs = null;try{if (!File.Exists(excelFilePath)){if (extension == ".xlsx" || extension == "xlsx")wb = new XSSFWorkbook();else if (extension == ".xls" || extension == "xls")wb = new HSSFWorkbook();else{AppLogger.Instance.Error($"错误文件类型{extension}!");return null;}}else{fs = File.Open(excelFilePath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite);if (extension == ".xlsx" || extension == "xlsx")wb = new XSSFWorkbook(fs);else if (extension == ".xls" || extension == "xls")wb = new HSSFWorkbook(fs);else{AppLogger.Instance.Error($"错误文件类型{extension}!");return null;}}return wb;}catch (Exception ex){AppLogger.Instance.Error("读取Excel文件失败!", ex);return null;}finally { if (fs != null) try { fs.Close(); } catch { } }
}
static object? GetCellValue(ICell cell)
{if (cell == null)return null;switch (cell.CellType){case CellType.Blank: //BLANK:  return null;case CellType.Boolean: //BOOLEAN:  return cell.BooleanCellValue;case CellType.Numeric: //NUMERIC:  return cell.NumericCellValue;case CellType.String: //STRING:  return cell.StringCellValue;case CellType.Error: //ERROR:  return cell.ErrorCellValue;case CellType.Formula: //FORMULA:  default:return "=" + cell.CellFormula;}
}

cell.NumericCellValue;
case CellType.String: //STRING:
return cell.StringCellValue;
case CellType.Error: //ERROR:
return cell.ErrorCellValue;
case CellType.Formula: //FORMULA:
default:
return “=” + cell.CellFormula;
}
}

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com