Sri Harsha Nitesh Ответов: 1

Как создать несколько файлов excel и записать в них данные с помощью Java &apachi POI framework


Мне нужна java программа для следующего запроса,
скажем, n=200000;
java-программа должна создать 15 столбцов в каждой строке с данными ячейки = номером строки
Бывший: 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 .... Вот так.
как только 50k строк завершены, excel должен быть закрыт, и новый файл excel должен быть создан, и данные должны быть продолжены с 50001 и так далее, пока он не достигнет предела n.

Что я уже пробовал:

пробовал делать но получать Java из кучи исключений памяти,

package excelCheckings;

import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;

import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler;
import org.apache.poi.xssf.usermodel.*;

public class MultiWorkbooks {

    @SuppressWarnings("null")
    public static void main(String[] args) throws IOException {
        
        int sc=1;
        Row r; Cell c;
        int i;
        int n=100000;//total result rows
        int rc=50000;// rows per book
        int cou=1,j=0,data=1;
        int doc=0;
        FileOutputStream outputStream = null;
        
        XSSFWorkbook wbo = new XSSFWorkbook();
        XSSFSheet s = null ;
        
        for(i=0;i<=n;i++)
        {
            if(i%rc == 0){
                s=wbo.createSheet();
            }
            if(i!=0 && i%rc == 0)
            {
                
                outputStream = new FileOutputStream("C:/Users/1239320/Desktop/Multi Sheet"+doc+ ".xlsx");
                wbo.write(outputStream);
                outputStream.flush();
                wbo.close();
                System.gc();
                doc++;
                cou=1;			
            }
            r = s.createRow(cou);
            for( j=0;j<15;j++)
            {
                c = r.createCell(j); 
                c.setCellValue(data);			
            }
            System.out.println(data);
            data++;
            cou++;
        }
        
        
        System.out.println("Completed");
    }
    
    
}

Richard MacCutchan

Стараться.

Sri Harsha Nitesh

Это ошибка памяти кучи java, как управлять пространством ?

Patrice T

Покажи свой код !

Sri Harsha Nitesh

Код перешел к вопросу ОП.

Richard MacCutchan

Вы повторяете свой основной цикл 100 000 раз, так что это должно дать ключ к пониманию того, почему вы используете всю кучу.

1 Ответов

Рейтинг:
0

Dave Kreskowiak

Шагайте по коду в отладчике и наблюдайте, что он делает.

Вы создаете объект рабочей книги, затем создаете в нем лист и заполняете его 50 000 строками. Затем вы закрываете книгу и ... ничего. От него не избавиться. Вы используете точно такой же объект рабочей книги и добавляете к нему другой лист. Вы не уничтожили объект рабочей книги, тем самым освободив память, которую он удерживает.

О, и мне нравится наивный вызов System. gc (). он ничего не делает, потому что у вас все еще есть ссылки на те самые объекты, которые забивают всю память.