C# 打开 XML 查找 Excel 的行偏移量

C# Open XML Find Row Offset of Excel

我在 C# 中使用 Open XML 进行 excel 操作。 我有这样一种情况,我希望使用如下单元格值的合并单元格的行号是 sheet,我将传递产品名称,它将 return 其行偏移量
Excel Template

我正在为此使用下面的 linq 查询,但它在合并单元格的情况下不起作用

Row trow= worksheetPart.Worksheet.Descendants<Row>().Where(r=>r.InnerText==ProductName).FirstOrDefault();

Row = (int)trow.RowIndex.Value;

有没有办法找到合并单元格的行索引

提前致谢

在使用 OpenXML 期间非常重要的一件事是您使用 Office Excel.[=46] 的 XML 输出检查您正在编写的代码=] 为此,我建议您安装 7Zip 并提取 .Xlsx 文件,然后检查提取文件夹中的 Xmls 内容。

Note: an office file included multiple XML files which packed as a single .Xlsx file.

然后转到Xl->工作表->Sheet1.xml

那么你可以看到这样一个 XML :

<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships" xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006" mc:Ignorable="x14ac" xmlns:x14ac="http://schemas.microsoft.com/office/spreadsheetml/2009/9/ac">
    <dimension ref="A1:A4"/>
    <sheetViews>
        <sheetView tabSelected="1" workbookViewId="0">
            <selection sqref="A1:A4"/>
        </sheetView>
    </sheetViews>
    <sheetFormatPr defaultRowHeight="15" x14ac:dyDescent="0.25"/>
    <sheetData>
        <row r="1" spans="1:1" x14ac:dyDescent="0.25">
            <c r="A1" s="1" t="s">
                <v>0</v>
            </c>
        </row>
        <row r="2" spans="1:1" x14ac:dyDescent="0.25">
            <c r="A2" s="1"/>
        </row>
        <row r="3" spans="1:1" x14ac:dyDescent="0.25">
            <c r="A3" s="1"/>
        </row>
        <row r="4" spans="1:1" x14ac:dyDescent="0.25">
            <c r="A4" s="1"/>
        </row>
    </sheetData>
    <mergeCells count="1">
        <mergeCell ref="A1:A4"/>
    </mergeCells>
    <pageMargins left="0.7" right="0.7" top="0.75" bottom="0.75" header="0.3" footer="0.3"/>
</worksheet>

在这个 excel 文件中,我已将 A1 合并到 A4,您可以在 XML 末尾的 <mergeCells count="1"> 中看到。另外,我在合并的单元格中写了 Hello

所以,我相信为了检查合并单元格,你应该使用某种方式。

在解压出来的文件夹里面的文件SharedString.xml里面,可以看到:

<sst xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main" count="1" uniqueCount="1"><si><t>Hello</t></si></sst>

因此您可以看到 count 属性的值等于 <mergeCells /> 标记的 count 值。

这些介绍告诉您 OpenXml 只是一个合适的库,它只解析 XML。

如果你看到下面的代码是我通过阅读 XML 文件并注意变量名称而编写的,你会发现我只是试图通过 XML 标签并找到我正确的值。

using (SpreadsheetDocument document = SpreadsheetDocument.Open(@"D:\test.xlsx", true))
{
    WorkbookPart wbPart = document.WorkbookPart;
    List<WorksheetPart> wsParts = wbPart.WorksheetParts.ToList();
    if (wsParts != null && wsParts.Any())
    {
        WorksheetPart SheetPart1 = wsParts.First();
        MergeCells mergeCells = SheetPart1.Worksheet.Elements<MergeCells>().First();
        foreach (MergeCell mergeCell in mergeCells)
        {
            string[] mergedRow = mergeCell.Reference.Value.Split(new string[]{":"},StringSplitOptions.None);
            Cell theCell = SheetPart1.Worksheet.Descendants<Cell>().
                Where(c => c.CellReference == mergedRow[0]).FirstOrDefault();
            string value = GetCellValue(document, theCell);
        }
    }
}

然后:

public string GetCellValue(SpreadsheetDocument document, Cell cell)
{
    SharedStringTablePart stringTablePart = document.WorkbookPart.SharedStringTablePart;
    string value = string.Empty;
    if (cell.CellValue != null)
    {
        value = cell.CellValue.InnerXml;
        if (cell.DataType != null && cell.DataType.Value == CellValues.SharedString)
        {
            value = stringTablePart.SharedStringTable.ChildElements[Int32.Parse(value)].InnerText;
        }

    }
    return value;
}