在 Open XML SDK 中,无法直接使用 Excel.Range
和 Excel.Validation
,因为这是 VSTO (Visual Studio Tools for Office) 的概念,而不是 Open XML SDK 的概念。Open XML SDK 提供了对 Office Open XML (OOXML) 文件格式的低级访问,而不是对 Excel 对象模型的高级封装。
如果你要优化代码并提升性能,可以考虑采用更有效率的方式获取数据验证信息,而不是使用类似于 VSTO 中的 Excel.Range
和 Excel.Validation
的方式。以下是一种可能的优化方式:
using DocumentFormat.OpenXml.Packaging;
using DocumentFormat.OpenXml.Spreadsheet;// ...private static void CheckValidationValue(string filePath, int column, int rowIndex, ref List<int> columEvaluationList)
{using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(filePath, false)){WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;WorksheetPart worksheetPart = workbookPart.WorksheetParts.First(); // 假设只有一个工作表// 获取列的字母表示(A、B、C、...)string columnLetter = ExcelOperate.ExcelColumnFromNumber(column);// 获取目标单元格引用string targetCellReference = columnLetter + rowIndex;// 获取指定单元格的数据验证DataValidations dataValidations = worksheetPart.Worksheet.Descendants<DataValidations>().FirstOrDefault();if (dataValidations != null){foreach (DataValidation dataValidation in dataValidations.Elements<DataValidation>()){if (ValidationCoversCell(dataValidation, targetCellReference)){// 获取目标单元格的值string cellValue = GetCellValue(worksheetPart, targetCellReference);// 获取输入信息string inputMessage = dataValidation.PromptTitle.Text;if (!string.IsNullOrEmpty(inputMessage) && inputMessage.Contains("估值未完成")){columEvaluationList.Add(rowIndex);break;}}}}}
}private static string GetCellValue(WorksheetPart worksheetPart, string cellReference)
{Cell cell = worksheetPart.Worksheet.Descendants<Cell>().FirstOrDefault(c => c.CellReference.Value == cellReference);return cell != null ? cell.CellValue.Text : null;
}private static bool ValidationCoversCell(DataValidation dataValidation, string cellReference)
{var sqref = dataValidation.SequenceOfReferences.Text;var cellRefs = sqref.Split(' ');foreach (var cellRef in cellRefs){if (IsCellInRange(cellReference, cellRef)){return true;}}return false;
}private static bool IsCellInRange(string targetCellReference, string range)
{var rangeParts = range.Split(':');if (rangeParts.Length == 2){string startCell = rangeParts[0];string endCell = rangeParts[1];return string.Compare(targetCellReference, startCell, StringComparison.OrdinalIgnoreCase) >= 0 &&string.Compare(targetCellReference, endCell, StringComparison.OrdinalIgnoreCase) <= 0;}return false;
}
这里使用 GetCellValue
方法直接获取指定单元格的值,而不是通过 Excel.Range
。这种方式更直接,可能更高效。请根据实际情况进行测试和调整。