英文:
Accessing object through variable in JAVA for Window based application
问题
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);
}
...
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
lblNewLabel.setText(cell.toString());
}
});
Rest of the GUI code remains unchanged.
英文:
So, I am developing a GUI based application that reads data from Excel using Apache POI and displays it using JAVA AWT/SWING
based Window Application. So, to start with I have integrated Apache POI
in GUI
based JAVA
project.
So, now I am trying to access a particular cell data from excel and print it in the GUI App.
I have sorted out how to get particular cell data from excel to Java and how to use Jlabel
. To proceed it with I need to send the cell data to JLabel
.
I have done the following to get Cell data: Clearly, we have cell
object from Cell
class. How do I send this cell
data to JLabel
?
I have the following code for 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);
}
Clearly we have cell
object from Cell
class. How do I send this cell
data to JLable
?
I have the following code for JLable
.
Here after we press the button the content of the Lable
changes.
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);
But it's showing error. I even declared a new string and passed it using cell
object. But it didn't work either.
I am looking for a way to pass the output from Cell to JLabel
.
Both are in the main function only.
Below is the entire code.
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);
}
}
Don't mind all other GUI code. They are just some bunch of buttons, text fields.
答案1
得分: 1
首先,您需要在initialize
方法的范围内获取Cell cell
,或者Cell cell
必须作为类成员,就像JLabel lblNewLabel
一样。
另一种解决方案是创建一个公共方法,从工作簿中获取单元格内容,然后可以从initialize
方法内部调用该方法。
然后,JLabel
的setText
方法需要一个String
作为参数。因此,您需要将cell
的内容转换为String
。
因此,最简单的解决方案是:
...
String cellContent = cell.toString();
...
但这不是首选的方法。相反,使用apache poi
的DataFormatter
来将Cell
中的内容转换为String
。DataFormatter
会以与Excel
显示单元格内容相同的方式获取该String
。
...
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
时创建一次。
英文:
First you need to get the Cell cell
in the scope of the initialize
method or the Cell cell
would must be a class member as JLabel lblNewLabel
also is.
Another solution would be having a public method to get the cell content from the workbook which then can be called from within the initialize
method.
Then, the setText
method of a JLabel
needs a String
as the parameter. So you need converting the content of the cell
to String
.
So simplest solution would be
...
String cellContent = cell.toString();
...
But that is not the preferred way to do it. Instead do using DataFormatter
of apache poi
to get the cell content out of the Cell
as a String
. DataFormatter
will get that String
the same as Excel
shows the cell content.
...
DataFormatter formatter = new DataFormatter();
...
String cellContent = formatter.formatCellValue(cell);
...
If there can be formula cells and you need the formula results instead of the formulas, then you will need FormulaEvaluator
additionally.
...
DataFormatter formatter = new DataFormatter();
FormulaEvaluator evaluator = wb.getCreationHelper().createFormulaEvaluator();
...
String cellContent = formatter.formatCellValue(cell, evaluator);
...
So to extend your code you could have following method:
...
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;
}
...
And then in your initialize
method:
...
public void actionPerformed(ActionEvent e) {
//JOptionPane.showMessageDialog(null, "Hello World!");
lblNewLabel.setText(getCellContent());
}
...
But of course this will always get the same cell content from the sheet. So for practical usage the getCellContent
would must have parameters to tell what concrete cell shall be read. And then the method should not open the workbook every single time a cell content shall got. So Workbook wb
, DataFormatter formatter
and FormulaEvaluator evaluator
should be class members and created only once while initialize
.
答案2
得分: 0
你正在尝试访问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());
}
});
英文:
You are trying to access cell
, but it is defined in another scope.
You could create method, which returns the cell-string.
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;
}
and then access it like so:
JButton btnNewButton = new JButton("Show me!");
btnNewButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
//JOptionPane.showMessageDialog(null, "Hello World!");
lblNewLabel.setText(getCell());
}
});
通过集体智慧和协作来改善编程学习和解决问题的方式。致力于成为全球开发者共同参与的知识库,让每个人都能够通过互相帮助和分享经验来进步。
评论