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;
}
我在 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;
}