С# взять столбец из excel и положить в список.

Remart

Client
Регистрация
06.10.2016
Сообщения
49
Благодарностей
10
Баллы
8
Други, всем привет.

Понимаю, звучит по идиотски но у меня уже истерика.
1. В проекте есть еще несколько файлов и таблиц. И я спокойно через кубик, файл привязываю к таблице, а из таблице кубиком переношу нужный столбец в список. Работает везде кроме 1 таблицы, которая отличается от предыдущий только тем, что в столбце формулы и значения.
При быстром просмотре таблицы, я вижу значения .. все ок, при нажатии на пред. просмотр, таблица как будто свернута и соответственно при переносе в список переносится пустота.
2. Стоит мне что-то поменять в настройках таблицы .. 1 строка заголовок, любую галку поставить, сразу таблица воспринимается и все работает.
3. В итоге пришел к тому что нужно через C# и не лохматить бабушку.
Итого добавил библиотеку MS Office interop Excel
Написал код
string pathToFile = @"C:\Users\Win10Pro\1урлы.xlsx";

//Создаём приложение.
Microsoft.Office.Interop.Excel.Application ObjExcel = new Microsoft.Office.Interop.Excel.Application();
//Открываем книгу.
Microsoft.Office.Interop.Excel.Workbook ObjWorkBook = ObjExcel.Workbooks.Open(pathToFile, 0, false, 5, "", "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);
//Выбираем таблицу(лист).
Microsoft.Office.Interop.Excel.Worksheet ObjWorkSheet;
ObjWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)ObjWorkBook.Sheets[1];

// Указываем номер столбца (таблицы Excel) из которого будут считываться данные.
int numCol = 1;

Range usedColumn = ObjWorkSheet.UsedRange.Columns[numCol];
System.Array myvalues = (System.Array)usedColumn.Cells.Value2;
string[] strArray = myvalues.OfType<object>().Select(o => o.ToString()).ToArray();

// Выходим из программы Excel.
ObjExcel.Quit();

На что получаю ошибку компиляции по диапазону
Компиляция кода Ошибка в действии "CS0122" "'Range' is inaccessible due to its protection level". [Строка: 15; Cтолбец: 1]
Т.е. тут
System.Array myvalues = (System.Array)usedColumn.Cells.Value2;

Кто понимает, что окаянный от меня хочет?
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 761
Благодарностей
2 401
Баллы
113
Попробуйте вместо Range написать var.
Или указать полный путь к Range из нужной dll.
 

Remart

Client
Регистрация
06.10.2016
Сообщения
49
Благодарностей
10
Баллы
8
...
var usedColumn = ObjWorkSheet.UsedRange.Columns[numCol];
System.Array myvalues = (System.Array)usedColumn.Cells.Value2;
string[] strArray = myvalues.OfType<object>().Select(o => o.ToString()).ToArray();
...
Компиляция кода Ошибка в действии "CS1061" "'object' does not contain a definition for 'Cells' and no accessible extension method 'Cells' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)". [Строка: 15; Cтолбец: 50]
Вот тут Cells не нравиться (System.Array)usedColumn.Cells.Value2;
 

Remart

Client
Регистрация
06.10.2016
Сообщения
49
Благодарностей
10
Баллы
8
Тут мысль пришла, может из-за каких-то ограничений по количеству строк? Типо нужно добавить, чтобы брать не весь столбец а например до 50 строки ...
 

BAZAg

Client
Регистрация
08.11.2015
Сообщения
1 761
Благодарностей
2 401
Баллы
113
...
var usedColumn = ObjWorkSheet.UsedRange.Columns[numCol];
System.Array myvalues = (System.Array)usedColumn.Cells.Value2;
string[] strArray = myvalues.OfType<object>().Select(o => o.ToString()).ToArray();
...
Компиляция кода Ошибка в действии "CS1061" "'object' does not contain a definition for 'Cells' and no accessible extension method 'Cells' accepting a first argument of type 'object' could be found (are you missing a using directive or an assembly reference?)". [Строка: 15; Cтолбец: 50]
Вот тут Cells не нравиться (System.Array)usedColumn.Cells.Value2;
var привел тип данных к object.
А object не содержит Cells.
Из-за чего var не подходит - нужно указать правильный тип данных.
Я эту библиотеку не устанавливал - но если укажете полный тип данных, то должно сработать.
Вы же указали тип System.Array а не Array, точно также нужно Что-то.Range а не Range.
 

Remart

Client
Регистрация
06.10.2016
Сообщения
49
Благодарностей
10
Баллы
8
var привел тип данных к object.
А object не содержит Cells.
Из-за чего var не подходит - нужно указать правильный тип данных.
Я эту библиотеку не устанавливал - но если укажете полный тип данных, то должно сработать.
Вы же указали тип System.Array а не Array, точно также нужно Что-то.Range а не Range.
В итоге пришел во к такому решению

// Путь к файлу Excel

string pathToFile = @"C:\Users\Win10Pro\....файл-1.xlsx";

// Лист, куда будем импортировать

var list1 = project.Lists["Import_excel_temp1"];

//Создаём приложение.

Microsoft.Office.Interop.Excel.Application ObjExcel = new Microsoft.Office.Interop.Excel.Application();

//Открываем книгу.

Microsoft.Office.Interop.Excel.Workbook ObjWorkBook = ObjExcel.Workbooks.Open(pathToFile, 0, false, 5, "", "", false, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "", true, false, 0, true, false, false);

//Выбираем таблицу(лист).

Microsoft.Office.Interop.Excel.Worksheet ObjWorkSheet;

ObjWorkSheet = (Microsoft.Office.Interop.Excel.Worksheet)ObjWorkBook.Sheets[1];

// Получаем диапазон ячеек для второго столбца

Microsoft.Office.Interop.Excel.Range range = (Microsoft.Office.Interop.Excel.Range)ObjWorkSheet.Columns[2];

object[,] values = (object[,])range.Value2;

if (values != null)

{

for (int i = 1; i <= values.GetLength(0); i++)

{

string cellValue = values[i, 1]?.ToString();

list1.Add(cellValue);

}

}


ObjWorkBook.Close();

ObjExcel.Quit();

// Выводим содержимое списка list1

foreach (var item in list1)

{

Console.WriteLine(item);

}
 
  • Спасибо
Реакции: BAZAg

Кто просматривает тему: (Всего: 1, Пользователи: 0, Гости: 1)