【问题标题】:How to import large excel file to datatable?如何将大型excel文件导入数据表?
【发布时间】:2016-04-04 14:25:13
【问题描述】:

我有一个包含 500 列的 Excel 文件。我正在使用 OLEDB 将其导入 DataTable。但 DataTable 仅包含前 255 列。我不明白为什么没有导入其余的列。

我的代码是

public DataTable ToDataTable()
{
    DataSet dsEmpMaster = new DataSet();
    DataTable dtEmpMaster = null;
    string strConnectionString;
    string strSql;
    string FileNameWithPath = String.Format("{0}\\{1}", System.IO.Path.GetDirectoryName(System.Diagnostics.Process.GetCurrentProcess().MainModule.FileName), _FileName);
    try
    {
        dtEmpMaster = new DataTable();

        strConnectionString = String.Format(@"Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=Excel 12.0;", FileNameWithPath);
        strSql = String.Format("SELECT * FROM [{0}$]", _SheetName);
        OleDbDataAdapter adpMasterData = new OleDbDataAdapter(strSql, strConnectionString);
        adpMasterData.Fill(dsEmpMaster);
        dtEmpMaster = dsEmpMaster.Tables[0];
        adpMasterData.Dispose();
    }
    catch (Exception ex)
    {
        _ExcelError = ex.Message;
    }

【问题讨论】:

标签: c# excel datatable oledbdataadapter


【解决方案1】:

OLEDB 不能支持 >256 列,有关解决方法,请参阅 this

        var file_path = @"D:\doc\excel.xlsx";
        Microsoft.Office.Interop.Excel.Application xlApp =
            new Microsoft.Office.Interop.Excel.ApplicationClass();
        // Disabling messageboxes to prevent losing control on Excel app
        xlApp.DisplayAlerts = false;
        Microsoft.Office.Interop.Excel.Workbook xlWorkBook =
            xlApp.Workbooks.Open(file_path, 0, false, 5, "", "", true,
                Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
        xlWorkBook.DoNotPromptForConvert = true;
        for (var k = 1; k <= xlWorkBook.Worksheets.Count; k++)
        {
            Microsoft.Office.Interop.Excel.Worksheet xlWorkSheet =
                (Microsoft.Office.Interop.Excel.Worksheet) this.xlWorkBook.Worksheets.get_Item(k);
            int cCnt = xlWorkSheet.Cells.Count;
            // processing all cells used, but can call named ranges
            Microsoft.Office.Interop.Excel.Range range = xlWorkSheet.UsedRange;
            for (var rCnt = 1; rCnt <= range.Rows.Count; rCnt++)
            {
                for (cCnt = 1; cCnt <= range.Columns.Count; cCnt++)
                {
                    Microsoft.Office.Interop.Excel.Range rng =
                        (Microsoft.Office.Interop.Excel.Range) range.Cells[rCnt, cCnt];
                    // do something with range
                }
            }
        }

但正如该线程中提到的那样,Interop 可能对您的需求来说太慢了,我个人还没有使用过它,但它可能值得看看像 ExcelDataReader 这样的东西

编辑:正在修复链接中的代码格式

【讨论】:

  • 你能帮我做其他选择吗
猜你喜欢
  • 1970-01-01
  • 2014-07-15
  • 1970-01-01
  • 2018-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多