ClosedXML Webform读取Excel时foreach循环执行两次问题求助
问题根因
你的代码中存在readExcelFile()方法的重复调用逻辑,这是导致内容拼接两次的核心原因:
- 首先你在扩展名校验方法
checkFileExtension()的合法分支中,已经主动执行了一次readExcelFile() - 随后在按钮点击事件
Button1_Click中,当checkFileExtension()返回true时,你又调用了一次readExcelFile()
因为serials是页面类的全局变量,第一次读取Excel后已经拼接了全量内容,第二次读取会在原有基础上再追加一遍相同内容,所以看起来循环执行了两次。而GridView每次绑定都会先清空旧数据源再赋值新的,两次绑定的数据源完全一致,所以前端展示看不出异常。
修复方案
直接删除checkFileExtension()方法合法分支中的readExcelFile()调用即可,仅保留按钮点击事件中的那一次调用。
修改后的checkFileExtension()参考代码:
private bool checkFileExtension() { String[] allowedExtensions = { "xls", "xlsx" }; String ext = System.IO.Path.GetExtension(FileUpload1.PostedFile.FileName); bool isValidFile = false; for (int i = 0; i < allowedExtensions.Length; i++) { if (ext == "." + allowedExtensions[i]) { isValidFile = true; } } if (!isValidFile) { error1.Text = "Allowed FileTypes are .xls/.xlsx"; return isValidFile; } else { // 删掉这里的readExcelFile()调用即可 return isValidFile; } }
额外优化建议
如果想要避免全局变量累积旧数据的问题,也可以在gettingAllSerialsIntoArrayToJSON方法开头先清空serials变量,再开始拼接内容,避免之前的旧值影响:
private void gettingAllSerialsIntoArrayToJSON(DataTable dt) { serials = ""; // 先清空变量再拼接 System.Diagnostics.Debug.WriteLine("after printing: " + dt.Rows.Count); for (int i = 0; i < dt.Rows.Count; i++) { for (int j = 0; j < dt.Columns.Count; j++) { serials += i + "-" + j + " : " + dt.Rows[i][j].ToString() + "END LINE "; } } error1.Text = serials; }
内容的提问来源于stack exchange,提问作者gorgeusDev
相关产品推荐
相关产品推荐

