作为标题,我想在Excel中使用OpenXML获取excel工作表中的特定列来设置隐藏属性。像那样:
var columns = worksheet.GetFirstChild<Columns>();
var column = columns.FirstOrDefault(c=>c.ColumnIndex == 4);
column.Hidden = true;
上面的代码只是我想法的一个示例。 有没有办法解决我的问题?
答案 0 :(得分:1)
每位:https://docs.microsoft.com/en-us/office/open-xml/how-to-get-a-column-heading-in-a-spreadsheet ,
实际上,workSheetPart.Worksheet.Descendants()给出了columnGroup,而不是通常意义上的列。这里的“列”用词不当,其后果是像弹出这样的问题。
一旦获得列组,就可以使用其“最小”和“最大”属性来获取其中的列。
答案 1 :(得分:0)
您是否尝试过类似的(这是为了获得一个单元格)?
Worksheet.Descendants<Cell>().SingleOrDefault(c => c.CellReference.Equals("A1"));
更新: 下面的代码给出了工作表中的列(根据索引或名称选择所需的列)
workSheetPart.Worksheet.Descendants<Column>()
答案 2 :(得分:0)
似乎没有内置的方法可以到达特定的列(顺便说一句,这与常用的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();
}