Файл XLSX: невозможно записать в одну книгу - PullRequest
1 голос
/ 10 апреля 2020

Я написал код для выбора данных для определенной области во входном Excel и транспонирования и вставки его в выходной Excel. Это чтение и запись - 2 отдельных метода, которые я вызываю из основного метода. Однако после запуска кода и создания файла в нем отображаются только данные, записанные для последнего вызова метода записи. Насколько я понимаю, это должно быть потому, что мой код каждый раз создает новый объект рабочей книги. Хотя я пытался преодолеть это с помощью ключевого слова stati c в моем коде. Пожалуйста, см. Ниже для кода.

public class DataExtractor {

    static FileOutputStream output = null;
    static XSSFWorkbook workbook = null;
    static XSSFSheet sheet = null;
    static XSSFWorkbook outputWorkbook = null;
    static XSSFSheet outputSheet = null;
    static XSSFRow row = null;
    DataFormatter dataFormatter = null;
    public DataExtractor(XSSFWorkbook workbook, XSSFSheet sheet, XSSFWorkbook outputWorkbook, XSSFSheet outputSheet) {
        DataExtractor.workbook = workbook;
        DataExtractor.sheet = sheet;
        DataExtractor.outputWorkbook = outputWorkbook;
        DataExtractor.outputSheet = outputSheet;
        }

        private ArrayList<ArrayList<String>> fetchDataFromInputExcel(){

            //code for fetching data from excel/reading excel only for some grids.

        }

        private ArrayList<ArrayList<String>> pasteTransposedDataIntoOutputExcel(){

            //code for transposing data and pasting it into output excel/writing to excel.

        }

        public static void main(String args[]){
                File file = new File("path of xlsx file");
                workbook = new XSSFWorkbook(new FileInputStream(file));
                sheet = workbook.getSheet("SHEETNAME");
                outputWorkbook = new XSSFWorkbook();
                outputSheet = outputWorkbook.createSheet("OUTPUT");
                DataExtractor obj = new DataExtractor(workbook, sheet, outputWorkbook, outputSheet);
                ArrayList<ArrayList<String>> header = dataExtractor.fetchDataFromInputExcel(//args for mentioning grid area row and col are passed here);
                ArrayList<ArrayList<String>> data = dataExtractor.fetchDataFromInputExcel(//args for mentioning grid area row and col are passed here);

                dataExtractor.pasteTransposedDataIntoOutputExcel(dataExtractor, data, 1, 8);
                dataExtractor.pasteTransposedDataIntoOutputExcel(dataExtractor, header, 1, 1);

                output = new FileOutputStream(new File("path of output.xlsx file"));
                outputWorkbook.write(output);
        }

}

Только операция dataExtractor.pasteTransposedDataIntoOutputExcel(dataExtractor, header, 1, 1) выполняется, и я не вижу данных для предыдущего. Пожалуйста, предложите.

Метод transposeAndPaste:

private boolean transposeAndPasteData(DataExtractor dataExtractor, ArrayList<ArrayList<String>> data, int startRowNum, int startColNum){
        XSSFCell cell = null;
        XSSFRow row = null;
        outputWorkbook = dataExtractor.getOutputWorkbook();
        outputSheet = dataExtractor.getOutputSheet();
        try {
            int startRowIndex = startRowNum - 1;
            int startColIndex = startColNum - 1;
            //paste data row wise
            //for(int rowNum = startColNum-1; rowNum<startColNum+data.size(); rowNum++) {}

            Iterator<ArrayList<String>> colItr = data.iterator();
            while(colItr.hasNext()) {
                row = outputSheet.createRow(startRowIndex++);
                ArrayList<String> colData = colItr.next();
                Iterator<String> rowItr = colData.iterator();

                while(rowItr.hasNext()) {
                    cell = row.createCell(startColIndex++);
                    cell.setCellValue(rowItr.next());
                }
                startColIndex = startColNum - 1;
            }

            dataExtractor.setOutputSheet(outputSheet);
            return true;
        }catch(Exception e) {
            e.printStackTrace();
            return false;
        }

Спасибо, Аман

...