2016-04-14 19 views
2

次のコードを使用してデータを抽出し、CSVファイルに保存しています。しかし、今問題は、プログラムがデータをCSVファイルに書き込んで、コードが再び実行されるたびに、そのファイルが削除され、古い結果が新しいファイルに置き換えられることです。 質問は、結果を保存して新しい結果を新しい行に保存する方法はありますか?はいの場合はどうすればいいですか?このライブラリApache POIアウト結果をExcelファイルまたはCSVファイルに保存するにはどうすればよいですか?

private void writeReport() { 
    BufferedWriter out = null; 
    try { 
     FileWriter fstream = new FileWriter("out.csv"); 
     out = new BufferedWriter(fstream); 
     out.write("File Name;"); 
     out.write("Total Lines of Code;"); 
     out.write("Executable Lines;"); 
     out.write("Lines of Comments;"); 
     out.write("Trivial Lines;"); 
     out.write("Empty Lines;"); 
     out.write("Code Complexity;"); 
     out.write("Number of Files;"); //to be changed to numver of files 
     out.write("Average File Complexity;"); //to be changed to averag file complexity 
     out.write("Comment Percentage;"); //total 
     out.write("Total Lines of Test Code;"); 
     out.write("Total Comments in Tests;"); 
     out.write("Total Trivial Lines in Tests;"); 
     out.write("Total Empty Lines in Tests;"); 
     out.write("Total Number of Test Files;"); 
     out.write("Comment Presentage in Test;"); 

     out.write(System.getProperty("line.separator")); 

     // for (int i = 0; i < newFiles.getNrOfFiles(); i++) { 
      out.write("test" + ";"); 
     // out.write(newFiles.getParser(i).getSourceFile().getName()+ ";"); 
      out.write(String.valueOf(newFiles.sumLinesOfCode()) + ";"); 
      out.write(String.valueOf(newFiles.sumLinesOfStatements()) + ";"); 
      out.write(String.valueOf(newFiles.sumLinesOfComments()) + ";"); 
      out.write(String.valueOf(newFiles.sumTrivialLines()) + ";"); 
      out.write(String.valueOf(newFiles.sumEmptyLines()) + ";"); 
      out.write(String.valueOf(newFiles.sumComplexity())+ ";"); 
      out.write(String.valueOf(newFiles.getNrOfFiles()) + ";"); 
      out.write(String.valueOf(newFiles.sumAvgComplexity()) + ";"); 
      out.write(String.valueOf((100 * newFiles.sumLinesOfComments())/newFiles.sumLinesOfCode() + "%") + ";"); 

      out.write(System.getProperty("line.separator")); 

     //Close the output stream 
     out.close(); 
    } catch (Exception e) { 
     System.err.println("Error: " + e.getMessage()); 
     // return; 
    } 
} 
+0

「新しいFileWriter(アウト)」はどうですか? – KevinO

答えて

1

は、ファイルが既に

File file = new File("out.csv"); 
boolean exists = file.exists(); 

が存在するかどうかを判断し、ファイルが

FileWriter fstream = new FileWriter(file, exists /*=append*/); 

が存在する場合は追加モードでライターを開き、ファイルがまだ存在していなかった場合にのみ、あなたのヘッダを書き込みます。

if (!exists) { 
    out.write("File Name;"); 
    ... 
    out.write(System.getProperty("line.separator")); 
} 
// write new rows 

あなたがPrintWriterを使用するときにも、いくつかの物事が簡単に取得:

PrintWriter out; 
... 
PrintWriter out = new PrintWriter(new BufferedWriter(fstream)); 
... 
out.println(); // easier than out.write(System.getProperty("line.separator")); 
+0

ヘッダーのブール値を使った特別な考え方ですが、実行するたびにその行がジャンプするので、ヘッダーは完全なものです。それが実行されるたびに行をエスケープ(ジャンプ)するので、2行目に次の実行時に4と6を書き込むと、どうすれば行を書き直すことができますか? ありがとう – user5923402

+0

@ user5923402ヘッダーの後に改行を書くとき、これは 'if(!exists)'のブロック内で行う必要があります - 私の編集を参照してください。 – wero

+0

私の友人、私はあなたに感謝してもらいたいです:) – user5923402

1

チェック:

は、ここに私のコードです。

ここにいくつかのコード例(抜粋して、org.apache.poi.hssf.dev.HSSFテストクラスから抜粋)を示します。 short rownum;

// create a new file 
FileOutputStream out = new FileOutputStream("workbook.xls"); 
// create a new workbook 
Workbook wb = new HSSFWorkbook(); 
// create a new sheet 
Sheet s = wb.createSheet(); 
// declare a row object reference 
Row r = null; 
// declare a cell object reference 
Cell c = null; 
// create 3 cell styles 
CellStyle cs = wb.createCellStyle(); 
CellStyle cs2 = wb.createCellStyle(); 
CellStyle cs3 = wb.createCellStyle(); 
DataFormat df = wb.createDataFormat(); 
// create 2 fonts objects 
Font f = wb.createFont(); 
Font f2 = wb.createFont(); 

//set font 1 to 12 point type 
f.setFontHeightInPoints((short) 12); 
//make it blue 
f.setColor((short)0xc); 
// make it bold 
//arial is the default font 
f.setBoldweight(Font.BOLDWEIGHT_BOLD); 

//set font 2 to 10 point type 
f2.setFontHeightInPoints((short) 10); 
//make it red 
f2.setColor((short)Font.COLOR_RED); 
//make it bold 
f2.setBoldweight(Font.BOLDWEIGHT_BOLD); 

f2.setStrikeout(true); 

//set cell stlye 
cs.setFont(f); 
//set the cell format 
cs.setDataFormat(df.getFormat("#,##0.0")); 

//set a thin border 
cs2.setBorderBottom(cs2.BORDER_THIN); 
//fill w fg fill color 
cs2.setFillPattern((short) CellStyle.SOLID_FOREGROUND); 
//set the cell format to text see DataFormat for a full list 
cs2.setDataFormat(HSSFDataFormat.getBuiltinFormat("text")); 

// set the font 
cs2.setFont(f2); 

// set the sheet name in Unicode 
wb.setSheetName(0, "\u0422\u0435\u0441\u0442\u043E\u0432\u0430\u044F " + 
        "\u0421\u0442\u0440\u0430\u043D\u0438\u0447\u043A\u0430"); 
// in case of plain ascii 
// wb.setSheetName(0, "HSSF Test"); 
// create a sheet with 30 rows (0-29) 
int rownum; 
for (rownum = (short) 0; rownum < 30; rownum++) 
{ 
    // create a row 
    r = s.createRow(rownum); 
    // on every other row 
    if ((rownum % 2) == 0) 
    { 
     // make the row height bigger (in twips - 1/20 of a point) 
     r.setHeight((short) 0x249); 
    } 

    //r.setRowNum((short) rownum); 
    // create 10 cells (0-9) (the += 2 becomes apparent later 
    for (short cellnum = (short) 0; cellnum < 10; cellnum += 2) 
    { 
     // create a numeric cell 
     c = r.createCell(cellnum); 
     // do some goofy math to demonstrate decimals 
     c.setCellValue(rownum * 10000 + cellnum 
       + (((double) rownum/1000) 
       + ((double) cellnum/10000))); 

     String cellValue; 

     // create a string cell (see why += 2 in the 
     c = r.createCell((short) (cellnum + 1)); 

     // on every other row 
     if ((rownum % 2) == 0) 
     { 
      // set this cell to the first cell style we defined 
      c.setCellStyle(cs); 
      // set the cell's string value to "Test" 
      c.setCellValue("Test"); 
     } 
     else 
     { 
      c.setCellStyle(cs2); 
      // set the cell's string value to "\u0422\u0435\u0441\u0442" 
      c.setCellValue("\u0422\u0435\u0441\u0442"); 
     } 


     // make this column a bit wider 
     s.setColumnWidth((short) (cellnum + 1), (short) ((50 * 8)/((double) 1/20))); 
    } 
} 

//draw a thick black border on the row at the bottom using BLANKS 
// advance 2 rows 
rownum++; 
rownum++; 

r = s.createRow(rownum); 

// define the third style to be the default 
// except with a thick black border at the bottom 
cs3.setBorderBottom(cs3.BORDER_THICK); 

//create 50 cells 
for (short cellnum = (short) 0; cellnum < 50; cellnum++) 
{ 
    //create a blank type cell (no value) 
    c = r.createCell(cellnum); 
    // set it to the thick black border style 
    c.setCellStyle(cs3); 
} 

//end draw thick black border 


// demonstrate adding/naming and deleting a sheet 
// create a sheet, set its title then delete it 
s = wb.createSheet(); 
wb.setSheetName(1, "DeletedSheet"); 
wb.removeSheetAt(1); 
//end deleted sheet 

// write the workbook to the output stream 
// close our file. (don't blow out our file handles 
wb.write(out); 
out.close(); 

読み取りまたはファイル内の既存のファイル

読み取りを修正も同様に簡単です。ファイルを読み込むには、org.apache.poi.poifs.Filesystemの新しいインスタンスを作成し、InputStream(XLSのFileInputStreamなど)をコンストラクタに渡して渡します。 org.apache.poi.hssf.usermodel.HSSFWorkbookの新しいインスタンスを構築して、ファイルシステムインスタンスをコンストラクタに渡します。そこから、評価者メソッド(workbook.getSheet(sheetNum)sheet.getRow(rownum), etc)を介して、すべての高レベルモデルオブジェクトにアクセスできます。

あなたが読み込んだファイルを変更するのは簡単です。アセスメントメソッドを使用してオブジェクトを取得し、親オブジェクトのremoveメソッド(sheet.removeRow(hssfrow))で削除し、新しいxlsを作成する場合と同じようにオブジェクトを作成します。あなたが上記のようにちょうどworkbook.write(outputstream)を呼び出すだけで細胞を変更することができたら。

この例はorg.apache.poi.hssf.usermodel.examples.HSSFRead

1

で見ることができてFileWriterクラスは、既存のファイルに追加するか否かを決定するブール値を取る別のコンストラクタを有します。

FileWriter(File file, boolean append) 
0

あなたはそれを正しく実行しています(アイデア)だけでcsv拡張子のファイルを作成します。 Check this out !

0

私は単にMavenのかのGradleを使用して、それを取得しますhttp://opencsv.sourceforge.net/

CSVWriter writer = new CSVWriter(new FileWriter("yourfile.csv"), '\t'); 
    // feed in your array (or convert your data to an array) 
    String[] entries = "first#second#third".split("#"); 
    writer.writeNext(entries); 
    writer.close(); 

を使用します。http://mvnrepository.com/artifact/com.opencsv/opencsvまたはダウンロードし、それを含めますプロジェクト内で手動で実行します。

関連する問題