c#利用NPOI读取Excel转为DataTable

不多说直接上代码

代码参考自网络

/// <summary>
/// xxc定制优化后
/// Excel导入成Datable
/// </summary>
/// <param name="file">导入路径(包含文件名与扩展名)</param>
/// <returns></returns>
public static DataTable ExcelToTable(string file)
{
    try
    {
        DataTable dt = new DataTable();
        IWorkbook workbook;
        string fileExt = Path.GetExtension(file).ToLower();
        using (FileStream fs = new FileStream(file, FileMode.Open, FileAccess.Read))
        {
            //XSSFWorkbook 适用XLSX格式,HSSFWorkbook 适用XLS格式
            if (fileExt == ".xlsx") { workbook = new XSSFWorkbook(fs); } else if (fileExt == ".xls") { workbook = new HSSFWorkbook(fs); } else { workbook = null; }
            if (workbook == null) { return null; }
            ISheet sheet = workbook.GetSheetAt(0);

            //表头  
            IRow header = sheet.GetRow(sheet.FirstRowNum);
            List<int> columns = new List<int>();
            for (int i = 0; i < header.LastCellNum; i++)
            {
                object obj = GetValueType(file, workbook, header.GetCell(i));
                if (obj == null || obj.ToString() == string.Empty)
                {
                    //xxc20220613遇空列,停止读取列
                    break;
                    //dt.Columns.Add(new DataColumn("Columns" + i.ToString()));
                }
                else
                    dt.Columns.Add(new DataColumn(obj.ToString()));
                columns.Add(i);
            }
            //数据  
            for (int i = sheet.FirstRowNum + 1; i <= sheet.LastRowNum; i++)
            {
                DataRow dr = dt.NewRow();
                bool hasValue = false;
                foreach (int j in columns)
                {
                    try
                    {
                        dr[j] = GetValueType(file, workbook, sheet.GetRow(i).GetCell(j));
                        if (dr[j] != null && dr[j].ToString() != string.Empty)
                        {
                            hasValue = true;
                        }
                    }
                    catch (Exception ee)
                    {
                        continue;
                    }

                }

                if (hasValue)
                {
                    dt.Rows.Add(dr);
                }
                else
                {
                    //xxc20220613遇空行,停止读取行
                    break;
                }
            }
        }
        return dt;
    }
    catch (Exception e)
    {
        return null;
    }

}





/// <summary>
        /// 获取单元格类型
        /// </summary>
        /// <param name="cell"></param>
        /// <returns></returns>
private static object GetValueType(string strFileName, IWorkbook workbook, 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:
            object rv = null;
            if (Path.GetExtension(strFileName).ToLower().Trim() == ".xlsx")
            {
                XSSFFormulaEvaluator eva = new XSSFFormulaEvaluator(workbook);
                if (eva.Evaluate(cell).CellType == CellType.Numeric)
                {
                    rv = eva.Evaluate(cell).NumberValue;
                }
                else
                {
                    rv = eva.Evaluate(cell).StringValue;
                }
            }
            else
            {
                HSSFFormulaEvaluator eva = new HSSFFormulaEvaluator(workbook);
                if (eva.Evaluate(cell).CellType == CellType.Numeric)
                {
                    rv = eva.Evaluate(cell).NumberValue;
                }
                else
                {
                    rv = eva.Evaluate(cell).StringValue;
                }
            }
            return rv;
        default:
            return "=" + cell.CellFormula;
    }
}


  • 2
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
可以使用NPOI库来读取Excel文件并将其转换为DataTable对象。以下是示例代码: ```csharp using NPOI.HSSF.UserModel; using NPOI.SS.UserModel; using NPOI.XSSF.UserModel; using System.Data; using System.IO; public static DataTable ReadExcelToDataTable(string filePath, bool isFirstRowHeader = true) { DataTable dataTable = new DataTable(); using (FileStream fileStream = new FileStream(filePath, FileMode.Open, FileAccess.Read)) { IWorkbook workbook = null; if (Path.GetExtension(filePath) == ".xls") { workbook = new HSSFWorkbook(fileStream); } else if (Path.GetExtension(filePath) == ".xlsx") { workbook = new XSSFWorkbook(fileStream); } if (workbook != null) { ISheet sheet = workbook.GetSheetAt(0); IRow headerRow = sheet.GetRow(0); int cellCount = headerRow.LastCellNum; for (int i = headerRow.FirstCellNum; i < cellCount; i++) { ICell cell = headerRow.GetCell(i); if (cell != null) { string columnName = isFirstRowHeader ? cell.StringCellValue : "Column" + i; DataColumn column = new DataColumn(columnName); dataTable.Columns.Add(column); } } int rowCount = sheet.LastRowNum; for (int i = (isFirstRowHeader ? 1 : 0); i <= rowCount; i++) { IRow row = sheet.GetRow(i); if (row != null) { DataRow dataRow = dataTable.NewRow(); for (int j = row.FirstCellNum; j < cellCount; j++) { if (row.GetCell(j) != null) { dataRow[j] = row.GetCell(j).ToString(); } } dataTable.Rows.Add(dataRow); } } } } return dataTable; } ``` 使用方法: ```csharp DataTable dataTable = ReadExcelToDataTable("path/to/excel/file.xlsx"); ``` 其中,`isFirstRowHeader`参数表示Excel表格的第一行是否为表头。如果为`true`,则会将第一行作为表头。如果为`false`,则会自动为每一列生成一个列名。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值