como salvar resultados em arquivos Excel ou csv?

Estou usando o código a seguir para extrair alguns dados e salvá-los no arquivo CSV. Mas o problema agora é que o programa grava os dados no arquivo CSV e sempre que o código é executado novamente, isso é excluído e os resultados antigos serão substituídos pelos novos! A questão é: existe alguma maneira de salvar os resultados e armazenar os novos resultados em uma nova linha? Se sim, então como fazer isso?

aqui está o meu código:

 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;
    }
}
Resposta 1

A classe FileWriter possui outro construtor que utiliza um booleano que determina se deve ou não ser anexado ao arquivo existente.

FileWriter(File file, boolean append)
Resposta: 2

Confira esta biblioteca Apache POI .

Aqui está um código de exemplo (extraído e adaptado da classe de teste 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();

Lendo ou modificando um arquivo existente

Ler em um arquivo é igualmente simples. Para ler em um arquivo, crie uma nova instância org.apache.poi.poifs.Filesystem, passando de forma aberta InputStream, como uma FileInputStreampara o seu XLS, para o construtor. Construa uma nova instância de org.apache.poi.hssf.usermodel.HSSFWorkbookpassar a instância do sistema de arquivos para o construtor. De lá você tem acesso a todos os objetos de modelo de alto nível através de seus métodos de assessor (workbook.getSheet(sheetNum), sheet.getRow(rownum), etc).

Modificar o arquivo que você leu é simples. Você recupera o objeto por meio de um método avaliador, remove-o por meio do método de remoção de um objeto pai (sheet.removeRow(hssfrow))e cria objetos da mesma maneira que faria se estivesse criando um novo xls. Quando você terminar de modificar as células, basta ligar workbook.write(outputstream)exatamente como você fez acima.

Um exemplo disso pode ser visto em org.apache.poi.hssf.usermodel.examples.HSSFRead

Resposta: 3

Você está fazendo certo (idéia), basta criar um arquivo com extensão csv. Veja isso !

Resposta: 4

Estou usando o Jackson 2.3.2 e quero definir a primeira tentativa de exibição padrão do ObjectMapper: http://wiki.fasterxml.com/JacksonJsonViews#Implementation // atalho: objectMapper.writeValueUsingView (out, ...

Enquanto estou trabalhando no meio de algum projeto do kotlin, fiquei com uma confusão, como se uma classe filho implementa outra classe pai ou implementa uma interface? como se estivesse usando algumas interfaces e ...

Estou recebendo esse erro no ambiente Linux ao exibir gráficos de pizza 3D no navegador da web. Funciona perfeitamente bem no ambiente do Windows. java.lang.NoClassDefFoundError: Não foi possível ...

Olá, estou usando uma tabela por mapeamento de herança de hierarquia de classes para dados herdados, conforme descrito aqui http: //docs.jboss.org/hibernate/core/3.3/reference/en/html/inheritance.html#inheritance -...