【问题标题】:How to read a data row from Excel with more than 255 characters如何从 Excel 中读取超过 255 个字符的数据行
【发布时间】:2011-05-12 14:51:10
【问题描述】:

问题是当我如下所示设置 DataSet 时,默认情况下仅从电子表格单元格中读取 255 个字符并将它们放入表中。

DataSet exData = new DataSet();
string connectionString = String.Format(ConnectionString, path);
OleDbDataAdapter ex = new OleDbDataAdapter(ExcelQuery, connectionString);
ex.Fill(exData);

我正在使用 Extended Properties=Excel 8.0 和 Microsoft.Jet.OLEDB.4.0,连接到 Excel 工作表没有问题。

从我的阅读来看,这是由于 Jet.OLEDB 提供程序,我应该使用什么?

我可能无法更新到新的 Jet 提供商,有什么解决方法吗?任何解决方法都将受限于不能直接修改 Excel 文档以包含超过 255 个字符的数据的两个或更多单元格。

谢谢。

【问题讨论】:

    标签: c# excel oledb


    【解决方案1】:

    使用ExcelDataReader 并在您的项目中添加引用。并使用下面的代码来读取超过 255 列的 Excel...

    FileStream stream = File.Open(strFileName, FileMode.Open, FileAccess.Read);
    IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);
    DataSet result = excelReader.AsDataSet();
    excelReader.Close();
    return result.Tables[0];
    

    【讨论】:

      【解决方案2】:

      我在这里遇到了同样的问题,我发现默认情况下,只有前 8 行用于设置列的类型。如果您在第 8 行以下的任何其他行上有​​较大的字符串,它将被截断。

      您只需要运行 Regedit 并转到:

      32 位版本:

      HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel

      或者

      64 位版本:

      HKEY_LOCAL_MACHINE\SOFTWARE\wow6432node\microsoft\jet\4.0\Engines\Excel

      在那里,将 TypeGuessRows 更改为 0,这样 Jet 引擎将使用所有行来设置数据类型。

      来源:Why SSIS always gets Excel data types wrong, and how to fix it!

      【讨论】:

      • 这个问题的解决方法可能非常有用。我们当时的解决方案是确保我们对列进行排序,以使最大的字符串位于前 8 行中。
      【解决方案3】:

      jet 中文本列的标准最大长度为 255 个字符。我还没有尝试过,但是如果您创建一个 schema.ini 文件并告诉它您的列是备忘录类型,您也许可以放入更多数据。

      【讨论】:

      • 这使我找到了将列转换为备忘录的方法。最后我们发现我们可以简单地将包含有问题的字符串的行强制到文件的顶部。此编辑使该行被视为备忘录,并产生所有信息。谢谢。
      【解决方案4】:

      here 描述了相同的问题。
      您不考虑使用 Excel 互操作的具体原因有哪些?

      【讨论】:

      • 感谢 Excel 互操作的指针!我正在尝试对现有项目进行非常小的更改。如果可以干净地插入互操作,那就太好了。目前还不能进行重大修改。
      【解决方案5】:
      • 形成以下图片可以找到如何添加Excel参考 项目中的库。

      • 从 Visual Studio 的 Project 菜单中选择 Add Reference 对话框

      • 选择 COM 左侧菜单的 Microsoft Excel 15.0 对象库并
        点击确定按钮
      • 导入参考库后,我们要初始化Excel 应用对象。

            using System;
            using System.Windows.Forms;
            using System.Runtime.InteropServices;
            using Excel = Microsoft.Office.Interop.Excel; 
        
        namespace WindowsFormsApplication4
        {
            public partial class Form1 : Form
            {
                public Form1()
                {
                    InitializeComponent();
                }
        
                private void button1_Click(object sender, EventArgs e)
                {
        
                Excel.Application xlApp ;
                Excel.Workbook xlWorkBook ;
                Excel.Worksheet xlWorkSheet ;
                Excel.Range range ;
        
                string str;
                int rCnt ;
                int cCnt ;
                int rw = 0;
                int cl = 0;
        
                xlApp = new Excel.Application();
                xlWorkBook = xlApp.Workbooks.Open(@"d:\csharp-Excel.xls", 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
                xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
        
                range = xlWorkSheet.UsedRange;
                rw = range.Rows.Count;
                cl = range.Columns.Count;
        
        
                for (rCnt = 1; rCnt  < = rw; rCnt++)
                {
                    for (cCnt = 1; cCnt  < = cl; cCnt++)
                    {
                        str = (string)(range.Cells[rCnt, cCnt] as Excel.Range).Value2;
                        MessageBox.Show(str);
                    }
                }
        
                xlWorkBook.Close(true, null, null);
                xlApp.Quit();
         }
        
        }
        

        }

      【讨论】:

      • 我们可以从 Excel 中读取超过 255 个字符的数据行
      • 这个问题是针对 Extended Properties=Excel 8.0 和 Microsoft.Jet.OLEDB.4.0 的特定场景
      • 我知道问题并且很多人已经回答了。但我正在总结的东西以不同的方式理解。
      【解决方案6】:

      数据类型长度将被限制为 255 个字符,因为 Interop 使用前八列来设置限制。

      解决这个问题的捷径是,只需将最长的列设置为 excel 中的第一列或前八列中的任何一列。这样限制将设置为最长列的限制

      【讨论】:

      • 这是正确的。正如@baguiar 指出的那样,在我给他的回复中,前 8 列可以强制将字段类型初始化为更长的类型。这是当时最简单的解决方案。虽然如果我没记错的话,新版本的 Jet 对模式定义有更好的支持。
      猜你喜欢
      • 1970-01-01
      • 2011-05-15
      • 1970-01-01
      • 2019-12-29
      • 2014-11-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多