【问题标题】:How to pass multiple Excel sheets as data table when using ExcelDataReader?使用 ExcelDataReader 时如何将多个 Excel 工作表作为数据表传递?
【发布时间】:2018-07-12 10:11:21
【问题描述】:

我想知道如何在下面的代码中传递多个“表格”?
我正在使用 Selenium C# 在 Web 应用程序中填写一些数据,当“Sheet1”上的信息被填满时,我必须继续填写“Sheet2”中的信息。下面的代码只是传入“Sheet 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;    
}

【问题讨论】:

  • 您能否多次(循环)运行代码,每张纸一次?
  • 是的,我可以运行代码——在上面的代码之后我正在做的是将数据放入 c# 集合中,然后我可以从表 1 中读取信息,其中传递了一些用户名和密码等用户信息。然后从 My Web 应用程序中,我必须移动到新页面(窗口),然后将补充信息分配给同一用户,这些信息在工作表 2 上可用。不确定,我是否回答了您的问题?

标签: c# excel datatable exceldatareader


【解决方案1】:

当您有一个包含多个工作表的 Excel 工作簿并且您希望在不同的时间使用每个工作表时,我可以建议您使用单例设计模式来存储 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 工作簿。

【讨论】:

  • "filename" 已使用但从未声明.. 我不能只为 ExcelDataContext 方法添加构造函数
  • filename 是您的 Excel 文件的路径!,类似于 C:\Temp\myExcel.xlsx ;)。
【解决方案2】:

假设最后三行代码可以这样交换:

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

来源:How to combine two DataSet Tables into one

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多