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

问题描述 投票:0回答:3

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

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

上面的代码只是我想法的一个示例。有什么方法可以解决我的问题吗?

c# excel openxml-sdk worksheet
3个回答
1
投票

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”属性来获取列中的列。


0
投票

你有没有试过类似的(这是为了获得一个细胞)?

Worksheet.Descendants<Cell>().SingleOrDefault(c => c.CellReference.Equals("A1"));

更新:以下代码提供工作表中的列(根据索引或名称选择所需的列)

workSheetPart.Worksheet.Descendants<Column>()

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();
}
© www.soinside.com 2019 - 2024. All rights reserved.