You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

C#通过OleDb读取Excel列数限制问题及解决办法咨询

解决OleDb读取Excel仅加载256列的问题

这确实是OleDb驱动的常见限制问题!你遇到的256列上限,根源在于旧版Jet OLEDB驱动的设计限制——它是为Excel 97-2003(.xls格式)开发的,最多只支持256列(对应Excel里的IV列)。而你要读取的表格有700列,远远超出了这个上限,所以才会被截断。

下面是几种可行的解决方案,帮你完整导入所有列:

1. 切换到ACE OLEDB驱动

Microsoft ACE OLEDB驱动是Jet驱动的升级版,专门针对Excel 2007+(.xlsx/.xlsm等格式)开发,支持最多16384列(对应XFD列),完全能覆盖你的需求。

步骤:

  • 首先确保安装了ACE驱动:如果你的程序是32位,就安装32位的ACE驱动;64位程序对应64位驱动。
  • 修改你的连接字符串Settings.ExcelCN,替换成ACE驱动的格式:
    • 对于.xlsx文件:
      Provider=Microsoft.ACE.OLEDB.12.0;Data Source=你的Excel文件路径;Extended Properties="Excel 12.0 Xml;HDR=YES;"
      
    • 对于.xls文件:
      Provider=Microsoft.ACE.OLEDB.12.0;Data Source=你的Excel文件路径;Extended Properties="Excel 12.0;HDR=YES;"
      
    其中HDR=YES表示第一行是表头,如果你的表格没有表头,可以改成HDR=NO。

修改后,再运行你的原有代码,应该就能完整读取700列了。

2. 使用第三方Excel处理库(如EPPlus)

如果不想依赖OleDb驱动,或者部署环境不方便安装ACE驱动,推荐使用专门的.NET Excel处理库,比如EPPlus。它直接操作Excel文件,没有列数限制,用法也更灵活。

示例代码:

首先通过NuGet安装EPPlus包(注意:EPPlus 5及以上版本是商业许可,非商用场景可以选择EPPlus 4.x版本,或者确认符合其许可要求)。然后替换你的getRowData方法:

using OfficeOpenXml;
using System.Data;
using System.IO;

public static DataTable getRowData()
{
    DataTable dt = new DataTable();
    // 替换成你的Excel文件路径
    FileInfo excelFile = new FileInfo(@"C:\你的文件路径\Project_Data.xlsx");

    using (ExcelPackage package = new ExcelPackage(excelFile))
    {
        // 获取指定工作表
        ExcelWorksheet worksheet = package.Workbook.Worksheets["Project_Data"];
        if (worksheet == null)
        {
            throw new Exception("找不到名为Project_Data的工作表");
        }

        // 读取表头,添加到DataTable列
        int startCol = worksheet.Dimension.Start.Column;
        int endCol = worksheet.Dimension.End.Column;
        for (int col = startCol; col <= endCol; col++)
        {
            dt.Columns.Add(worksheet.Cells[1, col].Text);
        }

        // 读取数据行
        int startRow = worksheet.Dimension.Start.Row + 1; // 跳过表头行
        int endRow = worksheet.Dimension.End.Row;
        for (int row = startRow; row <= endRow; row++)
        {
            DataRow dataRow = dt.NewRow();
            for (int col = startCol; col <= endCol; col++)
            {
                dataRow[col - startCol] = worksheet.Cells[row, col].Text;
                // 如果需要保留数据类型,可以根据实际情况转换,比如:
                // dataRow[col - startCol] = worksheet.Cells[row, col].Value;
            }
            dt.Rows.Add(dataRow);
        }
    }

    // 添加Extract_Date列
    dt.Columns.Add("Extract_Date", typeof(string));
    foreach (DataRow row in dt.Rows)
    {
        row["Extract_Date"] = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss");
    }

    return dt;
}

这种方法不需要依赖OleDb驱动,直接解析Excel文件,能完美支持所有列的读取。

总结

  • 如果环境允许安装ACE驱动,优先选择第一种方案,改动最小,只需要修改连接字符串。
  • 如果部署环境受限,或者需要更灵活的Excel操作,推荐使用EPPlus这类第三方库。

内容的提问来源于stack exchange,提问作者user3494110

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.06 20:47:33