我已經開始使用Open XML創建Excel文件,以便向其中添加一些數據。我所包含的示例文件是我在網上找到的示例的修改版本。它創建了excel文件,但是當我嘗試打開它時,它給了我三個錯誤。我懷疑最後兩個錯誤是由於爲標題單元添加StyleIndex,但是當我打開任何Excel文件時,最近出現第一個錯誤。打開由XML創建的Excel文件時出錯
1-無法使用對象鏈接和嵌入。
2- Excel在'SheetPInfo.xlsx'中發現不可讀的內容。是否要恢復此工作簿的內容?如果您信任此工作簿的來源,請單擊是。
3-Excel能夠通過修復或刪除不可讀的內容來打開文件。 修復記錄:/xl/worksheets/sheet.xml中的單元信息部分
在關閉最後一條錯誤消息後,我還獲取了文件中的數據/數組,但StyleIndex(大字體)未出現在標題單元格中'姓'。
什麼可能是錯的?當我在線搜索時,行的順序對於Excel非常重要,所以我想也許我的StyleIndex相關行出錯了。
任何幫助將不勝感激。
Imports System.Linq
Imports DocumentFormat.OpenXml
Imports DocumentFormat.OpenXml.Packaging
Imports DocumentFormat.OpenXml.Spreadsheet
Public Class TestEcel10
Inherits System.Web.UI.Page
Private mFileName As String = "SheetPInfo.xlsx"
Private mFileLocation As String = "c:\Contracts\" & mFileName
Private newSpreadSheet As SpreadsheetDocument
Protected Sub Page_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load
End Sub
Private Sub btnExportToExcel_Click(sender As Object, e As EventArgs) Handles btnExportToExcel.Click
Dim wsp As WorksheetPart = Spreadsheet_Create()
Dim PInfoArr(2, 3) As String
PInfoArr(0, 0) = "Frank"
PInfoArr(0, 1) = "Baker"
PInfoArr(0, 2) = "2/18/1977"
PInfoArr(0, 3) = "Frank"
PInfoArr(1, 0) = "William"
PInfoArr(1, 1) = "Cook"
PInfoArr(1, 2) = "2/18/1987"
PInfoArr(1, 3) = "Bill"
PInfoArr(2, 0) = "Nancy"
PInfoArr(2, 1) = "Williams"
PInfoArr(2, 2) = "2/18/1973"
PInfoArr(2, 3) = "Nancy"
InsertText(wsp, PInfoArr)
Spreadsheet_Close()
End Sub 'End of btnExportToExcel_Click Sub
Private Function Spreadsheet_Create() As WorksheetPart
'Delete the file if exists
If My.Computer.FileSystem.FileExists(mFileLocation) Then
My.Computer.FileSystem.DeleteFile(mFileLocation)
End If
'Create spreadsheet
newSpreadSheet = SpreadsheetDocument.Create(mFileLocation, SpreadsheetDocumentType.Workbook)
'Add WorkbookPart & Workbook
Dim newWorkbookPart As WorkbookPart = newSpreadSheet.AddWorkbookPart
newWorkbookPart.Workbook = New Workbook()
'Add Worksheet
Return InsertWorksheet(newSpreadSheet.WorkbookPart)
End Function 'End of Spreadsheet_Create function
Private Sub Spreadsheet_Close()
newSpreadSheet.WorkbookPart.Workbook.Save()
newSpreadSheet.Close()
End Sub 'End of Spreadsheet_Close sub
Public Sub InsertText(ByVal wsp As WorksheetPart, ByVal PInfoArray As String(,))
' Get the SharedStringTablePart. If it does not exist, create a new one.
Dim shareStringPart As SharedStringTablePart
If (newSpreadSheet.WorkbookPart.GetPartsOfType(Of SharedStringTablePart).Count() > 0) Then
shareStringPart = newSpreadSheet.WorkbookPart.GetPartsOfType(Of SharedStringTablePart).First()
Else
shareStringPart = newSpreadSheet.WorkbookPart.AddNewPart(Of SharedStringTablePart)()
End If
Dim index As Integer = 0
Dim i As Integer = 0
Dim j As Integer = 0
Dim cell As Cell
'Inserting column headings:
' Insert the text into the SharedStringTablePart.
index = InsertSharedStringItem("First Name", shareStringPart)
' Insert cell A1 into the new worksheet.
cell = InsertCellInWorksheet("A", 1, wsp)
' Set the value of cell A1.
cell.CellValue = New CellValue(index.ToString)
cell.DataType = New EnumValue(Of CellValues)(CellValues.SharedString)
' Insert the text into the SharedStringTablePart.
index = InsertSharedStringItem("Last Name", shareStringPart)
Dim styleIndex As UInt32Value = Convert.ToInt32("36")
' Insert cell A1 into the new worksheet.
cell = InsertCellInWorksheet("B", 1, wsp)
' Set the value of cell A1.
cell.CellValue = New CellValue(index.ToString)
cell.StyleIndex = styleIndex
cell.DataType = New EnumValue(Of CellValues)(CellValues.SharedString)
' Insert the text into the SharedStringTablePart.
index = InsertSharedStringItem("Birth Date", shareStringPart)
' Insert cell A1 into the new worksheet.
cell = InsertCellInWorksheet("C", 1, wsp)
' Set the value of cell A1.
cell.CellValue = New CellValue(index.ToString)
cell.DataType = New EnumValue(Of CellValues)(CellValues.SharedString)
' Insert the text into the SharedStringTablePart.
index = InsertSharedStringItem("Nick Name", shareStringPart)
' Insert cell A1 into the new worksheet.
cell = InsertCellInWorksheet("D", 1, wsp)
' Set the value of cell A1.
cell.CellValue = New CellValue(index.ToString)
cell.DataType = New EnumValue(Of CellValues)(CellValues.SharedString)
'For column data we start from index 2 and increase it as we go to the next row
Dim Rowindex As Integer = 2
Dim ColumnLetter As String = "A"
'Inserting column data:
For i = 0 To UBound(PInfoArray, 1)
For j = 0 To UBound(PInfoArray, 2)
' Insert the text into the SharedStringTablePart.
index = InsertSharedStringItem(PInfoArray(i, j), shareStringPart)
'Set the
If j = 0 Then
ColumnLetter = "A"
ElseIf j = 1 Then
ColumnLetter = "B"
ElseIf j = 2 Then
ColumnLetter = "C"
ElseIf j = 3 Then
ColumnLetter = "D"
End If
' Insert cell A1 into the new worksheet.
cell = InsertCellInWorksheet(ColumnLetter, Rowindex, wsp)
' Set the value of cell A1.
cell.CellValue = New CellValue(index.ToString)
cell.DataType = New EnumValue(Of CellValues)(CellValues.SharedString)
If ColumnLetter = "D" Then
Rowindex = Rowindex + 1
End If
Next
Next
' Save the new worksheet.
wsp.Worksheet.Save()
End Sub 'End of InsertText sub
' Given text and a SharedStringTablePart, creates a SharedStringItem with the specified text
' and inserts it into the SharedStringTablePart. If the item already exists, returns its index.
Private Function InsertSharedStringItem(ByVal text As String, ByVal shareStringPart As SharedStringTablePart) As Integer
'If the part does not contain a SharedStringTable, create one
If (shareStringPart.SharedStringTable Is Nothing) Then
shareStringPart.SharedStringTable = New SharedStringTable
End If
Dim i As Integer = 0
'Iterate through all the items in the SharedStringTable. If the text already exists, return its index
For Each item As SharedStringItem In shareStringPart.SharedStringTable.Elements(Of SharedStringItem)()
If (item.InnerText = text) Then
Return i
End If
i = (i + 1)
Next
'The text does not exist in the part. Create the SharedStringItem and return its index
shareStringPart.SharedStringTable.AppendChild(New SharedStringItem(New DocumentFormat.OpenXml.Spreadsheet.Text(text)))
shareStringPart.SharedStringTable.Save()
Return i
End Function 'End of InsertSharedStringItem function
'Given a WorkbookPart, inserts a new worksheet.
Private Function InsertWorksheet(ByVal workbookPart As WorkbookPart) 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()
'Get a unique ID for the new worksheet
Dim sheetId As UInteger = 1
Dim sheets As New Sheets
If newSpreadSheet.WorkbookPart.Workbook.GetFirstChild(Of Sheets)() IsNot Nothing Then
sheets = newSpreadSheet.WorkbookPart.Workbook.GetFirstChild(Of Sheets)()
'Not sure if this check is required, possible an hanger-on from previous attempts
If (sheets.Elements(Of Sheet).Count > 0) Then
sheetId = sheets.Elements(Of Sheet).Select(Function(s) s.SheetId.Value).Max + 1
End If
End If
Dim relationshipId As String = _
newSpreadSheet.WorkbookPart.GetIdOfPart(newWorksheetPart)
Dim sheetName As String = ("Sheet" + sheetId.ToString())
' 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)
If newSpreadSheet.WorkbookPart.Workbook.GetFirstChild(Of Sheets)() Is Nothing Then
newSpreadSheet.WorkbookPart.Workbook.AppendChild(Of Sheets)(sheets)
End If
workbookPart.Workbook.Save()
Return newWorksheetPart
End Function 'End of InsertWorksheet function
' Given a column name, a row index, and a WorksheetPart, inserts a cell into the worksheet.
' If the cell already exists, return it.
Private Function InsertCellInWorksheet(ByVal columnName As String, ByVal rowIndex As UInteger, ByVal wsp As WorksheetPart) As Cell
Dim worksheet As Worksheet = wsp.Worksheet
Dim sheetData As SheetData = worksheet.GetFirstChild(Of SheetData)()
Dim cellReference As String = (columnName + rowIndex.ToString())
' If the worksheet does not contain a row with the specified row index, insert one.
Dim row As Row
If (sheetData.Elements(Of Row).Where(Function(r) r.RowIndex.Value = rowIndex).Count() <> 0) Then
row = sheetData.Elements(Of Row).Where(Function(r) r.RowIndex.Value = rowIndex).First()
Else
row = New Row()
row.RowIndex = rowIndex
sheetData.Append(row)
End If
' If there is not a cell with the specified column name, insert one.
If (row.Elements(Of Cell).Where(Function(c) c.CellReference.Value = columnName + rowIndex.ToString()).Count() > 0) Then
Return row.Elements(Of Cell).Where(Function(c) c.CellReference.Value = cellReference).First()
Else
' Cells must be in sequential order according to CellReference. Determine where to insert the new cell.
Dim refCell As Cell = Nothing
For Each cell As Cell In row.Elements(Of Cell)()
If (String.Compare(cell.CellReference.Value, cellReference, True) > 0) Then
refCell = cell
Exit For
End If
Next
Dim newCell As Cell = New Cell
newCell.CellReference = cellReference
row.InsertBefore(newCell, refCell)
worksheet.Save()
Return newCell
End If
End Function 'End of InsertCellInWorksheet function
對於第一個錯誤,我嘗試了幾種建議在線的方式,但沒有一個只使用了我沒有注意的方法,這是我的答案!轉到開始/運行/ DCOMCNFG /組件服務/計算機/我的電腦/ DCOM配置/ Microsoft Excel應用程序/屬性/標識選項卡,然後選中'啓動用戶'。這次的信貸到這個網站:http://vinforsolutions.blogspot.com/2013/04/cannot-use-object-linking-and-embedding.html有趣的是,安全選項卡中的其他更改將刪除第一個錯誤,但人們不斷提示他們。 – Snowy 2015-01-16 14:44:34