2

この単純なタスクの例を見つけるのに苦労している理由はわかりませんが、Google-Fu のスキルに基づいて何も表示されません。OpenXML と VB.Net を使用して既存のスプレッドシートのセルを変更する例を探しています。

数式を使用せずに、既存の値を新しい値に変更したい。

これが私が持っているものです:

Public Sub Main()
    Dim strSource, strSheetName As String
    Dim dtPeriod As DateTime

    strSource = Dts.Variables("sFilePath").Value

    'set period to previous month. We only care about the year in this period as the data will be reloaded
    'from the file each month
    dtPeriod = DateAdd(DateInterval.Month, -1, Today)
    Dts.Variables("dtPeriod").Value = dtPeriod

    Using mySpreadSheet As SpreadsheetDocument = SpreadsheetDocument.Open(strSource, True)
        Dim WorkbookSheets As Sheets

        WorkbookSheets = mySpreadSheet.WorkbookPart.Workbook.GetFirstChild(Of Sheets)()

        For Each childSheet As Sheet In WorkbookSheets
            strSheetName = childSheet.Name
            strSheetName = strSheetName.ToLower.Trim

            If strSheetName = "sheet1" Then     'process sheet

                SetCellValue("A1", "Last Name")
                SetCellValue("B1", "First Name")
                SetCellValue("C1", "RegionID")
                SetCellValue("D1", "RegionName")

                'rename sheet for loading
                childSheet.Name = "RegionData"
            End If
        Next

        mySpreadSheet.WorkbookPart.Workbook.Save()
        mySpreadSheet.Close()
    End Using
End Sub

Private Sub SetCellValue(ByVal loc As String, ByVal Val As String)
    Dim cell As Cell = New Cell


    cell.CellReference = loc
    cell.DataType = CellValues.String
    cell.CellValue = New CellValue(Val)

End Sub

セルが正しいシートを参照していることを確認するような単純なものだと確信していますが、私が見つけたすべての例は新しいシートを作成するためのものです。

ありがとう

4

1 に答える 1

2

これが私がそれを機能させた方法です:

Private Sub ProcessFile(ByVal fileName As String)
    Dim value As String = Nothing
    Dim worksheetID As String 

    Using document As SpreadsheetDocument = SpreadsheetDocument.Open(fileName, True)
        worksheetID = GetWorksheetID(document)

        If worksheetID = String.Empty Then
            MsgBox("Failure!")
        End If

        SetStrCellValue(document, worksheetID, 1, 1, "Last Name")

        document.WorkbookPart.Workbook.Save()
        document.Close()

    End Using
End Sub

Private Overloads Function GetWorksheetID(ByRef document As SpreadsheetDocument) As String 
    Dim sSheetName As String
    Dim sheetID As String = String.Empty
    Dim WorkbookSheets As Sheets = document.WorkbookPart.Workbook.GetFirstChild(Of Sheets)()

    For Each childSheet As Sheet In WorkbookSheets
        sSheetName = childSheet.Name
        sSheetName = sSheetName.ToLower.Trim

        'rename worksheet
        If sSheetName = "sheet1" Then
            childSheet.Name = "MySheet"

            sheetID = childSheet.Id
        End If
    Next

    Return sheetID
End Function

Private Overloads Sub SetStrCellValue(ByRef document As SpreadsheetDocument, ByVal sheetID As String, ByVal iRow As Integer, ByVal col As Integer, ByVal newCellValue As String)
    Dim Location As String = GetColumnLetter(col) & iRow.ToString

    SetStrCellValue(document, sheetID, Location, newCellValue)
End Sub


Private Overloads Sub SetStrCellValue(ByRef document As SpreadsheetDocument, ByVal sheetID As String, ByVal location As String, ByVal newCellValue As String)
    Dim wsPart As WorksheetPart = CType(document.WorkbookPart.GetPartById(sheetID), WorksheetPart)
    Dim Cell As Cell = wsPart.Worksheet.Descendants(Of Cell).Where(Function(c) c.CellReference = location).FirstOrDefault

    Cell.CellValue = New CellValue(newCellValue.ToString)
    Cell.DataType = CellValues.String
End Sub

'Returns column letter based on the column number
Private Function GetColumnLetter(ByVal colNumber As Integer) As String
    Dim columnLetter As String = String.Empty
    Dim abc As String = "ABCDEFGHIJKLMNOPQRSTUVWXYZ"

    If colNumber > 26 Then
        columnLetter = abc.Substring(CInt(colNumber / 26) - 1, 1)
    End If

    columnLetter += abc.Substring(((colNumber - 1) Mod 26), 1)

    Return columnLetter
End Function
于 2012-08-27T15:08:52.163 に答える