C# 工作表和工作表之间的关系

C# 工作表和工作表之间的关系,c#,excel,openxml,openxml-sdk,C#,Excel,Openxml,Openxml Sdk,至于电子表格的基本文档结构,ML文档由表格和表格元素组成,它们引用工作簿中的工作表 例如,有一个带有工作表的工作簿: <workbook xmlns=http://schemas.openxmlformats.org/spreadsheetml/2006/main xmlns:r="http://schemas.openxmlformats.org/officeDocument/2006/relationships"> <sheets> <s

至于电子表格的基本文档结构,ML文档由表格和表格元素组成,它们引用工作簿中的工作表

例如,有一个带有工作表的工作簿:

<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>

100
我的任务是按工作表的名称获取工作表。 但我不明白什么是工作表和工作表的关系。 好的,我在工作表中找到了预期名称为“MySheet2”的工作表,但如何获得合适的工作表?工作表类没有名称属性或一些与工作表链接的“外键”。

I'v解决了这个问题。 工作表中没有关系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>())
                    {
                        ...
                    }
                }
            }
        }
    }
string sheetName=“MySheet2”;
使用(SpreadsheetDocument SpreadsheetDocument=SpreadsheetDocument.Open(@“path\to\file”,false))
{
WorkbookPart WorkbookPart=电子表格文档.WorkbookPart;
var sheets=workbookPart.Workbook.sheets.Cast().ToList();
//获取并记住具有sheetName的工作表id
字符串rId=“”;
sheets.ForEach(x=>{if(x.Name.Value==sheetName)rId=x.Id.Value;});
//浏览工作表部件并找到RelationshipId=rId的workbookPart
foreach(workbookPart.WorksheetParts中的var w)
{
string partRelationshipId=workbookPart.GetIdOfPart(w);
if(partRelationshipId==rId)
{
SheetData SheetData=w.sheet.Elements().First();
foreach(sheetData.Elements()中的r行)
{
foreach(r.Elements()中的单元格c)
{
...
}
}
}
}
}

您的答案是正确的,因为您需要使用关系id,但您可以使用和方法稍微简化代码:

//按名称查找工作表
工作表=workbookPart.工作簿.Subjections().FirstOrDefault(
s=>s.Name.ToString().Equals(sheetName,StringComparison.InvariantCultureIgnoreCase));
如果(工作表!=null)
{
string relationshipId=sheets.First().Id.Value;
//按Id获取工作表部件
工作表部件工作表部件=(工作表部件)workbookPart.GetPartById(relationshipId);
//从工作表中获取工作表数据
SheetData SheetData=worksheetPart.Worksheet.Elements().First();
}

谢谢,看起来好多了。
//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();
}