C # Open XML Найти смещение строки в Excel - PullRequest
0 голосов
/ 01 января 2019

Я использую Open XML для манипулирования Excel в C #.У меня есть сценарий, в котором я хочу, чтобы номер строки объединенной ячейки с использованием значения ячейки, как показано ниже, представляет собой лист, и я передам название продукта, и он вернет смещение строки
Шаблон Excel

Ядля этого используется приведенный ниже запрос linq, но он не работает в случае объединенной ячейки

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

Row = (int)trow.RowIndex.Value;

Есть ли способ найти индекс строки объединенной ячейки

Заранее спасибо

1 Ответ

0 голосов
/ 01 января 2019

Одна из вещей, которая очень важна во время использования OpenXML, это то, что вы проверяете код, который пишете, с помощью XML-документа Office Excel.Для этого я предлагаю вам установить 7Zip и распаковать файл .Xlsx, а затем проверить содержимое Xmls внутри извлеченной папки.

Примечание: офисный файл включал несколько файлов XML, которые упакованы в один файл .Xlsx.

Затем перейдите в Xl-> Worksheet-> 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, и вы можете увидеть это в <mergeCells count="1"> в конце XML,Кроме того, я написал 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);
        }
    }
}

adn затем:

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;
}
...