C# と VB.NET の質問掲示板

わんくま同盟

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

ツリー一括表示

New OpenXML 図形 /su (25/07/01(Tue) 17:33) #103746


親記事 / 返信無し
■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

[ □ Tree ] 返信 編集キー/


管理者用

- Child Tree -