在C#中切换for循环

我从excel逐行阅读。单个列标题在第二行。 但数据从第四行开始。 我想首先检查列标题,并将第四行的值分别放到关联的模型属性中。

在这里输入图像说明

所以我想在for循环中使用case语句而不是if else检查。

但是它只是在第一个案件后才打破。 我知道这是有意的,但有没有其他更有效的方法?

ListGroupMembershipUploadInput gl = new ListGroupMembershipUploadInput(); for (int rw = 4; rw <= ws.Dimension.End.Row; rw++) { //Dictionary<string, string> groupMembershipUploadDict = new Dictionary<string, string>(); int headerCol = 2; GroupMembershipUploadInput gm = new GroupMembershipUploadInput(); for (int col = ws.Dimension.Start.Column; col <= ws.Dimension.End.Column; col++) { string val = ws.Cells[headerCol, col].Value.ToString(); switch (ws.Cells[headerCol, col].Value.ToString()) { case "Code for the particular Chapter(example,'12345' )" : gm.chpt_cd = (ws.Cells[rw, col].Value ?? null).ToString(); break; case "Existing Constituent Master Id" : gm.cnst_mstr_id = (ws.Cells[rw, col].Value ?? null).ToString(); break; case "Prefix of the constituent(Mr, Mrs etc)" : gm.cnst_prefix_nm = (ws.Cells[rw, col].Value ?? null).ToString(); break; case "First Name of the constituent(Mike)" : gm.cnst_first_nm = (ws.Cells[rw, col].Value ?? null).ToString(); break; case "Middle Name of the constituent(R.)" : gm.cnst_middle_nm = (ws.Cells[rw, col].Value ?? null).ToString(); break; case "Last Name of the constituent(Andrien)" : gm.cnst_last_nm = (ws.Cells[rw, col].Value ?? null).ToString(); break; case "Address Line 1(Home) - (431 Washington Blvd)" : gm.cnst_addr1_street1 = (ws.Cells[rw, col].Value ?? null).ToString(); break; } gl.GroupMembershipUploadInputList.Add(gm); } } 

这里是我build立的模型类。

 public class GroupMembershipUploadInput { public string chpt_cd {get;set;} public string cnst_mstr_id {get;set;} public string cnst_prefix_nm {get;set;} public string cnst_first_nm {get;set;} public string cnst_middle_nm {get;set;} public string cnst_last_nm {get;set;} public string cnst_addr1_street1 {get;set;} } public class ListGroupMembershipUploadInput { public List<GroupMembershipUploadInput> GroupMembershipUploadInputList { get; set; } } 

所以我想将excel数据转换为空值的模型对象列表。

回答你的问题“还有其他更好的方法吗?”

1)如果你想使用Office Interop,逐个阅读并不是最有效的方法。 有一种人们通常不知道的不太明显的方式。

这将返回二维数组,然后你只是循环与循环。 你仍然需要手动跳过第二行,空值和处理转换。 但是这将会更快更清洁:

 Worksheets("Sheet1").Range("A1:D10").Value 

2)最有效的方法是使用OleDB,那么你不需要安装Office ,只是免费组件Microsoft Access数据库引擎2010可再发行组件 (注意:有x86和x64版本,必须马上你的应用程序)

下面是我编译的代码草稿/代码段,很可能不会起作用,但是这些都是涉及到的maine peaces。 这个想法是,你使用数据库和表格来处理excel中的数据。 最好的部分是你得到IDataReader,因此你逐行阅读行,而不是全部加载到内存中,所以除了速度,这也是RAM的方式。

 private IDataReader OpenReader() { _strConn = String.Format("Provider=Microsoft.ACE.OLEDB.12.0;Data Source={0};Extended Properties=\"Excel 12.0;HDR={1};IMEX=1;TypeGuessRows=0;ImportMixedTypes=Text\"", _fileName, Configuration.HasHeaders ? "Yes" : "No"); conn = new OleDbConnection(_strConn); conn.Open(); var schemaTable = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, new object[] { null, null, null, "TABLE" }); string sheet = schemaTable.Rows[0]["TABLE_NAME"].ToString(); var schemaTableColumns = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Columns, new object[] { null, null, sheet, null }); // I am taking 1-st sheet here for simplicity string sheetName = schemaTable .Rows[0]["TABLE_NAME"].ToString(); var cmd = new OleDbCommand(String.Format("SELECT * FROM [{0}]", sheetName), conn); cmd.CommandType = CommandType.Text; return cmd .ExecuteReader(CommandBehavior.Default); } 

PS。 我决定追求最后的select,如果需要,我可以在这里给你更多的信息。

你执行

  gl.GroupMembershipUploadInputList.Add(gm); 

内循环内。 这意味着在评估每一列之后添加对象。 所以这个对象被多次添加到列表中。

在inner for循环之后移动将对象添加到列表的行。

此外,您不要初始化ListGroupMembershipUploadInput类中的属性ListGroupMembershipUploadInput 。 所以它是空的,当试图将第一个对象添加到列表,你会得到一个NullReferenceException

您需要创build列表:

 public class ListGroupMembershipUploadInput { public List<GroupMembershipUploadInput> GroupMembershipUploadInputList { get; set; } = new List<GroupMembershipUploadInput>(); } 

你需要做这样的事情来摆脱switch语句:

 ListGroupMembershipUploadInput gl = new ListGroupMembershipUploadInput(); int headerCol = 2; Dictionary<string, int> map = Enumerable .Range(ws.Dimension.Start.Column, ws.Dimension.End.Column - ws.Dimension.Start.Column + 1) .ToDictionary(col => ws.Cells[headerCol, col].Value.ToString(), col => col); for (int rw = 4; rw <= ws.Dimension.End.Row; rw++) { gl.GroupMembershipUploadInputList.Add(new GroupMembershipUploadInput() { chpt_cd = ws.Cells[rw, map["Code for the particular Chapter(example,'12345' )"]].Value.ToString(), cnst_mstr_id = ws.Cells[rw, map["Existing Constituent Master Id"]].Value.ToString(), cnst_prefix_nm = ws.Cells[rw, map["Prefix of the constituent(Mr, Mrs etc)"]].Value.ToString(), cnst_first_nm = ws.Cells[rw, map["First Name of the constituent(Mike)"]].Value.ToString(), cnst_middle_nm = ws.Cells[rw, map["Middle Name of the constituent(R.)"]].Value.ToString(), cnst_last_nm = ws.Cells[rw, map["Last Name of the constituent(Andrien)"]].Value.ToString(), cnst_addr1_street1 = ws.Cells[rw, map["Address Line 1(Home) - (431 Washington Blvd)"]].Value.ToString(), }); } 

这有效地移动了gl.GroupMembershipUploadInputList.Add(gm); 内循环之外。

它也使你的代码更小,更容易阅读。