EPPLUS:DataValidation列表的长度不能超过255个字符

这个问题在另一篇文章的基础上回答: 这里但是对于我的情况,我无法将validation值硬编码到工作表中,我根据单元格的内容从数据库中提取它们,并且需要做一个每行4列的单独validation。 有没有办法实现这一目标? 先感谢您。

// Data Validations // // Product Validation // for (int i = 2; i  o.TTSTicketNumber == ws.Cells[i, 3].Value.ToString()).Single(); var prodIds = prodExtQueryable.Where(p => p.ZoneId == ticketEntity.ZoneId && p.TicketTypeId == ticketEntity.TicketTypeId); if (ticketEntity != null) { var prodIdsList = new List(); foreach (var prodId in prodIds) { prodIdsList.Add(prodId.ProductId); } var ProductList = ProductCache.Instance.AllProducts.Where(p => prodIdsList.Contains(p.ProductId)).Select(p => new SelectListItem() { Value = p.ProductId.ToString(), Text = p.Name }); foreach (var Result in ProductList) { var product = Result.Text; val.Formula.Values.Add(product); } } } 

所以是的,因为Ernie说我所做的是添加第二张“ProductValidations”并将其设置为Hidden(取消隐藏它以检查它是否正常工作)。 然后我从DataTable加载我的数据,然后添加一些基本的EPPLUS格式。 然后,我将Rows和Insert值迭代到每个单元格的“ProductValidations”表中。 接下来,我将我的列号转换为正确的Excel列字母名称(A,AC,BCE等)然后我创建一个字符串作为Excel公式传回,该公式针对“ProductValidations”表中正确的单元格范围。 对于从服务器下载Excel文件时出现问题的任何人来说,这种guid方法对我来说也很合适。

  public ActionResult DownloadExcel(EntityReportModel erModel, string filename) { var dataResponse = iEntityViewService.LoadEntityView(new EntityViewInput { SecurityContext = SessionCache.Instance.SecurityContext, EntityViewName = "Ticket", Parameters = new Dictionary { {"MinTicketDateTime", "04/26/16"} } }); var table = dataResponse.DataSet.Tables[0]; filename = "TICKETS-" + DateTime.Now.ToString("yyyy-MM-dd--hh-mm-ss") + ".xlsx"; using (ExcelPackage pack = new ExcelPackage()) { ExcelWorksheet ws = pack.Workbook.Worksheets.Add(filename); //Add second sheet to put Validations into ExcelWorksheet productVal = pack.Workbook.Worksheets.Add("ProductValidations"); // Hide Validation Sheet productVal.Hidden = OfficeOpenXml.eWorkSheetHidden.Hidden; // Load the data from the datatable ws.Cells["A1"].LoadFromDataTable(table, true); ws.Cells[ws.Dimension.Address].AutoFitColumns(); int columnCount = table.Columns.Count; int rowCount = table.Rows.Count; // Format Worksheet// ws.Row(1).Style.Font.Bold = true; List deleteColumns = new List() { "CurrentTicketId", }; List dateColumns = new List() { "TicketDateTime", "Updated", "InvoiceDate" }; ExcelRange r; // Format Dates for (int i = 1; i <= columnCount; i++) { // if cell header value matches a date column if (dateColumns.Contains(ws.Cells[1, i].Value.ToString())) { r = ws.Cells[2, i, rowCount + 1, i]; r.AutoFitColumns(); r.Style.Numberformat.Format = @"mm/dd/yyyy hh:mm"; } } // Delete Columns for (int i = 1; i <= columnCount; i++) { // if cell header value matches a delete column if ((ws.Cells[1, i].Value != null) && deleteColumns.Contains(ws.Cells[1, i].Value.ToString())) { ws.DeleteColumn(i); } } int col = 0; int Prow = 0; int valRow = 1; // Data Validations // // Iterate over the Rows and insert Validations for (int i = 2; i-2 < rowCount; i++) { Prow = 0; col++; valRow++; // Add Validations At this row in column 7 // var ProdVal = ws.DataValidations.AddListValidation(ws.Cells[valRow, 7].Address); ProdVal.ShowErrorMessage = true; ProdVal.ErrorTitle = "Entry was invalid."; ProdVal.Error = "Please choose options from the drop down only."; var ticketEntity = ticketQueryable.Where(o => o.TTSTicketNumber == ws.Cells[i, 3].Value.ToString()).Single(); // Product Validation // var prodIds = prodExtQueryable.Where(p => p.ZoneId == ticketEntity.ZoneId && p.TicketTypeId == ticketEntity.TicketTypeId); if (ticketEntity != null) { var prodIdsList = new List(); foreach (var prodId in prodIds) { prodIdsList.Add(prodId.ProductId); } var ProductList = ProductCache.Instance.AllProducts.Where(p => prodIdsList.Contains(p.ProductId)).Select(p => new SelectListItem() { Value = p.ProductId.ToString(), Text = p.Name }); //For Each Item in the list move the row forward and add that value to the Validation Sheet foreach (var Result in ProductList) { Prow++; var product = Result.Text; productVal.Cells[Prow, col].Value = product; } // convert column name from a number to the Excel Letters ie A, AC, BCE// int dividend = col; string columnName = String.Empty; int modulo; while (dividend > 0) { modulo = (dividend - 1) % 26; columnName = Convert.ToChar(65 + modulo).ToString() + columnName; dividend = (int)((dividend - modulo) / 26); } // Pass back to sheeet as an Excel Formula to get around the 255 Char limit for Validations// string productValidationExcelFormula = "ProductValidations!" + columnName + "1:" + columnName + Prow; ProdVal.Formula.ExcelFormula = productValidationExcelFormula; } } // Save File // var fileStream = new MemoryStream(pack.GetAsByteArray()); string handle = Guid.NewGuid().ToString(); fileStream.Position = 0; TempData[handle] = fileStream.ToArray(); // Note we are returning a filename as well as the handle return new JsonResult() { Data = new { FileGuid = handle, FileName = filename } }; } } [HttpGet] public virtual ActionResult Download(string fileGuid, string fileName) { if (TempData[fileGuid] != null) { byte[] data = TempData[fileGuid] as byte[]; return File(data, "application/vnd.ms-excel", fileName); } else { //Log err return new EmptyResult(); } }