You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.07 05:48:04