作为标题,我想在Excel中使用OpenXML获取excel工作表中的特定列来设置隐藏属性。像那样:
var columns = worksheet.GetFirstChild<Columns>();
var column = columns.FirstOrDefault(c=>c.ColumnIndex == 4);
column.Hidden = true;
上面的代码只是我想法的一个示例。有什么方法可以解决我的问题吗?
for:https://docs.microsoft.com/en-us/office/open-xml/how-to-get-a-column-heading-in-a-spreadsheet,
workSheetPart.Worksheet.Descendants()实际上给出了columnGroup,而不是常识中的列;在这里,“列”是一个用词不当,它有像这样的问题弹出的后果。
获得列组后,可以使用其“Min”和“Max”属性来获取列中的列。
你有没有试过类似的(这是为了获得一个细胞)?
Worksheet.Descendants<Cell>().SingleOrDefault(c => c.CellReference.Equals("A1"));
更新:以下代码提供工作表中的列(根据索引或名称选择所需的列)
workSheetPart.Worksheet.Descendants<Column>()
似乎没有内置的方法来到特定列(顺便说一句,这与常用的DataTable
类型相反,它具有Columns
属性)。正如here所解释的那样,除非指定了自定义列行为,否则调用Descendants<Column>()
将返回null。
所以这样做的方法是documented way,它实际上遍历了所有工作表的单元格。
// Get the cells in the specified column and order them by row.
internal List<Cell> GetColumnCells(Worksheet worksheet, string columnName)
{
var columnCells = worksheet.Descendants<Cell>()
.Where(c => string.Compare(GetColumnName(c.CellReference.Value), columnName, true) == 0)
.OrderBy(r => GetRowIndex(r.CellReference))
.ToList();
}
private string GetColumnName(StringValue cellName)
{
var regex = new Regex("[a-zA-Z]+");
var match = regex.Match(cellName);
return match.Value;
}
private uint GetRowIndex(StringValue cellName)
{
var regex = new Regex(@"\d+");
var match = regex.Match(cellName);
return uint.Parse(match.Value);
}
但是,您可以通过迭代行来改进这一点,并在获得所需列的单元格后移动到下一行:
internal List<Cell> GetColumnCells(Worksheet worksheet, string columnName)
{
var columnCells = worksheet.Descendants<Row>()
.Where(r => r.Descendants<Cell>().FirstOrDefault(c =>
string.Compare(GetColumnName(c.CellReference.Value), columnName, true) == 0)
)
.OrderBy(r => GetRowIndex(r.CellReference))
.ToList();
}