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

わんくま同盟

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

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


■103755 / )  Re[1]: OpenXML 図形
□投稿者/ am (1回)-(2025/07/07(Mon) 22:44:26)
No103746 (su さん) に返信
> 開発環境: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

以下のコードを修正しましたので参考になればどうそ

' 既存のファイルを読み込み、新しいファイルに保存する
Dim newFileName As String = "XXXX_modified.xlsx" ' 新しいファイル名

Using originalDoc As SpreadsheetDocument = SpreadsheetDocument.Open(FileName, False) ' 読み取り専用で開く
originalDoc.SaveAs(newFileName) ' 新しいファイルとして保存
End Using

' 新しいファイルを開いて編集する
Using destDoc As SpreadsheetDocument = SpreadsheetDocument.Open(newFileName, 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() は Using Block の最後で自動的に行われるため、明示的に記述する必要はないことが多いですが、記述しても問題ありません。

End Using


返信 編集キー/


管理者用

- Child Tree -