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

C# 如何使用DocumentFormat.OpenXml C获取excel工作表中的特定列?,c#,excel,openxml-sdk,worksheet,C#,Excel,Openxml Sdk,Worksheet,作为标题,我想在excel工作表中使用C中的OpenXML获取一个特定列,用于设置隐藏属性。就像这样: var columns = worksheet.GetFirstChild<Columns>(); var column = columns.FirstOrDefault(c=>c.ColumnIndex == 4); column.Hidden = true; 上面的代码只是我想法的一个示例。 有什么办法可以解决我的问题吗?你有没有试过类似的办法——这是用来买手机的 Wo

作为标题,我想在excel工作表中使用C中的OpenXML获取一个特定列,用于设置隐藏属性。就像这样:

var columns = worksheet.GetFirstChild<Columns>();
var column = columns.FirstOrDefault(c=>c.ColumnIndex == 4);
column.Hidden = true;
上面的代码只是我想法的一个示例。
有什么办法可以解决我的问题吗?

你有没有试过类似的办法——这是用来买手机的

Worksheet.Descendants<Cell>().SingleOrDefault(c => c.CellReference.Equals("A1"));
更新: 下面的代码为工作表中的列提供了基于索引或名称选择所需列的选项

workSheetPart.Worksheet.Descendants<Column>()
per: ,

实际上,workSheetPart.Worksheet.subjects给出的是columnGroup,而不是一般意义上的Column;这里的专栏是一个用词不当的专栏,它会产生像这样的问题


获取列组后,可以使用其“最小”和“最大”属性获取其中的列

似乎没有内置的方法来访问特定的列,顺便说一句,这与常用的DataTable类型相反,DataTable类型具有Columns属性。如上所述,除非指定了自定义列行为,否则调用子体将返回null

这样做的方法是,它实际上会遍历工作表的所有单元格

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

嗨,这只是一种获取特定单元格的方法,而不是列。我需要从工作表中获取列的方法。是否有任何方法可以从单元格中获取列对象?我已要求您检查类似的方法,即workSheetPart.sheet.subjects.FirstOrDefaultc=>c.ColumnIndex==4;很抱歉,Column对象没有ColumnIndex,您签入代码了吗?请参见此::根据答案创建隐藏属性设置为true的新列-但请注意,您需要根据答案的第二条注释插入Columns对象,而不是将其追加到后面。