Как передать несколько листов Excel в виде таблицы данных при использовании ExcelDataReader?

Я хотел бы знать, как я могу передать более одного "листа" в приведенном ниже коде?
Я заполняю некоторые данные в веб-приложении, используя Selenium C#, где при заполнении информации о "Sheet1" мне нужно перейти к заполнению информации из "Sheet2". Код ниже просто переходит в "Лист 1". Как я могу улучшить его, чтобы я мог получить сразу несколько листов?

public DataTable ExcelToDataTable(string filename)    
{
    FileStream stream = File.Open(filename, FileMode.Open, FileAccess.Read);
    IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);

    DataSet result = excelReader.AsDataSet(new ExcelDataSetConfiguration()
    {
        ConfigureDataTable = (_) => new ExcelDataTableConfiguration()
        {
            UseHeaderRow = true
        }
    });

    DataTableCollection table = result.Tables;
    DataTable resultTable = table["sheet1"]; //here I'd like to have more than just one "sheet"

    return resultTable;    
}

2 ответа

Решение

Если у вас есть одна книга Excel с несколькими листами, которые вы хотите использовать каждый лист в отдельное время, я могу предложить вам использовать шаблон проектирования Singleton для хранения информации о книге Excel - с соответствующей моделью данных / запросов - и затем читать данные из этого сингтона пример.

например:

// singleton object of 
public class ExcelDataContext
{
    // creating an object of ExcelDataContext
    private static ExcelDataContext instance = new ExcelDataContext();

    // no instantiated available
    private ExcelDataContext()
    {
        FileStream stream = File.Open(filename, FileMode.Open, FileAccess.Read);
        IExcelDataReader excelReader = ExcelReaderFactory.CreateOpenXmlReader(stream);

        DataSet result = excelReader.AsDataSet(new ExcelDataSetConfiguration()
        {
            ConfigureDataTable = (_) => new ExcelDataTableConfiguration()
            {
                UseHeaderRow = true
            }
        });

        this.Sheets = result .Tables;
    }

    // accessing to ExcelDataContext singleton
    public static ExcelDataContext GetInstance()
    {
        return instance;
    }

    // the dataset of Excel
    public DataTableCollection Sheets { get; private set; }
}

Тогда вы можете использовать листы Excel следующим образом:

DataTable sheet1 = ExcelDataContext.GetInstance().Sheets["sheet1"];

и когда вам нужно прочитать данные другого листа:

DataTable otherSheet = ExcelDataContext.GetInstance().Sheets["otherSheet"];

Это не будет читать книгу Excel снова.

Предположим, что последние три строки кода могут быть заменены следующим:

for (int i = 1; i < result.Tables.Count - 1; i++) 
    result.Tables[i].Merge(result.Tables[0]);
return result.Tables[0];

Источник: Как объединить две таблицы DataSet в одну

Другие вопросы по тегам