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