打开XML-读取某些Excel单元格

时间:2019-03-08 10:30:00

标签: c# openxml

我需要使用OpenXML循环.xlsx行。当单元格值匹配我的字符串时,我需要从下一列同一行的单元格中读取值。这是我到目前为止的内容:

using (FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
    using (SpreadsheetDocument doc = SpreadsheetDocument.Open(fs, false))
    {
        WorkbookPart workbookPart = doc.WorkbookPart;
        SharedStringTablePart sstpart = workbookPart.GetPartsOfType<SharedStringTablePart>().First();
        SharedStringTable sst = sstpart.SharedStringTable;
        WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
        Worksheet sheet = worksheetPart.Worksheet;
        var rows = sheet.Descendants<Row>();

        foreach (Row row in rows)
        {
            foreach (Cell c in row.Elements<Cell>())
            {
                if ((c.DataType != null) && (c.DataType == CellValues.SharedString))
                {
                    int ssid = int.Parse(c.CellValue.Text);
                    string str = sst.ChildElements[ssid].InnerText;

                    if (str == "Date of birth:")
                    {
                        Cell next_cell = row.Descendants<Cell>().ElementAt(ssid + 1);
                        MessageBox.Show(next_cell.CellValue.Text);
                    }
                }
            }
        }
    }
}

这不能显示正确单元格中的值,因此请有人指出我正确的方法来在OpenXML中执行此操作。

编辑:很高兴也知道如何在循环外定义单元格。

1 个答案:

答案 0 :(得分:0)

找到正确的Row后,您将使用共享字符串表(ssid)中的索引,而不是Row的索引。

有多种解决方法,但实际上,您需要转到下一个Row获取值,而不是碰巧匹配下一个共享字符串索引的Row

最接近您当前代码的方法是在循环时保持单元格索引不变,并使用该索引来索引Row

using (FileStream fs = new FileStream(filepath, FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
{
    using (SpreadsheetDocument doc = SpreadsheetDocument.Open(fs, false))
    {
        WorkbookPart workbookPart = doc.WorkbookPart;
        SharedStringTablePart sstpart = workbookPart.GetPartsOfType<SharedStringTablePart>().First();
        SharedStringTable sst = sstpart.SharedStringTable;
        WorksheetPart worksheetPart = workbookPart.WorksheetParts.First();
        Worksheet sheet = worksheetPart.Worksheet;
        var rows = sheet.Descendants<Row>();

        foreach (Row row in rows)
        {
            int cellIndex = 0;

            foreach (Cell c in row.Elements<Cell>())
            {
                if ((c.DataType != null) && (c.DataType == CellValues.SharedString))
                {
                    int ssid = int.Parse(c.CellValue.Text);
                    string str = sst.ChildElements[ssid].InnerText;

                    if (str == "Date of birth:")
                    {
                        Cell next_cell = row.Descendants<Cell>().ElementAt(cellIndex + 1);
                        MessageBox.Show(next_cell.CellValue.Text);
                    }
                }

                cellIndex++;
            }
        }
    }
}

根据您的需求,还有其他方法,例如更改为for循环或如this answer中所述直接获取枚举数。