2012-08-23 20 views
2

我不知道爲什麼我很難找到這個簡單任務的例子,但是根據我的Google-Fu技能沒有顯示任何內容。我正在尋找使用OpenXML和VB.Net修改現有電子表格的單元格的示例。在VB.Net中使用OpenXML修改單元格

我想將現有值更改爲新值,不涉及公式。

以下是我有:

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 

我敢肯定,這是一些簡單的像確保電池被引用正確表,但我發現所有的例子是創建一個新的工作表。

感謝

+0

那麼這是什麼代碼在做什麼?它沒有做什麼?這裏在黑暗中拍攝,但在Excel中,範圍將爲** sheet1 **,而工作表本身爲** sheet1 $ **另外,您需要注意區分大小寫。同樣,默認值爲Sheet1 $ – billinkc

+0

代碼沒有更新單元格值。我試圖在不使用Excel的情況下修改Excel文件,因爲它必須在服務器上運行。使用Excel作爲客戶端應用程序,我必須找到其他方式來完成它,因此OpenXML。我無法讓OpenXML更新單元格/列值。 – user1238918

+0

Gotcha。運行檢查表名稱,它可能會錯過後面的$和有錯誤的情況? – billinkc

回答

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 
相關問題