Используется провайдер 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 кто знает - изменилось ли что-то в старших версиях?
Пробовал 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;
}
Кофе для программистов: как напиток влияет на продуктивность кодеров?
Рекламные вывески: как привлечь внимание и увеличить продажи
Стратегії та тренди в SMM - Технології, що формують майбутнє сьогодні
Выделенный сервер, что это, для чего нужен и какие характеристики важны?
Современные решения для бизнеса: как облачные и виртуальные технологии меняют рынок
Господа нуждаюсь в помощи, в c# WPF есть OpenFileDialog и мне нужно ограничить директорию выбора файла, то бишь юзер не должен выходить за пределы определенной...
Мне нужно отправить на определенный сервер запрос в байтах и получить ответ от сервераКак это сделать?
Проблема следующая: Не привязываются окна к маркерам, привязывается только к одному