2

破損したワークブックが 100 個以上あります。それらを開こうとすると、「x」は宣言されていないプレフィックスであるというエラー メッセージが表示されます。これらのファイルは、xml ビューアー (OpenXML ビューアーを含む) にロードできません。ここで、Excel ワークブックの拡張子を .zip に変更し、すべての部分を解凍して、workbook.xml ファイルの次の行 (xml ドキュメントの最後の要素) を編集します。

<extLst><x:ext uri="{140A7094-0E35-4892-8432-C4D2E57EDEB5}" xmlns:x15="http://schemas.microsoft.com/office/spreadsheetml/2010/11/main"><x15:workbookPr chartTrackingRefBase="1"/></x:ext></extLst>

要素全体を削除するかx:<ext>タグ内の を削除すると、ワークブックをパッケージ化した後、ワークブックが適切に機能します。

次の VB.Net コードも試しました。

 Private Sub RemoveExceptionsFromWorkbook(ByVal workbookPath As String)
        Using excelDoc As SpreadsheetDocument = SpreadsheetDocument.Open(workbookPath, True)
            If excelDoc.WorkbookPart.Workbook.Descendants(Of WorkbookExtensionList)().Any() Then
                excelDoc.WorkbookPart.Workbook.RemoveAllChildren(Of WorkbookExtensionList)()
                excelDoc.WorkbookPart.Workbook.Save()
            End If
        End Using
    End Sub

しかし、毎回「x」は宣言されていないプレフィックスエラーです。これを修正する方法を知っている人はいますか?どんな助けでも大歓迎です。

4

2 に答える 2

3

私の知る限り、ファイル自体が破損しているため、Excel または Open XML SDK では実行できません。つまり、通常の ZIP ファイルのように変更する必要があります。便宜上 DotNetZip を使用しましたが、使い慣れた ZIP ライブラリを使用できます。これを試して:

using (ZipFile zf = ZipFile.Read("damagedcopy.xlsx"))
{
    ZipEntry ze = zf["xl/workbook.xml"];
    using (MemoryStream ms = new MemoryStream())
    {
        ze.Extract(ms);
        // this is important, otherwise the StreamReader starts from the end.
        ms.Position = 0;
        StreamReader sr = new StreamReader(ms);
        string streamdata = sr.ReadToEnd();
        // I only updated the relevant portion of the XML
        streamdata = streamdata.Replace("<x:ext", "<ext");
        streamdata = streamdata.Replace("</x:ext>", "</ext>");
        sr.Close();
        zf.UpdateEntry("xl/workbook.xml", streamdata);
        zf.Save();
    }
}

必要に応じて、100 以上の Excel ファイルすべてを繰り返します (私はあなたの痛みを感じます...)。

于 2013-07-16T04:56:41.180 に答える
1

コンセプトについては、Vincent Tan に +1。その通りです。xml ファイルを開くことができなかったので、最初にテキスト ファイルとして変更する必要がありました。最初にこれを実行しました:

Private Sub RemovePrefix()
     'Change the extension of the workbook.xml file to txt
     IO.File.Move(WorkbookXmlFilePath, WorkbookXmlTxtFileName)  

     Dim arrText() As String = IO.File.ReadAllLines(WorkbookXmlTxtFileName)
     Dim arrNewText(arrText.Length - 1) As String

     For i As Integer = 0 To UBound(arrText)
          If arrText(i).Contains("x:") Then
               arrNewText(i) = Strings.Replace(arrText(i), "x:", "")
          Else
               arrNewText(i) = arrText(i)
          End If
     Next

     IO.File.WriteAllLines(WorkbookXmlTxtFileName, arrNewText)

     'Change the extension back to xml
     IO.File.Move(WorkbookXmlTxtFileName, WorkbookXmlFilePath)
End Sub

その後、xml ファイルは破損しなくなりましたが、Excel ワークブックを開こうとすると、データが破損しているというメッセージが表示されました。したがって、私の質問の手順は、workbook.xml ドキュメントからノードを完全に削除し<extLst>、ワークブックを修正するために機能しました。

Private Sub RemoveExceptionList(ByVal workbookPath as String)
     Using excelDoc As SpreadsheetDocument = SpreadsheetDocument.Open(workbookPath, True)
          If excelDoc.WorkbookPart.Workbook.Descendants(Of WorkbookExtensionList)().Any() Then
               excelDoc.WorkbookPart.Workbook.RemoveAllChildren(Of WorkbookExtensionList)()
               excelDoc.WorkbookPart.Workbook.Save()
          End If
     End Using
 End Sub
于 2013-07-16T23:57:33.127 に答える