检索电子表格文档中隐藏行或列的列表
本主题演示如何使用 Open XML SDK for Office 中的类以编程方式检索Microsoft Excel 工作表中的隐藏行或列列表。 它包含演示此任务的示例 GetHiddenRowsOrCols
方法。
GetHiddenRowsOrCols 方法
可以使用 GetHiddenRowsOrCols
方法检索工作表中隐藏行或列的列表。 如果指定的工作表包含任何隐藏行或列的隐藏行或列 (行和列的编号从 1 开始,而不是从 0) 开始编号,则该方法返回包含隐藏行或列的每个索引的无符号整数列表。
GetHiddenRowsOrCols
方法接受三个参数:
要检查的文档的名称(字符串)。
要检查的工作表的名称(字符串)。
是检测行 (True) 还是列 (False)(布尔值)。
代码的工作方式
代码使用 <DocumentFormat.OpenXml.Packaging.SpreadsheetDocument.Open*> 方法打开文档,并指示文档应打开以供只读访问 (最终 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
属性,代码可以通过调用 GetPartById 对象的 方法检索对相应WorksheetPart属性的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 将隐藏列组折叠为单个元素,并提供 Min 描述组中第一列和最后一列的 和 Max 属性。 因此,检索隐藏列的列表的代码的开始部分与检索隐藏行的代码相同。 但是,它必须循环访问索引值 (循环访问隐藏列集合中的每个项,并将每个索引从 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);
}
}
}
示例代码
下面是 C# 和 Visual Basic 中的完整 GetHiddenRowsOrCols
代码示例。
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;
}