【问题标题】:How can I get the Worksheetpart from name or sheet ID in OpenXML?如何从 OpenXML 中的名称或工作表 ID 获取 Worksheetpart?
【发布时间】:2013-05-23 21:51:08
【问题描述】:

以下创建一个 XLSX,添加两个包含一些数据的工作表。然后我希望能够稍后根据名称(或者最好是 id)获取电子表格,以便我可以在以后的时间点添加/修改工作表。我不知道如何在下面的代码不完整的情况下再次获取工作表。

    Sub Main()

    Using doc As SpreadsheetDocument = SpreadsheetDocument.Create(System.IO.Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "c:\temp\fubar.xlsx"), SpreadsheetDocumentType.Workbook)
        Dim currSheet As WorksheetPart

        ' create the workbook
        doc.AddWorkbookPart()
        doc.WorkbookPart.Workbook = New Workbook()
        doc.WorkbookPart.Workbook.AppendChild(New Sheets())

        currSheet = InsertWorksheet(doc.WorkbookPart, "First")
        currSheet.Worksheet.First().AppendChild(New Row())
        currSheet.Worksheet.First().First().AppendChild(New Cell() With { _
         .CellValue = New CellValue("1") _
        })

        currSheet = InsertWorksheet(doc.WorkbookPart, "Second")
        currSheet.Worksheet.First().AppendChild(New Row())
        currSheet.Worksheet.First().First().AppendChild(New Cell() With { _
         .CellValue = New CellValue("1") _
        })

        For Each s As Sheet In doc.WorkbookPart.Workbook.Sheets
            System.Diagnostics.Debug.WriteLine(s.Id)
            System.Diagnostics.Debug.WriteLine(s.SheetId)
        Next

        cursheet = ... 'Get worksheetpart with name "First"

        cursheet = ...  'Get worksheet with sheetid = 2


        doc.WorkbookPart.Workbook.Save()
    End Using

End Sub


Private Function InsertWorksheet(ByVal workbookPart As WorkbookPart, SheetName As String) As WorksheetPart
    ' Add a new worksheet part to the workbook.
    Dim newWorksheetPart As WorksheetPart = workbookPart.AddNewPart(Of WorksheetPart)()
    newWorksheetPart.Worksheet = New Worksheet(New SheetData)
    newWorksheetPart.Worksheet.Save()
    Dim sheets As Sheets = workbookPart.Workbook.GetFirstChild(Of Sheets)()
    Dim relationshipId As String = workbookPart.GetIdOfPart(newWorksheetPart)

    ' Get a unique ID for the new sheet.
    Dim sheetId As UInteger = 1
    If (sheets.Elements(Of Sheet).Count() > 0) Then
        sheetId = sheets.Elements(Of Sheet).Select(Function(s) s.SheetId.Value).Max() + 1
    End If

    ' Add the new worksheet and associate it with the workbook.
    Dim sheet As Sheet = New Sheet
    sheet.Id = relationshipId
    sheet.SheetId = sheetId
    sheet.Name = sheetName
    sheets.Append(sheet)

    workbookPart.Workbook.Save()
    Return newWorksheetPart
End Function

【问题讨论】:

    标签: vb.net openxml openxml-sdk


    【解决方案1】:

    你快到了。你已经在循环doc.WorkbookPart.Workbook.Sheets。之后您需要做的就是插入一个 if 语句,通过查看属性 s.Names.Id 来查看您要查找的工作表是否是循环中的当前点

    或者,如here 所示,您可以使用 LINQ 直接按名称或 ID 选择工作表:

    sID as Integer = doc.WorkbookPart.Workbook.Descendants(Sheet)().First(s => s.Name.Equals("First")).Id
    

    或者

    sID as Integer  = doc.WorkbookPart.Workbook.Descendants(Sheet)().First(s => s.Id.Equals(2)).Id
    

    一旦你有了那个ID,你就可以做

    wsp As WorksheetPart = doc.WorkbookPart.GetPartById(sID)
    

    如果其中存在错误,我深表歉意,我正在快速行驶的火车上使用我的大脑编译器在 iPhone 上执行此操作。希望这至少能让你朝着正确的方向前进。

    【讨论】:

    • 我可以让它返回一个声称是工作表的东西,但是在检查 XML 时,没有我之前插入的单元格数据。
    • 抱歉,我误读了您的问题,并认为您想要的是 Worksheet,而不是 WorksheetPart。我已经更新了示例。
    • 我希望这个 OpenXML 结构没有那么复杂。这非常有效。谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-03-22
    • 1970-01-01
    相关资源
    最近更新 更多