親記事 / 返信無し
■103746 / 親階層) |
OpenXML 図形 |
□投稿者/ su (1回)-(2025/07/01(Tue) 17:33:27)
|
分類:[VB.NET/VB2005 以降]
開発環境:VisualStudio2022
言語:VB
OpenXMLを使用して既存のEXCELに値を書き込み、書類を作成するアプリを作成しています。
普通のシートに書き込むことは出来たのですが、
図形があるシートに下記の処理をした後、EXCELを開くと
「'XXXX.xlsx'の一部の内容に問題が見つかりました。可能な限り内容を回復しますか?ブックの発行元が信頼できる場合は、[はい]をクリックしてください。」
というメッセージが出てきて、はいをクリックすると
「削除されたレコード: /xl/worksheets/sheet6.xml パーツ内のセル情報」
という修復ログのようなものが表示されます。
値は書き込まれていません。
原因、対処法を教えて頂けると幸いです。
Using destDoc As SpreadsheetDocument = SpreadsheetDocument.Open(FileName, True)
' シート名からWorksheetオブジェクトを取得する
Dim workbookPart As WorkbookPart = destDoc.WorkbookPart
Dim sheet As Sheet = workbookPart.Workbook.GetFirstChild(Of Sheets)().Elements(Of Sheet)().FirstOrDefault(Function(s) s.Name = "書類A")
Dim sheetID As String = sheet.Id.Value
Dim worksheetPart As WorksheetPart = workbookPart.GetPartById(sheetID)
Dim worksheet As Worksheet = worksheetPart.Worksheet
'' セルA1をワークシートに追加する
Dim cellA1 As Cell = InsertCellInWorksheet("A", 1, worksheetPart)
'' セルA1に値をセットする
cellA1.CellValue = New CellValue("ABC")
cellA1.DataType = New EnumValue(Of CellValues)(CellValues.String)
' 保存
worksheet.Save()
workbookPart.Workbook.Save()
destDoc.Save()
End Using
Private Function InsertCellInWorksheet(columnName As String, rowIndex As UInt32, worksheetPart As WorksheetPart) As Cell
Dim worksheet As Worksheet = worksheetPart.Worksheet
Dim sheetData As SheetData = worksheet.GetFirstChild(Of SheetData)()
Dim cellReference As String = columnName + rowIndex.ToString()
' 指定された位置のRowオブジェクト
Dim row As Row = sheetData.Elements(Of Row)().FirstOrDefault(Function(r) r.RowIndex.Value = rowIndex)
If (row Is Nothing) Then
' Rowオブジェクトがまだ存在しないときは作る
row = New Row() With {.RowIndex = rowIndex}
sheetData.Append(row)
End If
' 指定された位置のCellオブジェクト
Dim refCell As Cell = row.Elements(Of Cell)().FirstOrDefault(Function(c) c.CellReference.Value = cellReference)
If (refCell IsNot Nothing) Then
Return refCell ' すでに存在するので、それを返す
End If
' Cellオブジェクトがまだ存在しないときは作って挿入する
Dim nextCell As Cell = row.Elements(Of Cell)().FirstOrDefault(Function(c) String.Compare(c.CellReference.Value, cellReference, True) > 0)
Dim newCell As Cell = New Cell() With {.CellReference = cellReference}
row.InsertBefore(newCell, nextCell)
worksheet.Save()
Return newCell
End Function
|
|