トップ回答者
OpenXmlでSheet削除後、ファイルを開くと、削除された機能: /xl/workbook.xml パーツ内の名前付き範囲 (ブック)が表示される

質問
-
下記コードで、EXCEL2010のファイルから一部のシートを削除した後、
①ファイルを開くと、「読み取れない内容が含まれています。このブックの内容を回復しますか?」が表示されます。
②【はい】をクリックすると、「削除された機能: /xl/workbook.xml パーツ内の名前付き範囲 (ブック)」が表示されます。但し、削除シートがちゃんと消えています。
ネットや参考資料を色々調べたが、問題を解決できませんでした。何かヒントを頂ければ幸いです。何卒宜しくお願い申上げます。
Private Sub DeleteWorkSheet(ByVal mFileName As String, ByVal sheetName As String)
Using mySpreadsheet As SpreadsheetDocument = SpreadsheetDocument.Open(mFileName, True)
Dim wbPart As WorkbookPart = mySpreadsheet.WorkbookPart
Dim sheets As Sheets = wbPart.Workbook.GetFirstChild(Of Sheets)()
Dim thisSheet As Sheet = sheets.Elements(Of Sheet).Where(Function(s) s.Name.Value = sheetName).First()
thisSheet.RemoveAllChildren()
sheets.RemoveChild(thisSheet)
wbPart.Workbook.Save()
End Using
End Sub- 移動 星 睦美 2014年3月20日 0:24 ASP.NET から
回答
-
VBは書けないのでC#ですが
using (var document = SpreadsheetDocument.Open(filename, true)) { var workbookPart = document.WorkbookPart; var sheets = workbookPart.Workbook.Sheets; var sheet = sheets.ChildElements.OfType<Sheet>().First(s => s.Name == sheetname); sheets.RemoveChild(sheet); var worksheetPart = workbookPart.GetPartById(sheet.Id); workbookPart.DeletePart(worksheetPart); }
でSheetの削除とWorksheetPartの削除ができます。
# とりあえず、この方法で実行した後、Excelで開いても警告されませんでした。- 回答としてマーク kaku_n 2014年3月19日 14:04
すべての返信
-
# 質問文にASP.NET関連の文言が含まれていません。ASP.NETフォーラムとの関連性を教えてください。
.GetFirstChild や .Elements 辺りからOpenXMLの操作でなくXML操作になっています。XMLとして整合性が取れていてもOpenXMLとして整合性が取れなくなるのは当然です。
WorksheetPartのExampleを見る限りSheetsからSheetを削除すると同時にWorkbookPartからWorksheetPartを削除する必要があるようです。
-
アドバイスを誠に有難うございます。
OPENXMLには全く知識がなく、今月初めてかじり始めました。
WorkBookPartからWorkSheetPartを削除には、どのようなすればよいでしょうか?
WorkBookPartのDeletePartを試してみましたが、問題がを解決できませんでした。
是非ご助言を頂ければ幸いです。
------------------下記はプログラムコード--------------
Private Sub DeleteWorkSheet(ByVal mFileName As String, ByVal sheetName As String)
Using mySpreadsheet As SpreadsheetDocument = SpreadsheetDocument.Open(mFileName, True)
Dim wbPart As WorkbookPart = mySpreadsheet.WorkbookPart
Dim sheets As Sheets = wbPart.Workbook.GetFirstChild(Of Sheets)()
Dim thisSheet As Sheet = sheets.Elements(Of Sheet).Where(Function(s) s.Name.Value = sheetName).First()
thisSheet.RemoveAllChildren()
sheets.RemoveChild(thisSheet)
Dim ws As Worksheet = GetWorkSheet(wbPart, sheetName, "ByName")
wbPart.DeletePart(wbPart.GetIdOfPart(ws.WorksheetPart))
wbPart.Workbook.Save()
End Using
End Sub
Private Function GetWorkSheet(ByVal wbPart As WorkbookPart, ByVal wsIdentifier As String, ByVal wsiType As String) As Worksheet
Dim Sheets As Sheets = wbPart.Workbook.Sheets
Dim Sheet As Sheet
If wsiType = "ByIndex" Then
Sheet = Sheets.Elements(Of Sheet).ElementAt(CInt(wsIdentifier))
Else
Sheet = Sheets.Elements(Of Sheet).Where(Function(s) s.Name.Value = wsIdentifier).First
End If
If Sheet Is Nothing Then Return Nothing
Dim worksheetPart As WorksheetPart = CType(wbPart.GetPartById(Sheet.Id.Value), WorksheetPart)
Return worksheetPart.Worksheet
End Function
-
VBは書けないのでC#ですが
using (var document = SpreadsheetDocument.Open(filename, true)) { var workbookPart = document.WorkbookPart; var sheets = workbookPart.Workbook.Sheets; var sheet = sheets.ChildElements.OfType<Sheet>().First(s => s.Name == sheetname); sheets.RemoveChild(sheet); var worksheetPart = workbookPart.GetPartById(sheet.Id); workbookPart.DeletePart(worksheetPart); }
でSheetの削除とWorksheetPartの削除ができます。
# とりあえず、この方法で実行した後、Excelで開いても警告されませんでした。- 回答としてマーク kaku_n 2014年3月19日 14:04
-
フォーラム オペレーターの星 睦美です。
佐祐理 さん、返信ありがとうございます。kaku_n さん、
英語のMSDNに以下のMicrosoft Office for Developer フォーラムがありますが、残念ながら日本語のMSDN フォーラムにはOpen XML に関するカテゴリがありません。・Microsoft Office for Developers - Open XML Format SDK:
http://social.msdn.microsoft.com/Forums/office/en-US/home?category=apps&forum=oxmlsdk&filter=alltypes&sort=lastpostdesc今回は佐祐理 さんから返信をいただきました。解決のヒントになるのではないかと思いますので、参考になりましたら投稿者からの[回答としてマーク] をお願いします。
フォーラム オペレーター 星 睦美 - MSDN Community Support
- 編集済み 星 睦美 2014年3月17日 7:41 編集