web-dev-qa-db-ja.com

Javaを使用してメモリ内にExcelファイルを作成し、ダウンロード用のバイトとして渡します

jxlライブラリを使用してExcelファイルを作成しました。コードは正常に機能していますが、唯一の問題は、サービスからの動的な値からExcelファイルを作成するたびに、Excelのコンテンツが次のようにtest.xlsに上書きされることです。外部ファイルを作成する代わりに、メモリ内にExcelを構築し、ダウンロード用のバイトを渡す方法はありますか( "test.xls")

File file = new File("test.xls");
WritableWorkbook workbook = Workbook.createWorkbook(file);
:
:
:
:

InputStream in = new FileInputStream(file);

if (in == null) {
    out.close();
}
else 
{
    byte[] buffer = new byte[4096];
    int len;

    while ((len = in.read(buffer)) != -1) {
        out.write(buffer, 0, len);
    }

    out.flush();
    in.close();
    out.close();
}

誰かがこれについて私を助けてくれますか

7
Alex Man

ByteArrayOutputStreamWorkbook.createWorkbook(OutputStream os) メソッドと組み合わせて使用​​して、メモリ内にブックを作成し、作成したバイト配列を任意の出力ストリームにダンプします。

ByteArrayOutputStream baos = new ByteArrayOutputStream();
WritableWorkbook workbook = Workbook.createWorkbook(baos);

// ...

workbook.close();
out.write(baos.toByteArray());
out.flush();
out.close();

または、中間バイト配列を使用せずに、オンザフライで実行することもできます。

WritableWorkbook workbook = Workbook.createWorkbook(out);

// ...

workbook.close();
out.flush();
out.close();

JXLはとにかくワークブックをメモリに保持し、ワークブックが閉じられたときにのみ出力ストリームにフラッシュするため、この方法が望ましい場合があります。

8

これは、POIを使用してExcelを作成し、それをバイトに変換する例です。

    XSSFWorkbook workbook = new XSSFWorkbook();
    XSSFSheet sheet = workbook.createSheet("Sheet 1");

    Row row = sheet.createRow(1);
    Cell cell = row.createCell(cellnum++);
    cell.setCellValue((String) obj);
    ByteArrayOutputStream bos = new ByteArrayOutputStream();
    try {
        workbook.write(bos);
    } catch (IOException e) {
    } finally {
        try {
            bos.close();
            workbook.close();
        } catch (IOException e) {
        }
    }
    byte[] bytes = bos.toByteArray();
8
usr_11