Haseeb4328 Ответов: 3

Как читать несколько листов в одном excel на C#?


Привет,

Я хочу прочитать несколько листов, которые существуют в одном файле excel. Ниже приведен мой простой код, который читает первый рабочий лист (по умолчанию), я хочу прочитать и второй. Будут изменения в аргументации, но я не знаю. Мы высоко ценим вашу помощь!

Microsoft.Office.Interop.Excel.Application app = new Microsoft.Office.Interop.Excel.Application();
            Microsoft.Office.Interop.Excel.Workbook workBook = app.Workbooks.Open(@path, 0, true, 5, "", "", true, Microsoft.Office.Interop.Excel.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
            Microsoft.Office.Interop.Excel.Worksheet workSheet = (Microsoft.Office.Interop.Excel.Worksheet)workBook.ActiveSheet;

            int index = 0;
            object rowIndex = 1;

            DataTable dt = new DataTable();
            dt.Columns.Add("Std_ID");
            dt.Columns.Add("Name");
            dt.Columns.Add("Father");
            DataRow row;

            while (((Microsoft.Office.Interop.Excel.Range)workSheet.Cells[rowIndex, 1]).Value2 != null)
            {
                rowIndex = 2 + index;
                row = dt.NewRow();
                row[0] = Convert.ToString(((Microsoft.Office.Interop.Excel.Range)workSheet.Cells[rowIndex, 1]).Value2); 
                row[1] = Convert.ToString(((Microsoft.Office.Interop.Excel.Range)workSheet.Cells[rowIndex, 2]).Value2);
                row[2] = Convert.ToString(((Microsoft.Office.Interop.Excel.Range)workSheet.Cells[rowIndex, 3]).Value2);
               
                index++;
                dt.Rows.Add(row);
            }
            app.Workbooks.Close();
            dataGridView1.DataSource = dt;

3 Ответов

Рейтинг:
24

CHill60

Во первых ваш комментарий

"which read first worksheet (by default)"
это не совсем точно - просто первый лист был активен в последний раз, когда вы сохраняли электронную таблицу ... если бы вы оставили 2-й лист видимым перед сохранением и закрытием электронной таблицы, то второй лист был бы прочитан "по умолчанию"!

Таким образом, чтобы получить доступ к первому листу намеренно, вам нужно поменять местами
Microsoft.Office.Interop.Excel.Worksheet workSheet = (Microsoft.Office.Interop.Excel.Worksheet)workBook.ActiveSheet;

для
Microsoft.Office.Interop.Excel.Worksheet workSheet = (Microsoft.Office.Interop.Excel.Worksheet)workBook.Sheets[1];

Надеюсь, теперь вы видите, что можете добраться до второго листа, изменив индекс на .Листы[2] (Обратите внимание, что листы начинаются с индекса [1], а не [0]), и что вы можете пройти через все листы, используя цикл foreach.

Кроме того, если вы не возражаете, я предлагаю следующее ... Майкрософт.Офис.Взаимодействие.Excel." разбросанный по всему вашему коду не является необходимым, если вы используете
using Microsoft.Office.Interop.Excel;

в начале. Если вы обеспокоены тем, что это может привести к конфликту с приложением в других пространствах имен, то вы можете использовать
using Excel = Microsoft.Office.Interop.Excel;
таким образом, приведенный выше пример станет
Excel.Worksheet workSheet = workBook.Sheets[1];
Гораздо легче читать.


Member 11403220

Я хочу прочитать данные листа 2 и листа 1 из одной и той же рабочей книги .Я попробовал этот путь

размер XL.Лист с WS = (ХL.Лист)ВБ.Листы[1];
размер XL.Лист с WS = (ХL.Лист)ВБ.Листы[2];

но как бы то ни было, его ошибка отображения для 2-го оператора (xl.Worksheet ws = (xl.Worksheet)wb.Sheets[1];) произошла плохая ошибка индекса.

Вы можете мне помочь ??

Я хочу прочитать данные обоих листов, то есть Лист1 и Лист2.

Это срочно, пожалуйста, помогите мне.

Рейтинг:
2

Haseeb4328

Чтобы прочитать до количества листов, нам нужно посчитать перед чтением

int count = workBook.Sheets.Count; 


Рейтинг:
1

CHill60

По какой - то причине я не вижу здесь комментария, но я получил электронное письмо с вопросом, есть ли способ читать до тех пор, пока рабочие листы больше не будут существовать-я действительно дал подсказку о том, как это сделать в решении 1 !

Однако вот вам пример

using xl = Microsoft.Office.Interop.Excel;
// ... this code under a button on my sample

xl.Application xlapp = new xl.Application();
xl.Workbook wb = xlapp.Workbooks.Open(@"c:\test.xls", 0, true, 5, "", "", true, xl.XlPlatform.xlWindows, "\t", false, false, 0, true, 1, 0);
xl.Worksheet ws = (xl.Worksheet)wb.Sheets[1];
foreach (xl.Worksheet ws1 in wb.Sheets)
{
	MessageBox.Show(ws1.Name);
	// or whatever you want to do with the worksheet	
}


Member 11403220

Я хочу прочитать данные листа 2 и листа 1 из одной и той же рабочей книги .Я попробовал этот путь

размер XL.Лист с WS = (ХL.Лист)ВБ.Листы[1];
размер XL.Лист с WS = (ХL.Лист)ВБ.Листы[2];

но как бы то ни было, его ошибка отображения для 2-го оператора (xl.Worksheet ws = (xl.Worksheet)wb.Sheets[1];) произошла плохая ошибка индекса.

Вы можете мне помочь ??

Я хочу прочитать данные обоих листов, то есть Лист1 и Лист2.

Это срочно, пожалуйста, помогите мне.

CHill60

Если ошибка находится во 2-м заявлении, то у вас просто нет 2-го листа. Смотрите решение выше