いやあ、今日は SpreadsheetGear という Excel 互換のスプレッドシート コンポーネントに振り回された一日・・・いや、半日だったけど(笑)・・・だった。
ASP.NET で開発している Web システムがあって、Web画面からアップロードした Excel ファイルをサーバサイドであれこれするんだけど、Excel ファイルによってちゃんと処理できるケースと、「Corrupt OpenXML document.」例外を発生するケースがあるのだ。
<asp:Label ID="lblExcelSel" runat="server" Text="Excelファイル"></asp:Label> <asp:FileUpload ID="fileExcel" runat="server" /> <asp:Button ID="btnUpFile" runat="server" Text="取込" />
こんな感じで、FileUpload コントロールでアップしたデータを、サーバサイドで SpreadsheetGear を使って処理をする。
サーバサイドのプログラムがこんな感じ。
''' <summary>''' 取込ボタン処理''' </summary>''' <param name="sender"></param>''' <param name="e"></param>''' <remarks></remarks>Protected Sub btnUpFile_Click(sender As Object, e As EventArgs) Handles btnUpFile.Click' ファイルがアップロードされていなければ終了If (fileExcel.HasFile = False) Then Return' ファイルをメモリーに格納Dim data(fileExcel.PostedFile.ContentLength - 1) As BytefileExcel.PostedFile.InputStream.Read(data, 0, fileExcel.PostedFile.ContentLength)Dim xlsWorkBookSet As SpreadsheetGear.IWorkbookSet = SpreadsheetGear.Factory.GetWorkbookSet()Dim xlsWorkBook As SpreadsheetGear.IWorkbook = NothingTry'メモリからワークブックにセットxlsWorkBook = xlsWorkBookSet.Workbooks.OpenFromMemory(data)Catch ex As Exceptionalert("Excelファイルを読み込めませんでした。(" + ex.Message + ")")ReturnEnd TryDim currentSheet As SpreadsheetGear.IWorksheet = CType(xlsWorkBook.Worksheets(0), SpreadsheetGear.IWorksheet)<以下略>
この、xlsWorkBook = xlsWorkBookSet.Workbooks.OpenFromMemory(data) しているところで「Corrupt OpenXML document.」例外エラーが発生するのである。
色々調べていたら、他のブックからシートをコピーしたり、他のブックのシートの一部をコピー&ペーストしたファイルがエラーになるようだ。元々ちゃんと読めていたファイルが読めなくなる。
xlsx ファイルは OpenXML 形式のファイルなので、コピー元の情報を書き込んだときに、何か問題が発生するんだろうなあ。日本語ファイル名をシングルクォーテーションで囲まないとか。
まだそこまで調べてないし、調べる時間もなさそうなんで、俺よりエロい人、ぜひご教示くださいませ。
本家サイトにも色々 OpenXML 形式のファイルを扱うときの障害例が載っていたが、そのほとんどが「残念ながら、既知の制限になります。」で締められていて闇を感じた(笑)
コメントする