Доступ к объекту через переменную в JAVA для оконного приложения - PullRequest
0 голосов
/ 04 апреля 2020

Итак, я разрабатываю приложение на основе GUI, которое считывает данные из Excel с использованием Apache POI и отображает их с помощью приложения на основе JAVA AWT/SWING Window. Итак, для начала я интегрировал Apache POI в GUI на основе JAVA проекта.

Итак, теперь я пытаюсь получить доступ к данным конкретной ячейки из Excel и распечатать их в приложении GUI. Я разобрался, как получить конкретные данные ячейки из Excel в Java и как использовать Jlabel. Чтобы продолжить, мне нужно отправить данные ячейки в JLabel.

Я сделал следующее, чтобы получить данные ячейки: Очевидно, у нас есть cell объект из Cell класса. Как отправить эти cell данные на JLabel?

У меня есть следующий код для JLabel.

try (InputStream inp = new FileInputStream("C:\\Users\\mohin\\OneDrive\\Desktop\\a.xlsx")) {  
            Workbook wb = WorkbookFactory.create(inp);  
            Sheet sheet = wb.getSheetAt(0);  
            Row row = sheet.getRow(2);  
            Cell cell = row.getCell(2);
            if (cell != null)  
                System.out.println("Data: "+cell);  
            else  
                System.out.println("Cell is empty");  
    }catch(Exception e) {  
        System.out.println(e);  
    } 

Очевидно, что у нас есть cell объект из Cell учебный класс. Как отправить эти cell данные на JLable?

У меня есть следующий код для JLable.

Здесь после нажатия кнопки содержимое Lable изменяется .


lblNewLabel = new JLabel("Hey there. Your GPA is");
        lblNewLabel.setFont(new Font("Tahoma", Font.PLAIN, 18));
        lblNewLabel.setBounds(100, 46, 298, 55);
        frame.getContentPane().add(lblNewLabel);


JButton btnNewButton = new JButton("Show me!");
        btnNewButton.setForeground(Color.BLUE);
        btnNewButton.setFont(new Font("Microsoft YaHei UI", Font.BOLD, 16));
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //JOptionPane.showMessageDialog(null, "Hello World!");
                lblNewLabel.setText(cell);
            }
        });

lblNewLabel.setText(cell);

Но он показывает ошибку. Я даже объявил новую строку и передал ее используя cell объект. Но это тоже не сработало.

Я ищу способ передать выходные данные из ячейки в JLabel.

Оба в основной функции.

Ниже приведен весь код.

package com;

import java.io.FileInputStream;  
import java.io.InputStream;  
import org.apache.poi.ss.usermodel.Cell;  
import org.apache.poi.ss.usermodel.Row;  
import org.apache.poi.ss.usermodel.Sheet;  
import org.apache.poi.ss.usermodel.Workbook;  
import org.apache.poi.ss.usermodel.WorkbookFactory;  
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import java.awt.Font;
import java.awt.Color;
import javax.swing.JTextField;
import javax.swing.JLabel;

public class GUI {

    private JFrame frame;
    private JLabel lblNewLabel;
    private JTextField textField;
    private JTextField textField_1;
    private JLabel lblNewLabel_1;
    private JTextField textField_2;
    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        try (InputStream inp = new FileInputStream("C:\\Users\\mohin\\OneDrive\\Desktop\\a.xlsx")) {  
            Workbook wb = WorkbookFactory.create(inp);  
            Sheet sheet = wb.getSheetAt(0);  
            Row row = sheet.getRow(2);  
            Cell cell = row.getCell(2);
            if (cell != null)  
                System.out.println("Data: "+cell);  
            else  
                System.out.println("Cell is empty");  
    }catch(Exception e) {  
        System.out.println(e);  
    }  


        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    GUI window = new GUI();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     */
    public GUI() {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     */
    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 605, 418);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);

        JButton btnNewButton = new JButton("Show me!");
        btnNewButton.setForeground(Color.BLUE);
        btnNewButton.setFont(new Font("Microsoft YaHei UI", Font.BOLD, 16));
        btnNewButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                //JOptionPane.showMessageDialog(null, "Hello World!");
                lblNewLabel.setText(cell);
            }
        });
        btnNewButton.setBounds(147, 133, 130, 31);
        frame.getContentPane().add(btnNewButton);

        lblNewLabel = new JLabel("Hey there. Your GPA is");
        lblNewLabel.setFont(new Font("Tahoma", Font.PLAIN, 18));
        lblNewLabel.setBounds(100, 46, 298, 55);
        frame.getContentPane().add(lblNewLabel);

        textField = new JTextField();
        textField.setBounds(63, 214, 96, 19);
        frame.getContentPane().add(textField);
        textField.setColumns(10);

        textField_1 = new JTextField();
        textField_1.setBounds(342, 214, 96, 19);
        frame.getContentPane().add(textField_1);
        textField_1.setColumns(10);

        lblNewLabel_1 = new JLabel("Answer-");
        lblNewLabel_1.setFont(new Font("Tahoma", Font.PLAIN, 24));
        lblNewLabel_1.setBounds(139, 323, 122, 48);
        frame.getContentPane().add(lblNewLabel_1);

        textField_2 = new JTextField();
        textField_2.setBounds(301, 329, 174, 42);
        frame.getContentPane().add(textField_2);
        textField_2.setColumns(10);

        JButton btnNewButton_1 = new JButton("Multiply");
        btnNewButton_1.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                int a,b,ans;
                try {
                    a=Integer.parseInt(textField.getText());
                    b=Integer.parseInt(textField_1.getText());
                    ans=a*b;
                    textField_2.setText(Integer.toString(ans));

                }catch(Exception e1) {
                    JOptionPane.showMessageDialog(null,"Enter valid number");
                }
            }
        });
        btnNewButton_1.setBounds(90, 264, 85, 21);
        frame.getContentPane().add(btnNewButton_1);

        JButton btnNewButton_2 = new JButton("Divide");
        btnNewButton_2.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                int a,b,ans;
                try {
                    a=Integer.parseInt(textField.getText());
                    b=Integer.parseInt(textField_1.getText());
                    ans=a/b;
                    textField_2.setText(Integer.toString(ans));

                }catch(Exception e2) {
                    JOptionPane.showMessageDialog(null,"Enter valid number");
                }
            }
        });

        btnNewButton_2.setBounds(330, 264, 85, 21);
        frame.getContentPane().add(btnNewButton_2);
    }
}

Не обращайте внимания на все остальные GUI коды. Это просто несколько кнопок, текстовых полей.

Ответы [ 2 ]

1 голос
/ 04 апреля 2020

Сначала вам нужно получить Cell cell в области действия метода initialize, или Cell cell должен быть членом класса, как и JLabel lblNewLabel.

Другое решение будет иметь метод publi c для получения содержимого ячейки из рабочей книги, который затем можно вызвать из метода initialize.

Затем для метода setText JLabel требуется String в качестве параметра. Таким образом, вам нужно преобразовать содержимое cell в String.

. Таким простым решением будет

...
String cellContent = cell.toString();
...

Но это не самый предпочтительный способ сделать это. Вместо этого используйте DataFormatter из apache poi, чтобы получить содержимое ячейки из Cell как String. DataFormatter получит, что String так же, как Excel показывает содержимое ячейки.

...
DataFormatter formatter = new DataFormatter();
...
String cellContent = formatter.formatCellValue(cell);
...

Если могут быть ячейки формулы и вам нужны результаты формулы вместо формул, тогда вам понадобится FormulaEvaluator дополнительно.

...
DataFormatter formatter = new DataFormatter();
FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
...
String cellContent = formatter.formatCellValue(cell, evaluator);
...

Таким образом, чтобы расширить ваш код, вы можете использовать следующий метод:

...
public String getCellContent() {
 String cellContent = "";
 try (InputStream inp = new FileInputStream("C:\\Users\\mohin\\OneDrive\\Desktop\\a.xlsx"); 
      Workbook wb = WorkbookFactory.create(inp)) {  
  DataFormatter formatter = new DataFormatter();
  FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
  Sheet sheet = wb.getSheetAt(0);  
  Row row = sheet.getRow(2);
  Cell cell = null;
  if (row != null) cell = row.getCell(2);
  cellContent = formatter.formatCellValue(cell, evaluator);
 } catch (Exception e) {
  e.printStackTrace();
 }
 return cellContent;
}
...

А затем в вашем initialize методе:

...
            public void actionPerformed(ActionEvent e) {
                //JOptionPane.showMessageDialog(null, "Hello World!");
                lblNewLabel.setText(getCellContent());
            }
...

Но, конечно, это всегда будет получать одинаковое содержание ячеек с листа. Таким образом, для практического использования getCellContent должен иметь параметры, указывающие, какая конкретная ячейка должна быть прочитана И тогда метод не должен открывать рабочую книгу каждый раз, когда содержимое ячейки должно быть получено. Так что Workbook wb, DataFormatter formatter и FormulaEvaluator evaluator должны быть членами класса и создаваться только один раз, пока initialize.

0 голосов
/ 04 апреля 2020

Вы пытаетесь получить доступ к cell, но он определен в другой области. Вы можете создать метод, который возвращает строку-ячейку.

public String getCell() {
        try (InputStream inp = new FileInputStream("C:\\Users\\mohin\\OneDrive\\Desktop\\a.xlsx")) {  
        Workbook wb = WorkbookFactory.create(inp);  
        Sheet sheet = wb.getSheetAt(0);  
        Row row = sheet.getRow(2);  
        Cell cell = row.getCell(2);
        if (cell != null)  
            return cell.toString(); 
}catch(Exception e) {  
    System.out.println(e);  
}  

return null; } и затем получить к нему доступ так:

JButton btnNewButton = new JButton("Show me!");
    btnNewButton.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent e) {
            //JOptionPane.showMessageDialog(null, "Hello World!");
            lblNewLabel.setText(getCell());
        }
    });
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...