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

  • 質問

  • 下記コードで、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 から
    2014年3月16日 23:59

回答

  • 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
    2014年3月17日 5:13

すべての返信

  • # 質問文にASP.NET関連の文言が含まれていません。ASP.NETフォーラムとの関連性を教えてください。

    .GetFirstChild や .Elements 辺りからOpenXMLの操作でなくXML操作になっています。XMLとして整合性が取れていてもOpenXMLとして整合性が取れなくなるのは当然です。

    WorksheetPartのExampleを見る限りSheetsからSheetを削除すると同時にWorkbookPartからWorksheetPartを削除する必要があるようです。

    2014年3月17日 1:21
  • アドバイスを誠に有難うございます。

    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

    • 回答としてマーク kaku_n 2014年3月19日 14:03
    • 回答としてマークされていない kaku_n 2014年3月19日 14:04
    2014年3月17日 3:07
  • 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
    2014年3月17日 5:13
  • フォーラム オペレーターの星 睦美です。
    佐祐理 さん、返信ありがとうございます。

    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 編集
    2014年3月17日 7:39
  • 返事が遅くなって大変申訳ありません。

    頂いたヒントでプログラムを修正後、エラーが出なくなります。大変助かり、どうも有難うございました。

    2014年3月19日 14:06
  • オペレーターさん、本スレッドは少なくともASP.NETに無関係ですので、VBフォーラムもしくは.NET Frameworkフォーラムに移動するのが適切に思います。
    2014年3月19日 23:13
  • 佐祐理さん、いつもありがとうございます。
    スレッドをVisual Basic のフォーラムに移動させていただきました。

    引き続きMSDN フォーラムをよろしくお願いします。


    フォーラム オペレーター 星 睦美 - MSDN Community Support

    2014年3月20日 0:29