Получить текст в виде строки из ячейки Excel с типом формулы в java (средство форматирования данных не работает) - PullRequest
0 голосов
/ 20 апреля 2020

Как получить текст, хранящийся в ячейке типа формулы в «Book1.xls», прочитанный java с использованием Apache POI?

Вот мой код, который устанавливает формулу в ячейке:

     JTextArea test = new javax.swing.JTextArea();
    InputStream fis = new FileInputStream("D:\\StudyWell\\Book1.xls");
    POIFSFileSystem fs = new POIFSFileSystem( fis );
    HSSFWorkbook wb = new HSSFWorkbook(fs);
    HSSFSheet sheet = wb.getSheetAt(0);
    int count = sheet.getLastRowNum();

        for(int j =0; j<=count; j++){
            HSSFRow row=sheet.getRow(j);  
            HSSFCell cell=row.getCell(0);
            HSSFRichTextString rts=cell.getRichStringCellValue();
            String text = rts.toString();
            an.append("\n");
            an.setEditable(false);
            a2.append(",");
            a2.setEditable(false);
                    String otext = "A"+String.valueOf(j+1);
                    String atext = "E"+String.valueOf(j+1);
                    String formula = "SUBSTITUTE"+"("+otext+","+atext+","+"\"______________\""+")";
                    System.out.println(formula);
                    HSSFCell cell_temp = row.createCell(2);
                    cell_temp.setCellFormula(formula);


            for (int i=1; i<rts.length(); i++) {
                    HSSFFont font = wb.getFontAt(rts.getFontAtIndex(i));

                        if(font.getUnderline()==1){
                            String s = "";

                                s = s + String.valueOf(text.charAt(i));
                                    test.setText(s);
                                    a2.append(test.getText());
                                    an.append(test.getText());    
                    }
            }         
    }
        String aforprint = a2.getText();
        for(int a=0; a<=count; a++){
         HSSFRow row=sheet.getRow(a);  
         HSSFCell cell_temp2 = row.createCell(4);


         String[] temp3 = aforprint.split(",");
         List<String> fixedlen = Arrays.asList(temp3);
         ArrayList<String> alist = new ArrayList<String>(fixedlen);

                if(alist.get(0).equals("")){
                   alist.remove(0);
                   }
             String celltext = String.valueOf(alist.get(a));
             cell_temp2.setCellValue(celltext);

        }

        try {
             FileOutputStream out =  new FileOutputStream(new File("D:\\StudyWell\\Book1.xls"));
             wb.write(out);
             out.close();
             }
             catch (FileNotFoundException e) {
                e.printStackTrace();
             }
             catch (IOException e) {
                e.printStackTrace();
             }

} catch(Exception e) { e.printStackTrace(); } } 

Как вы можете видеть, в ячейке C1,.

есть формула Substitute(A1, E1). Теперь я хочу получить текст, хранящийся в C1, в виде строки в java.

Вот что я попробовал:

     JTextArea test = new javax.swing.JTextArea();
    InputStream fis = new FileInputStream("D:\\StudyWell\\Book1.xls");
    POIFSFileSystem fs = new POIFSFileSystem( fis );
    HSSFWorkbook wb = new HSSFWorkbook(fs);
    DataFormatter formatter = new DataFormatter(); 

    HSSFSheet sheet = wb.getSheetAt(0);
    int count = sheet.getLastRowNum();

        for(int j =0; j<=count; j++){
            HSSFRow row=sheet.getRow(j);  
            HSSFCell cellatc=row.getCell(2);       
            //String rts = cellatc.getStringCellValue();
            //HSSFRichTextString rts = cellatc.getRichStringCellValue();
            //String text = rts.toString();
            String rts = formatter.formatCellValue(cellatc);
            HSSFCell cellata = row.getCell(0);
            cellata.setCellValue(rts);
            cellatc.setCellValue("");
        }

        try {
             FileOutputStream out =  new FileOutputStream(new File("D:\\StudyWell\\Book1.xls"));
             wb.write(out);
             out.close();
             }
             catch (FileNotFoundException e) {
                e.printStackTrace();
             }
             catch (IOException e) {
                e.printStackTrace();
             }
     }

catch(Exception e) { e.printStackTrace(); } 

Это дает OutOfMemory: Insufficient Java Heap Size error, я увеличил java размер кучи до 3024MB. Даже после этого проблема все еще существует.

Есть ли другой способ выполнить эту задачу?
TIA!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...