Добавлять строку в excel каждый раз, когда функция вызывается в JAVA

Я использую этот код, чтобы добавить строку в конце листа Excel. Каждый раз, когда вызывается функция. Где last=0 при инициализации.

connectionTime, mobility, angleofArrival, sender and peer

- это некоторые переменные, значения которых изменяются при вызове функции. и есть значение, которое я хочу сохранить в каждой строке при вызове функции.

public void excelWriter(DTNHost sender, DTNHost peer){
         String fileName = "Results.xls";      

            try {

                            File file = new File(fileName);
                            FileInputStream fin = null;  
                            HSSFWorkbook workbook = null;  
                            HSSFSheet worksheet = null;  
                            FileOutputStream fout = null;
                            POIFSFileSystem lPOIfs = null;
                            if (file.exists()) {
                                try{
                                    fout = new FileOutputStream(fileName, true);
                                    fin = new FileInputStream(fileName);
                                    lPOIfs = new POIFSFileSystem(fin);
                                    workbook = new HSSFWorkbook(lPOIfs);
                                    worksheet = workbook.getSheet("POI Worksheet");

                                    for (int i=0; i<workbook.getNumberOfSheets(); i++) {
                                        System.out.println( workbook.getSheetName(i) );                                    
                                    }
                                    HSSFSheet sheet = workbook.getSheetAt(0);
                                    last = sheet.getLastRowNum();
                                }catch (IOException e) {  
                                    e.printStackTrace();  
                                }catch (NullPointerException e){
                                    e.printStackTrace(); 
                                }
                            } else {
                                //create new file
                                try{
                                fout = new FileOutputStream(file);                            
                                }catch (IOException e) {  
                                    e.printStackTrace();  
                                }
                                workbook = new HSSFWorkbook();                       
                                worksheet = workbook.createSheet("POI Worksheet");  
                            }

                            if(last != 0){
                                last = worksheet.getLastRowNum();
                            }else{

                                last = worksheet.getLastRowNum()+1;
                                System.out.println(last);

                            }

                HSSFRow row = worksheet.createRow(last++);                  
                HSSFCell cellA1 = row.createCell((int)0);
                cellA1.setCellValue(sender+" and "+peer);               
                HSSFCell cellB1 = row.createCell((int) 1);
                cellB1.setCellValue(mobility);      
                HSSFCell cellC1 = row.createCell((int) 2);
                cellC1.setCellValue(angleOfArival);
                HSSFCell cellD1 = row.createCell((int) 3);
                cellD1.setCellValue(connectionTime);    
                System.out.println("Data written");
                workbook.write(fout);
                fout.flush();

                fout.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (IOException e) {
                e.printStackTrace();
            }




           ////End
    }

Но он добавляет только одну строку (только в первый раз). Я сделал отладку этого. Значение last увеличивается каждый раз, когда вызывается функция, но строка не добавляется каждый раз. Может ли кто-нибудь сказать мне, что я делаю неправильно здесь.


person Adnan Ali    schedule 15.03.2016    source источник
comment
Можете ли вы опубликовать свой полный код?   -  person S.B    schedule 15.03.2016
comment
это код, который я использую для записи данных в Excel. неизвестные значения являются переменными. Какие могут быть фиктивные значения, я меняю их в вопросе. чтобы было понятнее. Весь код больше 500 строк и тоже неактуален   -  person Adnan Ali    schedule 15.03.2016
comment
fout = new FileOutputStream(fileName, true); Пожалуйста, взгляните на файл. Его размер должен быстро увеличиваться, так как вы добавляете полные рабочие книги одну за другой при каждом запуске кода. Не используйте здесь режим добавления. Workbook.write каждый раз записывает полную книгу.   -  person Axel Richter    schedule 15.03.2016
comment
Вы сказали, что не делать. но так что я должен делать тогда.   -  person Adnan Ali    schedule 15.03.2016
comment
Это показывает это исключение, если я удаляю true. Невозможно прочитать весь заголовок; прочитано 0 байт; ожидается 512 байт.   -  person Adnan Ali    schedule 15.03.2016
comment
Не пытайтесь писать в файл, пока вы его читаете! Нажмите на открытие потока вывода файла позже, как только вы загрузите книгу в память.   -  person Gagravarr    schedule 15.03.2016
comment
скажите мне изменения, которые мне нужно внести в код. я пробовал все. Я больше не могу понять никакой логики   -  person Adnan Ali    schedule 15.03.2016
comment
Можете ли вы показать, где и как вы объявили переменную последней?   -  person The Guest    schedule 15.03.2016


Ответы (1)


public void excelWriter(DTNHost sender, DTNHost peer) {
    String fileName = "Results.xls";
    int last = 0;
    try {

        File file = new File(fileName);
        FileInputStream fin = null;
        HSSFWorkbook workbook = null;
        HSSFSheet worksheet = null;
        FileOutputStream fout = null;
        POIFSFileSystem lPOIfs = null;
        if (file.exists()) {
            try {

                fin = new FileInputStream(fileName);
                lPOIfs = new POIFSFileSystem(fin);
                workbook = new HSSFWorkbook(lPOIfs);
                worksheet = workbook.getSheet("POI Worksheet");
                last = worksheet.getLastRowNum() + 1;

                fout = new FileOutputStream(fileName);

            } catch (IOException e) {
                e.printStackTrace();
            } catch (NullPointerException e) {
                e.printStackTrace();
            }
        } else {
            // create new file
            try {

                fout = new FileOutputStream(file);
            } catch (IOException e) {
                e.printStackTrace();
            }
            workbook = new HSSFWorkbook();
            worksheet = workbook.createSheet("POI Worksheet");

        }
        HSSFRow row = worksheet.createRow(last);
        HSSFCell cellA1 = row.createCell((int) 0);
        cellA1.setCellValue(sender + " and " + peer);
        HSSFCell cellB1 = row.createCell((int) 1);
        cellB1.setCellValue("mobility");
        HSSFCell cellC1 = row.createCell((int) 2);
        cellC1.setCellValue("angleOfArival");
        HSSFCell cellD1 = row.createCell((int) 3);
        cellD1.setCellValue("connectionTime");
        System.out.println("Data written");
        workbook.write(fout);
        fout.flush();
        fout.close();

    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

    //// End
}

Вышеупомянутый метод работает, OutputStream открывается после загрузки рабочего листа, удаляется строка HSSFSheet sheet = workbook.getSheetAt(0);, поскольку она избыточна, у вас уже есть экземпляр рабочего листа, из которого можно получить lastRowNum. Оператор HSSFRow row = worksheet.createRow(last++); использует оператор приращения поста, поэтому он будет продолжать писать в ту же строку значение «последней» переменной будет увеличиваться только после выполнения этого оператора.

person S.B    schedule 16.03.2016
comment
И условие if-else для установки значения последней строки также удалено. Попробуйте это и проверьте, дает ли он ожидаемый результат (некоторые значения жестко закодированы, поскольку ваш полный код был недоступен). - person S.B; 16.03.2016