c# - чтение Excel,oledb

319
26 июля 2017, 19:42

Используется провайдер Microsoft.ACE.OLEDB.12.0 для чтения файла Excel. Прочиталось только 255 колонок. Гугл подсказывает не по теме.

код:

string ConnectionString = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=\"Excel 8.0;HDR=No;IMEX=1\"; Data Source={0}", filename);            DataSet ds = new DataSet("EXCEL");
OleDbConnection cn = new OleDbConnection(ConnectionString);
cn.Open();
string select = String.Format("SELECT * FROM [{0}]", sheetName);
OleDbDataAdapter ad = new OleDbDataAdapter(select, cn);
ad.Fill(ds);
DataTable tb = ds.Tables[0];
return tb;

UPD выяснилось, что это ограничение Microsoft.ACE.OLEDB.12.0 кто знает - изменилось ли что-то в старших версиях?

Answer 1

Пробовал Interop Excel (очень медленно даже для таблицы 300х50 - около минуты), ExcelDataReader - не читал в нужном файле дальше 4й колонки.

Остановился на NPOI с http://npoi.codeplex.com/ - читает довольно шустро

вот код получения всех данных с первого листа:

using NPOI.HSSF.UserModel;
using NPOI.SS.UserModel;
using NPOI.XSSF.UserModel;

//................
    private DataTable GetFromExcel_NPOI(string filename)
    {
        XSSFWorkbook xssfwb = null;
        HSSFWorkbook hssfwb = null;
        using (FileStream file = new FileStream(filename, FileMode.Open, FileAccess.Read))
        {
            if (Path.GetExtension(filename).ToUpper() == ".XLS")
                hssfwb = new HSSFWorkbook(file); // для старого формата другой класс
            else
                xssfwb = new XSSFWorkbook(file);
        }
        ISheet sheet = null;
        // берем первый лист
        if (xssfwb != null) sheet = xssfwb.GetSheetAt(0); 
        else sheet = hssfwb.GetSheetAt(0);
        DataTable dt = new DataTable();
        IRow headerRow = sheet.GetRow(0); // кол-во столбцов будем смотреть по первой строчке
        IEnumerator rows = sheet.GetRowEnumerator();
        int colCount = headerRow.LastCellNum;
        int rowCount = sheet.LastRowNum; 
        // создаем шапку - генерируем имена столбцов (эта таблица не содержит шапки)
        for (int c = 0; c < colCount; c++)
            dt.Columns.Add(string.Format("F{0}", c), typeof(string));
        rows.Reset(); // необязательно, но для страховки оставил
        while (rows.MoveNext())
        {
            IRow row = (IRow)rows.Current;
            DataRow dr = dt.NewRow();
            bool bEmptyRow = true; // это для того, чтобы пропускать пустые строки 
            for (int i = 0; i < colCount; i++)
            {
                ICell cell = row.GetCell(i);
                if (cell != null)
                {
                    bEmptyRow = bEmptyRow && string.IsNullOrEmpty(cell.ToString());
                    dr[i] = cell.ToString();
                }
            }
            if(!bEmptyRow) dt.Rows.Add(dr);
        }
        return dt;
    }
READ ALSO
OpenFileDialog ограничения

OpenFileDialog ограничения

Господа нуждаюсь в помощи, в c# WPF есть OpenFileDialog и мне нужно ограничить директорию выбора файла, то бишь юзер не должен выходить за пределы определенной...

223
Как получить ответ от сервера в байтах?

Как получить ответ от сервера в байтах?

Мне нужно отправить на определенный сервер запрос в байтах и получить ответ от сервераКак это сделать?

188
Сохранение страницы\файла WEB+JS

Сохранение страницы\файла WEB+JS

Всем доброго времени суток!

350
Информационные окна google map 3.0

Информационные окна google map 3.0

Проблема следующая: Не привязываются окна к маркерам, привязывается только к одному

344