public void HasValidItemSpecifiersValidTests() { var structuredReference = new StructuredReference("MyTable[#Data]"); Assert.IsTrue(structuredReference.HasValidItemSpecifiers()); structuredReference = new StructuredReference("MyTable[#Headers]"); Assert.IsTrue(structuredReference.HasValidItemSpecifiers()); structuredReference = new StructuredReference("MyTable[#Totals]"); Assert.IsTrue(structuredReference.HasValidItemSpecifiers()); structuredReference = new StructuredReference("MyTable[#This row]"); Assert.IsTrue(structuredReference.HasValidItemSpecifiers()); structuredReference = new StructuredReference("MyTable[#All]"); Assert.IsTrue(structuredReference.HasValidItemSpecifiers()); structuredReference = new StructuredReference("MyTable[[#Data],[#Headers]]"); Assert.IsTrue(structuredReference.HasValidItemSpecifiers()); structuredReference = new StructuredReference("MyTable[[#Data],[#Totals]]"); Assert.IsTrue(structuredReference.HasValidItemSpecifiers()); }
/// <summary> /// Returns values from the range defined by the <paramref name="structuredReference"/>. /// </summary> /// <param name="structuredReference">The <see cref="StructuredReference"/> to resolve.</param> /// <param name="originSheet">The sheet referencing the <paramref name="structuredReference"/>.</param> /// <param name="originRow">The row referencing the <paramref name="structuredReference"/>.</param> /// <param name="originColumn">The column referencing the <paramref name="structuredReference"/>.</param> /// <returns>The <see cref="ExcelDataProvider.IRangeInfo"/> containing the referenced data.</returns> public override IRangeInfo ResolveStructuredReference(StructuredReference structuredReference, string originSheet, int originRow, int originColumn) { if (structuredReference == null || !structuredReference.HasValidItemSpecifiers()) { return(null); } var table = _package.Workbook.GetTable(structuredReference.TableName); if (table == null) { return(null); } int startRowPosition = table.Address.Start.Row; int endRowPosition = table.Address.End.Row; if (structuredReference.ItemSpecifiers.HasFlag(ItemSpecifiers.Data)) { if (table.ShowHeader && !structuredReference.ItemSpecifiers.HasFlag(ItemSpecifiers.Headers)) { startRowPosition++; } if (table.ShowTotal && !structuredReference.ItemSpecifiers.HasFlag(ItemSpecifiers.Totals)) { endRowPosition--; } } else if (structuredReference.ItemSpecifiers == ItemSpecifiers.ThisRow) { if (originRow < startRowPosition || originRow > endRowPosition || (originRow == startRowPosition && table.ShowHeader) || (originRow == endRowPosition && table.ShowTotal)) { return(null); } startRowPosition = endRowPosition = originRow; } else if (structuredReference.ItemSpecifiers == ItemSpecifiers.All) { // Already set. } else if (structuredReference.ItemSpecifiers == ItemSpecifiers.Headers) { if (!table.ShowHeader) { return(new RangeInfo(table.WorkSheet, new ExcelAddress(ExcelErrorValue.Values.Ref))); } endRowPosition = startRowPosition; } else if (structuredReference.ItemSpecifiers == ItemSpecifiers.Totals) { if (!table.ShowTotal) { return(new RangeInfo(table.WorkSheet, new ExcelAddress(ExcelErrorValue.Values.Ref))); } startRowPosition = endRowPosition; } int startColumnPosition = table.Address.Start.Column; int endColumnPosition = table.Address.End.Column; if (!string.IsNullOrEmpty(structuredReference.StartColumn) && !string.IsNullOrEmpty(structuredReference.EndColumn)) { var startColumn = table.Columns[structuredReference.StartColumn]; if (startColumn != null) { startColumnPosition += startColumn.Position; } var endColumn = table.Columns[structuredReference.EndColumn]; if (endColumn != null) { endColumnPosition = table.Address.Start.Column + endColumn.Position; } } return(new RangeInfo(table.WorkSheet, new ExcelAddress(startRowPosition, startColumnPosition, endRowPosition, endColumnPosition))); }