Как извлечь данные из Excel (.xslx) файла в двухмерный массив (по столбцам)?

Здравствуйте.

Есть файл расширения .xslx (Excel). В этом файле, на "Листе 1", есть несколько столбцов заполненных данными:

a904e465c0664f338a8400a2f84c5a5c.png

Мне нужно эти данные из заранее заданного диапазона ячеек B1:C17 извлечь в двухмерный массив.

Как можно извлечь данные из этого (заданного) диапазона ячеек, не по одной ячейке, а к примеру, по столбцам?

Я хочу сразу считывать по столбцам по причине того, что данных у меня гораздо больше, чем приведено на фотографии.

P.S. Знаю, что близкие темы уже обсуждались в интернете, но я так и не нашел кода который подошел бы к моему случаю.
  • Вопрос задан
  • 17763 просмотра
Решения вопроса 1
@ERAFY Автор вопроса
Сделал!
Вернее нашел решения вот тут: stackoverflow.com и вот тут csharpcoderr.com и немного переделал.

Нижеприведенный программный код (написанный на языке C#) считывает данные из указанного столбца таблицы Excel (целиком весь столбец сразу) и записывает в одномерный массив strArray. Тип данных, хранимых в результирующем одномерном массиве - string.

//Создаём приложение.
        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 = 2;
    
        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();

где:
1) pathToFile - путь к Excel файлу.
Можно указать нижеприведенным способом:
string pathToFile = @"C:\Users\alexey\data.xlsx";

2) numCol - номер столбца в таблице Excel из которого будет происходить чтение данных.

Если нужно будет преобразовать все полученные элементы одномерного массива strArray из типа данных string к другому типу данных, к примеру double, то это можно сделать нижеприведенным кодом:
// Преобразование всех элементов одномерного массива 
        // strArray из строкового типа в тип double.
        for (int i = 0; i < strArray.Length; i++)
            DataArray[i] = Convert.ToDouble(strArray[i]);
Ответ написан
Пригласить эксперта
Ответы на вопрос 6
Rou1997
@Rou1997
Для работы с xlsx - библиотеки SpreadsheetLight, NPOI, OpenXML SDK, а также можно взаимодействовать с MS Excel через COM, и еще OleDb по аналогии с MDB/AccDB (Access)

но я так и не нашел кода который подошел бы к моему случаю.

А изучить библиотеку и доработать код для своего случая, наивный чукча?
Ответ написан
Комментировать
@SergeyNN
Если это разовая операция, то можно сохранить excel-файл в текстовый и распарсить.
Ответ написан
Комментировать
kostyaostapuk
@kostyaostapuk
Это консольное приложение?
Ответ написан
DarkRaven
@DarkRaven
разработка программного обеспечения
Если единоразовая операция, сохраняете файл в формат Таблица XML 2003 и спокойно работаете с ним как с XML. Там вообще все элементарно, через XPathNavigator можно спокойно размотать документ как угодно.

Еще вариант - использовать провайдер Microsoft.ACE.OLEDB.12.0.
Там такая строка подключения:
Provider=Microsoft.ACE.OLEDB.12.0; Data Source=NameOfFile.xlsx;Extended Properties="Excel 12.0;HDR=No;IMEX=1"

Вот тут пишут:
stackoverflow.com/questions/6649363/microsoft-ace-...

Оба варианта использовал - первый на PHP, второй на .NET - работают прекрасно.
Ответ написан
Комментировать
excelok
@excelok
по моему, эту задачу можно относительно просто решить через Power Query в Excel. Только Ваши данные нужно будет сохранить как одну таблицу, причем в виде т.н. "умной таблице". Готового пошагового решения так вот сходу не дам, но вероятность 95%, что это делается в Power Query
Ответ написан
Комментировать
HALIF_91
@HALIF_91
ExcelPackage (через nuget) для чтения файлов Excel 2007/2010/2013/2016 (формат Office Open XML, xlsx)
ExcelPackage.LicenseContext = LicenseContext.NonCommercial;
            FileInfo info = new FileInfo("input.xlsx");
            using (ExcelPackage xlPackage = new ExcelPackage(info))
            {
                // get the first worksheet in the workbook
                ExcelWorksheet worksheet = xlPackage.Workbook.Worksheets[0];
                
                // output the data in column 2
                for (int iCol = 2; iCol < 4; iCol++)
                {
                    for (int iRow = 1; true; iRow++)
                    {
                        if (string.IsNullOrWhiteSpace(worksheet.GetValue(iRow, iCol) as string))
                            break;
                        Console.WriteLine("Cell({0},{1}).Value={2}", iRow, iCol, 
                                worksheet.GetValue(iRow, iCol));
                    }
                }
            }
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы