0

URLからデータをフェッチし、次のコードを使用して既存のExcelファイルに行を追加しようとします。

  if (file.exists()) {
                in=new FileInputStream(new File(path));

                workbook = new HSSFWorkbook(in);
                sheet = workbook.getSheetAt(0);
                in.close();
            } else {
                workbook = new HSSFWorkbook();
                sheet = workbook.createSheet();
                row = sheet.createRow(0);
                row.createCell(0).setCellValue("keyTerm");
                row.createCell(1).setCellValue("username");
                row.createCell(2).setCellValue("Text");
                row.createCell(3).setCellValue("Timestamp");
            }

その後

int count = sheet.getLastRowNum();    
for (int i = 0; i < tweets.length(); i++) {
                        tweet = tweets.getJSONObject(i);
                        count++;
                        row = sheet.createRow(count);
                        row.createCell(0).setCellValue(term);
                        row.createCell(1)
                                .setCellValue(tweet.getString("from_user"));
                        row.createCell(2).setCellValue(
                                tweets.getJSONObject(i).getString("text"));
                        row.createCell(3).setCellValue(
                                tweet.getString("created_at"));
    }

コードは新しいファイルではうまく機能しますが、書き込み用に追加モードでファイルを開いた場合でも、既存のファイルを追加できません。

out = new FileOutputStream(file, true);
            workbook.write(out);
            out.close();
4

1 に答える 1

3

このwriteメソッドは、スプレッドシートに加えた新しい追加のみを書き込むわけではありません。ワークブック全体を出力ストリームに書き込みます。そのため、新しいブック全体を古いブックに追加しようとすると、あなたの考えがうまくいかないことがわかります。

ワークブックをファイルに書き出すときに、既存のファイルに追加したことはありません。ストリームは常に (既定の) 上書きモードで開く必要があるため、ワークブック全体 (およびワークブック全体のみ) がストリームと宛先ファイルに移動します。

out = new FileOutputStream(file);  // or new FileOutputStream(file, false);

追加するものが何もないため、現在のコードはファイルがまだ存在しない場合にのみ機能します。要約すると、追加しないでください。上書きします (または別のファイルに書き込みます)。

于 2013-03-04T21:24:59.940 に答える