Как прочитать строку данных из Excel длиной более 255 символов - PullRequest
2 голосов
/ 12 мая 2011

Проблема заключается в том, что когда я настраиваю 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 символов.

Спасибо.

Ответы [ 6 ]

4 голосов
/ 12 июня 2015

Используйте ExcelDataReader и добавьте ссылку в свой проект.и используйте код ниже, чтобы прочитать Excel более 255 столбцов ...

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 голосов
/ 01 октября 2014

У меня была такая же проблема, и я обнаружил, что по умолчанию только первые 8 строк используются для установки типа столбца. Если у вас есть строка большего размера в любом другом ряду ниже 8-го, она будет обрезана.

Вам просто нужно запустить Regedit и перейти к:

32-битные версии:

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

Или

64-битные версии:

HKEY_LOCAL_MACHINE \ SOFTWARE \ Wow6432Node \ Microsoft \ струйного \ 4.0 \ Engines \ Excel

Там измените TypeGuessRows на 0 , чтобы Jet Engine использовал все строки для установки типа данных.

Источник: Почему службы SSIS всегда ошибаются в типах данных Excel и как это исправить!

1 голос
/ 12 мая 2011

Стандартная максимальная длина текстового столбца в струе составляет 255 символов.Я не пробовал этого, но если вы создадите файл schema.ini и скажете ему, что ваш столбец имеет тип памятки, вы можете добавить больше данных.

1 голос
/ 12 мая 2011

Та же проблема описана здесь .
Есть какая-либо конкретная причина, по которой вы не рассматриваете возможность использования взаимодействия с Excel?

0 голосов
/ 26 декабря 2018

Длина типа данных будет ограничена 255 символами, поскольку Interop использует первые восемь столбцов для установки предела.

Сокращенный подход для решения этой проблемы: просто сделайте самый длинный столбец первым или любым из первых восьми столбцов в excel .Так что предел будет установлен на самый длинный столбец

0 голосов
/ 22 декабря 2017
  • Сформируйте следующие изображения, которые вы можете найти, как добавить ссылку в Excel библиотека в вашем проекте.

  • Выберите диалоговое окно «Добавить ссылку» в меню «Проект» Visual Studio

  • Выберите Microsoft Excel 15.0 Object Library из меню COM слева и
    нажмите кнопку ОК
  • После импорта справочной библиотеки нам нужно инициализировать 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();
     }
    
    }
    

    }

...