|
■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
|