我有一个测试数据模型和一本有多张纸的excel书!所有工作表都具有相同的唯一键"Test1"我有一个函数可以从具有该键名的所有工作表中获取所有数据"Test1"
现在加入后-我得到一个包含所有列名和值的表,但是现在我想以Taable1.someobject(table).columnName的方式访问某些列
测试数据表: TestData.xlsx
我试过的
码:
<pre>命名空间AutoFramework.Model.Excel
{
公共类AccessExcelData
{
public static 串 TestDataFileConnection()
{
串 Filename = "D:\\ GIT-TA \\ src \\ Automation \\ Framework \\ ExcelData \\ TestData.xlsx";
串 connectionString = 串.Format("Dsn = Excel文件; READONLY = true; DBQ = {0};", Filename);
System.Data.Odbc.OdbcCommand odbcCmd =新的System.Data.Odbc.OdbcCommand("",新的System.Data.Odbc.OdbcConnection(connectionString));
返回connectionString;
}
公共静态IList<TestDataModel>GetAllTestData(字符串键名)
{
DataSet ds = new DataSet();
DataNamesMapper<TestDataModel>映射器=新的DataNamesMapper<TestDataModel>();
DataTable dataTableALL =新的DataTable();
清单<TestDataModel> testData = new 清单<TestDataModel>();
使用(var connection = new
OdbcConnection(TestDataFileConnection())
{
connection.Open();
OdbcCommand cmd =新的OdbcCommand();
cmd.Connection =连接;
System.Data.DataTable dtSheet = null;
dtSheet = connection.GetSchema(OdbcMetaDataCollectionNames.Tables,null);
foreach(dtSheet.Rows中的DataRow行)
{
串 sheetName = row["TABLE_NAME"].ToString();
如果(!sheetName.EndsWith("$"))
继续;
//查询每个Excel工作表。
var query = 串.Format("从[{0}]中选择*,其中TestName ='{1}'",sheetName,keyName);
cmd.CommandText =查询;
DataTable dt = new DataTable();
dt.TableName = sheetName;
OdbcDataAdapter da =新的OdbcDataAdapter(cmd);
da.Fill(dt);
ds.Tables.Add(dt);
}
cmd = null;
connection.Close();
}
DataTable数据= JoinExcelDatatoOneRow(ds);
testData = mapper.Map(data).ToList();
返回testData.ToList();
}
公共静态数据表JoinExcelDatatoOneRow(DataSet ds)
{
DataTable flatTable = null;
串 ID = "TestName";
为(int i = 0; i<ds.Tables.Count;我++)
{
数据表dt = ds.Tables;
如果(i == 0)
{
flatTable = dt.AsEnumerable()。CopyToDataTable();
}
其他
{
资料栏[] columns = dt.Columns.Cast<DataColumn>().ToArray();
foreach(列中的DataColumn col)
{
如果(col.ColumnName!= ID)
{
flatTable.Columns.Add(col.ColumnName,col.DataType);
}
}
var joins = from flatTable.AsEnumerable()中的t1
在dt.AsEnumerable()中加入t2
在t1.Field<string>(ID) equals t2.Field<string>(ID)
选择新的{t1 = t1,t2 = t2};
foreach(var加入联接)
{
foreach(列中的字符串列。<DataColumn>().Select(x => x.ColumnName))
{
如果(列!= ID)
{
join.t1 [column] = join.t2 [column];
}
}
}
}
}
串[] filteredColumns = { "payLater", "portal", "delivery" };
int [] filteredIndexes = filteredColumns.Select(x =>flatTable.Columns.Cast<DataColumn>().Where(y =>x == y.ColumnName).First()。Ordinal).ToArray();
数据表filterTable =新的DataTable();
foreach(filteredIndexes中的int索引)
{
filteredTable.Columns.Add(flatTable.Columns [index] .ColumnName,flatTable.Columns [index] .DataType);
}
foreach(flatTable.AsEnumerable()中的DataRow行)
{
filteredTable.Rows.Add(filteredIndexes.Select(y => row[y]).ToArray());
};
filteredTable.AsEnumerable()。Select((x,i)=> flatTable.Rows[7]);
DataRow row1 = filterTable.AsEnumerable()。Where(x => x.Field<string>("portal") == "abc").First();
返回flatTable;
}
}
}
测试数据模型
命名空间AutoFramework.Model.Excel
{
public partial class 测试数据模型
{
public 测试数据模型() {
}
[DataNames("TestName")]
public 串 测试名 { get; set; }
[DataNames("productId")]
public int productId {get;组; }
[DataNames("orderId")]
public int orderId {get;组; }
[DataNames("designMethod")]
公共DesignMethod设计方法{get;组; }
[DataNames("signedIn")]
public bool 登录 {get;组; }
[DataNames("increaseBasketQty")]
公共布尔增加值BasketQty {get;组; }
[DataNames("signedInCMS")]
public bool signatureInCMS {get;组; }
[DataNames("editable")]
公共布尔可编辑{组; }
// [DataNames("paymentOptions")]
// public PaymentOptions paymentOption {get;组; }
[DataNames("checkInVoice")]
公共布尔checkInVoice {get;组; }
[DataNames("navigateToDesign")]
公共布尔navigationToDesign {get;组; }
[DataNames("checkOrderAuthorsie")]
公共布尔checkOrderAuthorsie {get;组; }
[DataNames("checkSplitOrder")]
公共布尔checkSplitOrder {get;组; }
[DataNames("SiteId")]
public 串 SiteId { get; set; }
[DataNames("SiteUrl")]
public 串 SiteUrl { get; set; }
[DataNames("CultureCode")]
public 串 文化守则 { get; set; }
[DataNames("SiteGroupId")]
public 串 SiteGroupId { get; set; }
[DataNames("NickName")]
public 串 昵称 { get; set; }
[DataNames("byCard")]
public 串 卡 { get; set; }
[DataNames("payLater")]
public 串 以后支付 { get; set; }
[DataNames("sliceIt")]
public 串 sliceIt { get; set; }
[DataNames("portal")]
public PaymentPortal 门户网站 { get; set; }
[DataNames("delivery")]
public static DeliveryMethod 交货{get;set;}
}
}
存取资料
var param1 = AccessExcelData.GetAllTestData("Test1");
var orderId = param [1] .orderId;
现在我要访问说的列值"payLater" as
param1.PaymentOptions.payLater
PaymentOptions函数在哪里
公共类PaymentOptions
{
public PaymentPortal 门户网站;
public DeliveryMethod交付= DeliveryMethod.Billing;
公共PaymentOptions()
{
}
public PaymentOptions(网站)
{
}
}
公共类KlarnaOptions:PaymentOptions
{
//默认-不使用默认的信用卡付款
public bool 卡 = false;
public bool 以后支付 = false;
public bool sliceIt = false;
公共KlarnaOptions()
{
门户网站 = PaymentPortal.Klarna;
}
}
现在加入后-我得到一个包含所有列名和值的表,但是现在我想以Taable1.someobject(table).columnName的方式访问某些列
测试数据表: TestData.xlsx
我试过的
码:
<pre>命名空间AutoFramework.Model.Excel
{
公共类AccessExcelData
{
public static 串 TestDataFileConnection()
{
串 Filename = "D:\\ GIT-TA \\ src \\ Automation \\ Framework \\ ExcelData \\ TestData.xlsx";
串 connectionString = 串.Format("Dsn = Excel文件; READONLY = true; DBQ = {0};", Filename);
System.Data.Odbc.OdbcCommand odbcCmd =新的System.Data.Odbc.OdbcCommand("",新的System.Data.Odbc.OdbcConnection(connectionString));
返回connectionString;
}
公共静态IList<TestDataModel>GetAllTestData(字符串键名)
{
DataSet ds = new DataSet();
DataNamesMapper<TestDataModel>映射器=新的DataNamesMapper<TestDataModel>();
DataTable dataTableALL =新的DataTable();
清单<TestDataModel> testData = new 清单<TestDataModel>();
使用(var connection = new
OdbcConnection(TestDataFileConnection())
{
connection.Open();
OdbcCommand cmd =新的OdbcCommand();
cmd.Connection =连接;
System.Data.DataTable dtSheet = null;
dtSheet = connection.GetSchema(OdbcMetaDataCollectionNames.Tables,null);
foreach(dtSheet.Rows中的DataRow行)
{
串 sheetName = row["TABLE_NAME"].ToString();
如果(!sheetName.EndsWith("$"))
继续;
//查询每个Excel工作表。
var query = 串.Format("从[{0}]中选择*,其中TestName ='{1}'",sheetName,keyName);
cmd.CommandText =查询;
DataTable dt = new DataTable();
dt.TableName = sheetName;
OdbcDataAdapter da =新的OdbcDataAdapter(cmd);
da.Fill(dt);
ds.Tables.Add(dt);
}
cmd = null;
connection.Close();
}
DataTable数据= JoinExcelDatatoOneRow(ds);
testData = mapper.Map(data).ToList();
返回testData.ToList();
}
公共静态数据表JoinExcelDatatoOneRow(DataSet ds)
{
DataTable flatTable = null;
串 ID = "TestName";
为(int i = 0; i<ds.Tables.Count;我++)
{
数据表dt = ds.Tables;
如果(i == 0)
{
flatTable = dt.AsEnumerable()。CopyToDataTable();
}
其他
{
资料栏[] columns = dt.Columns.Cast<DataColumn>().ToArray();
foreach(列中的DataColumn col)
{
如果(col.ColumnName!= ID)
{
flatTable.Columns.Add(col.ColumnName,col.DataType);
}
}
var joins = from flatTable.AsEnumerable()中的t1
在dt.AsEnumerable()中加入t2
在t1.Field<string>(ID) equals t2.Field<string>(ID)
选择新的{t1 = t1,t2 = t2};
foreach(var加入联接)
{
foreach(列中的字符串列。<DataColumn>().Select(x => x.ColumnName))
{
如果(列!= ID)
{
join.t1 [column] = join.t2 [column];
}
}
}
}
}
串[] filteredColumns = { "payLater", "portal", "delivery" };
int [] filteredIndexes = filteredColumns.Select(x =>flatTable.Columns.Cast<DataColumn>().Where(y =>x == y.ColumnName).First()。Ordinal).ToArray();
数据表filterTable =新的DataTable();
foreach(filteredIndexes中的int索引)
{
filteredTable.Columns.Add(flatTable.Columns [index] .ColumnName,flatTable.Columns [index] .DataType);
}
foreach(flatTable.AsEnumerable()中的DataRow行)
{
filteredTable.Rows.Add(filteredIndexes.Select(y => row[y]).ToArray());
};
filteredTable.AsEnumerable()。Select((x,i)=> flatTable.Rows[7]);
DataRow row1 = filterTable.AsEnumerable()。Where(x => x.Field<string>("portal") == "abc").First();
返回flatTable;
}
}
}
测试数据模型
命名空间AutoFramework.Model.Excel
{
public partial class 测试数据模型
{
public 测试数据模型() {
}
[DataNames("TestName")]
public 串 测试名 { get; set; }
[DataNames("productId")]
public int productId {get;组; }
[DataNames("orderId")]
public int orderId {get;组; }
[DataNames("designMethod")]
公共DesignMethod设计方法{get;组; }
[DataNames("signedIn")]
public bool 登录 {get;组; }
[DataNames("increaseBasketQty")]
公共布尔增加值BasketQty {get;组; }
[DataNames("signedInCMS")]
public bool signatureInCMS {get;组; }
[DataNames("editable")]
公共布尔可编辑{组; }
// [DataNames("paymentOptions")]
// public PaymentOptions paymentOption {get;组; }
[DataNames("checkInVoice")]
公共布尔checkInVoice {get;组; }
[DataNames("navigateToDesign")]
公共布尔navigationToDesign {get;组; }
[DataNames("checkOrderAuthorsie")]
公共布尔checkOrderAuthorsie {get;组; }
[DataNames("checkSplitOrder")]
公共布尔checkSplitOrder {get;组; }
[DataNames("SiteId")]
public 串 SiteId { get; set; }
[DataNames("SiteUrl")]
public 串 SiteUrl { get; set; }
[DataNames("CultureCode")]
public 串 文化守则 { get; set; }
[DataNames("SiteGroupId")]
public 串 SiteGroupId { get; set; }
[DataNames("NickName")]
public 串 昵称 { get; set; }
[DataNames("byCard")]
public 串 卡 { get; set; }
[DataNames("payLater")]
public 串 以后支付 { get; set; }
[DataNames("sliceIt")]
public 串 sliceIt { get; set; }
[DataNames("portal")]
public PaymentPortal 门户网站 { get; set; }
[DataNames("delivery")]
public static DeliveryMethod 交货{get;set;}
}
}
存取资料
var param1 = AccessExcelData.GetAllTestData("Test1");
var orderId = param [1] .orderId;
现在我要访问说的列值"payLater" as
param1.PaymentOptions.payLater
PaymentOptions函数在哪里
公共类PaymentOptions
{
public PaymentPortal 门户网站;
public DeliveryMethod交付= DeliveryMethod.Billing;
公共PaymentOptions()
{
}
public PaymentOptions(网站)
{
}
}
公共类KlarnaOptions:PaymentOptions
{
//默认-不使用默认的信用卡付款
public bool 卡 = false;
public bool 以后支付 = false;
public bool sliceIt = false;
公共KlarnaOptions()
{
门户网站 = PaymentPortal.Klarna;
}
}