我需要使用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中执行此操作。
编辑:很高兴也知道如何在循环外定义单元格。
答案 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中所述直接获取枚举数。