使用 ExcelDataReader 时如何将多个 Excel 工作表作为数据 table 传递?
How to pass multiple Excel sheets as data table when using ExcelDataReader?
我想知道如何在下面的代码中传递不止一个 "sheet"?
我正在使用 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;
}
假设最后三行代码可以这样交换:
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
如果您有一个 Excel 工作簿,其中包含许多工作 sheet,并且您希望在不同的时间使用每个 sheet,我建议您使用 Singleton 设计模式来存储Excel 工作簿的信息 - 使用适当的 data/query 模型 - 然后从该单例实例中读取数据。
例如:
// 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工作sheets:
DataTable sheet1 = ExcelDataContext.GetInstance().Sheets["sheet1"];
以及当你需要读取另一个数据时sheet:
DataTable otherSheet = ExcelDataContext.GetInstance().Sheets["otherSheet"];
那将不会再次阅读 Excel 工作簿。
我想知道如何在下面的代码中传递不止一个 "sheet"?
我正在使用 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;
}
假设最后三行代码可以这样交换:
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
如果您有一个 Excel 工作簿,其中包含许多工作 sheet,并且您希望在不同的时间使用每个 sheet,我建议您使用 Singleton 设计模式来存储Excel 工作簿的信息 - 使用适当的 data/query 模型 - 然后从该单例实例中读取数据。
例如:
// 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工作sheets:
DataTable sheet1 = ExcelDataContext.GetInstance().Sheets["sheet1"];
以及当你需要读取另一个数据时sheet:
DataTable otherSheet = ExcelDataContext.GetInstance().Sheets["otherSheet"];
那将不会再次阅读 Excel 工作簿。