如何使用DocumentFormat.OpenXml C#获取excel工作表中的特定列?

时间:2018-03-28 10:23:33

标签: c# excel openxml-sdk worksheet

作为标题,我想在Excel中使用OpenXML获取excel工作表中的特定列来设置隐藏属性。像那样:

var columns = worksheet.GetFirstChild<Columns>();
var column = columns.FirstOrDefault(c=>c.ColumnIndex == 4);
column.Hidden = true;

上面的代码只是我想法的一个示例。 有没有办法解决我的问题?

3 个答案:

答案 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();
}