Получение списка скрытых строк или столбцов в документе электронной таблицы
В этом разделе показано, как использовать классы в пакете SDK Open XML для Office для программного извлечения списка скрытых строк или столбцов на листе Microsoft Excel. Он содержит пример GetHiddenRowsOrCols
метода для иллюстрации этой задачи.
Метод GetHiddenRowsOrCols
Метод можно использовать для GetHiddenRowsOrCols
получения списка скрытых строк или столбцов на листе. Метод возвращает список целых чисел без знака, содержащих каждый индекс для скрытых строк или столбцов, если указанный лист содержит скрытые строки или столбцы (строки и столбцы нумеруются начиная с 1, а не с 0). Метод GetHiddenRowsOrCols
принимает три параметра:
Имя обрабатываемого документа (строковое значение).
Имя обрабатываемого листа (строковое значение).
Требуется ли получать строки (true) или столбцы (false) (логическое значение).
Принципы работы кода
Код открывает документ с помощью метода и указывает, что документ должен быть открыт для доступа только для чтения (конечное false
значение параметра). Затем код извлекает ссылку на часть книги с помощью WorkbookPart свойства документа.
using (SpreadsheetDocument document = SpreadsheetDocument.Open(fileName, false))
{
if (document is not null)
{
WorkbookPart wbPart = document.WorkbookPart ?? document.AddWorkbookPart();
Чтобы найти скрытые сроки или столбцы, код должен сначала получить ссылку на заданный лист, определяемый именем. Это не так просто, как может показаться. Код должен просматривать все потомки типа листа свойства части Workbook книги, проверяя Name свойство каждого листа, который он находит. Обратите внимание, что во время этого поиска просто просматриваются отношения книги, но не выполняется поиск части листа. Он просто находит ссылку на Sheet объект, который содержит такие сведения, как имя и Id свойство листа. Самый простой способ выполнения этой задачи использование запроса LINQ.
Sheet? theSheet = wbPart.Workbook.Descendants<Sheet>().FirstOrDefault((s) => s.Name == sheetName);
Сведения на листе, которые вы уже получили, предоставляют Id
свойство, и, учитывая это Id
свойство, код может получить ссылку на соответствующее WorksheetPartGetPartById свойство, вызвав метод WorkbookPart объекта .
// The sheet does exist.
WorksheetPart? wsPart = wbPart.GetPartById(theSheet.Id!) as WorksheetPart;
Worksheet? ws = wsPart?.Worksheet;
Получение списка значений индекса скрытых строк или столбцов
Код использует параметр, указанный detectRows
при вызове метода , чтобы определить, следует ли извлекать сведения о строках или столбцах. Для кода, который фактически извлекает список скрытых строк, требуется только одна строка кода.
// Retrieve hidden rows.
itemList = ws.Descendants<Row>()
.Where((r) => r?.Hidden is not null && r.Hidden.Value)
.Select(r => r.RowIndex?.Value)
.Cast<uint>()
.ToList();
Получение списка скрытых столбцов немного сложнее, так как Excel сворачивает группы скрытых столбцов в один элемент и предоставляет MinMax свойства, описывающие первый и последний столбцы в группе. Поэтому код, который получает список скрытых столбцов, начинается так же, как и код, получающий скрытые строки. Однако он должен выполнять итерацию по значениям индекса (циклив каждый элемент в коллекции скрытых столбцов, добавляя каждый индекс из Min
Max
в значение включительно).
var cols = ws.Descendants<Column>().Where((c) => c?.Hidden is not null && c.Hidden.Value);
foreach (Column item in cols)
{
if (item.Min is not null && item.Max is not null)
{
for (uint i = item.Min.Value; i <= item.Max.Value; i++)
{
itemList.Add(i);
}
}
}
Пример кода
Ниже приведен полный GetHiddenRowsOrCols
пример кода на C# и Visual Basic.
static List<uint> GetHiddenRowsOrCols(string fileName, string sheetName, string detectRows = "false")
{
// Given a workbook and a worksheet name, return
// either a list of hidden row numbers, or a list
// of hidden column numbers. If detectRows is true, return
// hidden rows. If detectRows is false, return hidden columns.
// Rows and columns are numbered starting with 1.
List<uint> itemList = new List<uint>();
using (SpreadsheetDocument document = SpreadsheetDocument.Open(fileName, false))
{
if (document is not null)
{
WorkbookPart wbPart = document.WorkbookPart ?? document.AddWorkbookPart();
Sheet? theSheet = wbPart.Workbook.Descendants<Sheet>().FirstOrDefault((s) => s.Name == sheetName);
if (theSheet is null || theSheet.Id is null)
{
throw new ArgumentException("sheetName");
}
else
{
// The sheet does exist.
WorksheetPart? wsPart = wbPart.GetPartById(theSheet.Id!) as WorksheetPart;
Worksheet? ws = wsPart?.Worksheet;
if (ws is not null)
{
if (detectRows.ToLower() == "true")
{
// Retrieve hidden rows.
itemList = ws.Descendants<Row>()
.Where((r) => r?.Hidden is not null && r.Hidden.Value)
.Select(r => r.RowIndex?.Value)
.Cast<uint>()
.ToList();
}
else
{
// Retrieve hidden columns.
var cols = ws.Descendants<Column>().Where((c) => c?.Hidden is not null && c.Hidden.Value);
foreach (Column item in cols)
{
if (item.Min is not null && item.Max is not null)
{
for (uint i = item.Min.Value; i <= item.Max.Value; i++)
{
itemList.Add(i);
}
}
}
}
}
}
}
}
return itemList;
}