使用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
相关产品推荐
相关产品推荐

