【问题标题】:Relationship between Sheet and Worksheet工作表和工作表之间的关系
【发布时间】:2015-03-18 05:50:19
【问题描述】:

对于MSDN,SpreadsheetML 文档的基本文档结构由 Sheets 和 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>

我的任务是通过工作表的名称获取工作表。 但我不明白 beetwen Sheet 和 Worksheet 的关系是什么。 好的,我在表格中找到了预期名称为“MySheet2”的表格,但我怎样才能获得合适的工作表? Worksheet 类没有名称属性或一些“外键”来与 Sheet 链接。

【问题讨论】:

    标签: c# excel openxml openxml-sdk


    【解决方案1】:

    您的答案是正确的,因为您需要使用关系 ID,但您可以使用 Descendants&lt;T&gt;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();
    }
    

    【讨论】:

    • 谢谢,看起来好多了。
    【解决方案2】:

    我已经解决了。 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>())
                        {
                            ...
                        }
                    }
                }
            }
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-02-15
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多