Sheet 与工作表的关系
Relationship between Sheet and Worksheet
关于 MSDN SpreadsheetML 文档的基本文档结构由 Sheet 和 Sheet 元素组成,它们引用工作簿中的工作表。
例如,有一个包含工作表的工作簿:
<workbook xmlns=http://schemas.openxmlformats.org/spreadsheetml/2006/main xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
<sheets>
<sheet name="MySheet1" sheetId="1" r:id="rId1" />
<sheet name="MySheet2" sheetId="2" r:id="rId2" />
</sheets>
</workbook>
还有两个工作表,例如:
<?xml version="1.0" encoding="UTF-8" ?>
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
<sheetData>
<row r="1">
<c r="A1">
<v>100</v>
</c>
</row>
</sheetData>
</worksheet>
我的任务是根据 Sheet 的名称获取工作表。
但我不明白 Sheet 和 Worksheet 之间的关系是什么。
好的,我在 Sheet 中找到了预期名称为 "MySheet2" 的 Sheet,但我怎样才能获得合适的工作表?工作表 class 没有名称属性或一些 "foreign keys" 到 link 和 Sheet.
我已经解决了。
Sheet中有关系ID。
这里的简单示例:
string sheetName = "MySheet2";
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(@"path\to\file", false))
{
WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
var sheets = workbookPart.Workbook.Sheets.Cast<Sheet>().ToList();
// Get and remember id of sheet with sheetName
string rId = "";
sheets.ForEach(x => { if (x.Name.Value == sheetName) rId = x.Id.Value; });
// Go through the WorksheetParts and find workbookPart with RelationshipId = rId
foreach (var w in workbookPart.WorksheetParts)
{
string partRelationshipId = workbookPart.GetIdOfPart(w);
if (partRelationshipId == rId)
{
SheetData sheetData = w.Worksheet.Elements<SheetData>().First();
foreach (Row r in sheetData.Elements<Row>())
{
foreach (Cell c in r.Elements<Cell>())
{
...
}
}
}
}
}
您的回答是正确的,因为您需要使用关系 ID,但您可以使用 Descendants<T>
and GetPartById
方法稍微简化代码:
//find the sheet by name
Sheet sheet = workbookPart.Workbook.Descendants<Sheet>().FirstOrDefault(
s => s.Name.ToString().Equals(sheetName, StringComparison.InvariantCultureIgnoreCase));
if (sheet != null)
{
string relationshipId = sheets.First().Id.Value;
//get the worksheetpart by Id
WorksheetPart worksheetPart = (WorksheetPart)workbookPart.GetPartById(relationshipId);
//get the sheetdata from the worksheet
SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();
}
关于 MSDN SpreadsheetML 文档的基本文档结构由 Sheet 和 Sheet 元素组成,它们引用工作簿中的工作表。
例如,有一个包含工作表的工作簿:
<workbook xmlns=http://schemas.openxmlformats.org/spreadsheetml/2006/main xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships">
<sheets>
<sheet name="MySheet1" sheetId="1" r:id="rId1" />
<sheet name="MySheet2" sheetId="2" r:id="rId2" />
</sheets>
</workbook>
还有两个工作表,例如:
<?xml version="1.0" encoding="UTF-8" ?>
<worksheet xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main">
<sheetData>
<row r="1">
<c r="A1">
<v>100</v>
</c>
</row>
</sheetData>
</worksheet>
我的任务是根据 Sheet 的名称获取工作表。 但我不明白 Sheet 和 Worksheet 之间的关系是什么。 好的,我在 Sheet 中找到了预期名称为 "MySheet2" 的 Sheet,但我怎样才能获得合适的工作表?工作表 class 没有名称属性或一些 "foreign keys" 到 link 和 Sheet.
我已经解决了。 Sheet中有关系ID。 这里的简单示例:
string sheetName = "MySheet2";
using (SpreadsheetDocument spreadsheetDocument = SpreadsheetDocument.Open(@"path\to\file", false))
{
WorkbookPart workbookPart = spreadsheetDocument.WorkbookPart;
var sheets = workbookPart.Workbook.Sheets.Cast<Sheet>().ToList();
// Get and remember id of sheet with sheetName
string rId = "";
sheets.ForEach(x => { if (x.Name.Value == sheetName) rId = x.Id.Value; });
// Go through the WorksheetParts and find workbookPart with RelationshipId = rId
foreach (var w in workbookPart.WorksheetParts)
{
string partRelationshipId = workbookPart.GetIdOfPart(w);
if (partRelationshipId == rId)
{
SheetData sheetData = w.Worksheet.Elements<SheetData>().First();
foreach (Row r in sheetData.Elements<Row>())
{
foreach (Cell c in r.Elements<Cell>())
{
...
}
}
}
}
}
您的回答是正确的,因为您需要使用关系 ID,但您可以使用 Descendants<T>
and GetPartById
方法稍微简化代码:
//find the sheet by name
Sheet sheet = workbookPart.Workbook.Descendants<Sheet>().FirstOrDefault(
s => s.Name.ToString().Equals(sheetName, StringComparison.InvariantCultureIgnoreCase));
if (sheet != null)
{
string relationshipId = sheets.First().Id.Value;
//get the worksheetpart by Id
WorksheetPart worksheetPart = (WorksheetPart)workbookPart.GetPartById(relationshipId);
//get the sheetdata from the worksheet
SheetData sheetData = worksheetPart.Worksheet.Elements<SheetData>().First();
}