2017-02-16 6 views
0

アップロードされたスプレッドシートをOracleデータベースBLOB列に格納する必要があります。 ユーザーはADF UIを使用してスプレッドシートをアップロードします。同じスプレッドシートはDBに保存され、後で取得されます。 私たちはPOIを使用してスプレッドシートを処理しています。 アップロードされたファイルはバイト[]に変換され、アプリケーションサーバーに送信されます。 Appserverはblobカラムにも同じ値を保持します。 しかし、後で同じものを取得しようとすると、「Excelが*****。xlsxに解読不能なコンテンツが見つかりました。このブックの内容を回復しますか?メッセージ。 私はこの問題を で解決できました。バイト[]をXSSFWorkbookに変換し、それをバイト[]に変換して永続化しました。 しかし私の要求によると、非常に大きなスプレッドシートを取得し、XSSFWorkbookを初期化するとメモリ不足の問題が発生する可能性があります。アップロードされたスプレッドシートから[]バイトを取得する コードはスプレッドシートをBLOB列に書き込んでPOIを使用してスプレッドシートを取得する

if (uploadedFile != null) { 
     InputStream inputStream; 
     ByteArrayOutputStream byteArrayOutputStream = new   ByteArrayOutputStream(); 
       inputStream = uploadedFile.getInputStream(); 
       int c = 0; 
       while (c != -1) { 
        c = inputStream.read(); 
        byteArrayOutputStream.write((char) c); 
       } 
       bytes = byteArrayOutputStream.toByteArray(); 

      } 

および[]は以下のようにBLOB列に永続化されているのと同じバイト以下の通りです。 1.このバイト[]をBlobCloumnに割り当てます。 2. SQL UpdateステートメントをbolobColumn で更新します。3.ステートメントを実行します。

上記の手順が完了したら、次のようにスプレッドシートを取得します。 1. BlobColumn を読み取ります。2. BlobColumnからバイト[]を取得します。 3.応答のコンテンツタイプを設定して、スプレッドシートをサポートします。 4.バイト[]を送信します。

しかし、上記のダウンロードしたスプレッドシートを開くと、スプレッドシートにエラーが発生します。

UIからバイト[]を受け取った後、以下のような追加ステップを導入すると、問題は解決されます。

InputStream is = new ByteArrayInputStream(uploadedSpreadSheetBytes); 
    XSSFWorkbook uploadedWorkbook = new XSSFWorkbook(is); 

した後、私はXSSFWorkbookにバイト[]に変換した後、[]は冗長であるバックバイトにXSSFWorkbook変換感じる

byteArrayOutputStream = new ByteArrayOutputStream(); 
     workbook.write(byteArrayOutputStream); 
     byte[] spreadSheetBytes = byteArrayOutputStream.toByteArray(); 

以下のようXSSFWorkbookから再びバイト[]を導出します。

ご協力いただければ幸いです。おかげさまで

+0

腐敗がどこかで導入されていますが、プロセスが何であるかは不明です。あなたはそれを一度に1ステップ綴りにして、エラーの発生場所を教えてください。スプレッドシートがどのように保持されているか、どのプロセスによってスプレッドシートが保持されているかについての詳細を含めます。コンバージョンと同じです:どのようにあなたはそれをやっていますか、どのようなプロセスがそれをやっているのですか?私の最初の考えは、POIが 'OutputStream'に書き込み、' ByteArrayOutputStream'が 'toString()'で動作するかもしれないということです。 – jmarkmurphy

答えて

0

イベントの解析(SAX)を使用して、XSSFWorkbook全体を初期化する代わりに、メモリの問題を回避できます。この方法では、メモリの消費量が少ないファイルの部分のみを処理しています。 SAX解析の詳細については、the POI spreadsheet how-to pageを参照してください。 JVMメモリを増やすこともできますが、それはもちろん保証はありません。

+0

私たちはスプレッドシートを読むためにそれを試みました。しかし、ここではバイト[]をDBに書き込むだけです。私たちがUIから来ているときにバイト[]を書くと、スプレッドシートを開いている間に破損したスプレッドシートメッセージが表示されます。代わりに、バイト[]をXSSFWorkbookに変換してバイト[]を戻してDBに書き込むと、問題は発生しません。 – Vasantha

+0

バイト[]をXSSFWorkbookにどのように変換していますか?文字エンコーディング、ファイルヘッダーなどで間違っていることがあります。 XSFFWorkbookに変換するプロセスがいくつかの必要なバイトを追加していると思います。最初のバイト[]のサイズと、バイト[]をXSSFWorkbookから取得した後のものを比較してください。 – FrederikVH

+0

@Vasantha: "しかし、ここではバイト[]をDBに書き込んでいるだけです。"はい、どうやってこれをやっているのか分かりますか?これを行う可能性は1つだけではなく、コードを提供していません。あなたの質問にこの質問を編集して、バイト[]をDBに書いているコードを表示してください。 –

関連する問題