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

使用ClosedXML生成Excel出现修复提示的问题求助

ClosedXML生成Excel出现修复提示(级联下拉功能相关)

我用ClosedXML库生成Excel文件,代码运行无异常,但下载打开文件时会弹出无法解决的修复提示。移除实现级联下拉的两行代码后,提示消失,但这两行是实现单元格级联下拉的核心逻辑,不能删除。关闭修复提示后,Excel的所有功能均可正常运行。

生成代码

public async Task<IActionResult> BulkTemplate()
{
    var user = User.AsUser();
    var companyId = RouteData.Values["companyId"] is Guid guid ? guid : Guid.Parse((string)RouteData.Values["companyId"]);

    var companyTitle = "Company";
    using var ctx = _entityFrameworkContextAccessor.GetContext();
    companyTitle = ctx.Set<Company>().Find(companyId).Title;
    var employees = ctx.Set<Employee>().Where(e => e.CompanyId == companyId && !e.IsDeleted && !e.IsDisable).Select(e => e.Email).ToList();
    var projects = ctx.Set<Project>().Where(p => p.CompanyId == companyId).Select(p => new { ProjectId = p.Id, p.Title }).ToList();
    var tasks = ctx.Set<ProjectTask>().Include(t => t.Project).Where(t => t.Project.CompanyId == companyId).Select(t => new { t.ProjectId, t.Title }).ToList();

    var ms = new MemoryStream();
    var wb = new XLWorkbook();
    var ws = wb.Worksheets.Add("Timesheet");
    ws.Cell(1, 1).Value = "Company";
    ws.Cell(1, 2).Value = "Employee";
    ws.Cell(1, 3).Value = "Project";
    ws.Cell(1, 4).Value = "Task";
    ws.Cell(1, 5).Value = "Date";
    ws.Cell(1, 6).Value = "Hours";

    ws.Cell(2, 1).Value = companyTitle;
    ws.Cell(2, 5).Value = "20/10/2019";
    ws.Cell(2, 6).Value = "8";

    var wsEmployees = wb.Worksheets.Add("Employees");
    if (employees.Count > 0)
        foreach (var r in Enumerable.Range(1, employees.Count))
        {
            wsEmployees.Cell(r, 1).Value = employees[r - 1];
        }

    var wsProjects = wb.Worksheets.Add("Projects");
    wsProjects.Cell(1, 2).Value = "ProjectId";

    if (projects.Count > 0)
        foreach (var r in Enumerable.Range(1, projects.Count))
        {
            wsProjects.Cell(r, 1).Value = projects[r - 1].Title;
            wsProjects.Cell(r, 2).Value = projects[r - 1].ProjectId;
        }

    var wsTasks = wb.Worksheets.Add("Tasks");
    if (tasks.Count > 0)
        foreach (var r in Enumerable.Range(1, tasks.Count))
        {
            wsTasks.Cell(r, 1).Value = tasks[r - 1].Title;
            wsTasks.Cell(r, 2).Value = tasks[r - 1].ProjectId;
            foreach (var i in Enumerable.Range(1, projects.Count()))
            {
                if (projects[i - 1].ProjectId == tasks[r - 1].ProjectId)
                {
                    wsTasks.Cell(r, 3).Value = projects[i - 1].Title;
                }
            }
        }
    var employeeValidation = ws.Column(2).AsRange().SetDataValidation();
    employeeValidation.List(wsEmployees.Column(1).AsRange(), true);
    employeeValidation.IgnoreBlanks = true;

    var wsTasksValidation = wb.Worksheets.Add("TasksValidation");
    var range = wsTasksValidation.Range(1, 2, tasks.Count() + 1, projects.Count());
    for (int i = 1; i <= projects.Count(); i++)
    {
        range.Cell(1, i).Value = projects[i - 1].Title;
        string title = projects[i - 1].Title;
        string[] titleParts = title.Split(' ');
        string namedRange = string.Join("_", titleParts);
        var projectTasks = tasks.Where(t => t.ProjectId == projects[i - 1].ProjectId).ToList();
        var rangeNames = wsTasksValidation.Range(2, i + 1, projectTasks.Count() + 1, i + 1);
        rangeNames.AddToNamed(namedRange);
    }
    foreach (var i in Enumerable.Range(1, projects.Count()))
    {
        var project = projects[i - 1];
        var projectTasks = tasks.Where(t => t.ProjectId == project.ProjectId).ToList();
        for (int r = 1; r <= tasks.Count(); r++)
        {
            if (r <= projectTasks.Count)
            {
                var task = projectTasks[r - 1];
                range.Cell(r + 1, i).Value = task.Title;
            }
        }
    }

    wsTasksValidation.Cell(1, 1).Value = "Projects1";
    int w = 1;
    foreach (var a in projects)
    {
        wsTasksValidation.Cell(++w, 1).Value = a.Title;
    }
    wsTasksValidation.Range("A2:A" + w).AddToNamed("Projects1");
    ws.Column(3).SetDataValidation().List(wsTasksValidation.Range("Projects1"), true);
    ws.Column(4).SetDataValidation().InCellDropdown = true;
    ws.Column(4).SetDataValidation().Operator = XLOperator.Between;
    ws.Column(4).SetDataValidation().AllowedValues = XLAllowedValues.List;
    ws.Column(4).SetDataValidation().List("=INDIRECT(SUBSTITUTE(C1," + '\'' + " " + '\'' + "," + '\'' + "_" + '\'' + "))");

    wb.SaveAs(ms);
    ms.Seek(0, SeekOrigin.Begin);

    return File(ms, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet", $"timesheet.xlsx");
}

移除后提示消失的代码

ws.Column(4).SetDataValidation().AllowedValues = XLAllowedValues.List;
ws.Column(4).SetDataValidation().List("=INDIRECT(SUBSTITUTE(C1," + '\'' + " " + '\'' + "," + '\'' + "_" + '\'' + "))");

修复提示内容

  • 初始提示:我们发现文件'timesheet.xlsx'中的某些内容有问题。是否让我们尽量恢复?如果信任此工作簿的来源,请点击“是”。
  • 修复完成提示:已修复记录:数据验证已从'/xl/worksheets/sheet1.xml'部分删除。

内容的提问来源于stack exchange,提问作者Jeffrey Andres Guette Sanguino

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.10 17:40:16