java中如何在JTable中显示excel数据

Posted

技术标签:

【中文标题】java中如何在JTable中显示excel数据【英文标题】:How to display excel data in JTable in java 【发布时间】:2020-10-02 10:34:12 【问题描述】:

这是我的代码,用于显示 excel 数据文件中的所有数据:

package util;

import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import javax.swing.*;
import java.io.IOException;

public class read 

    public static void main(String[] args) 
        excelRead();
    

    public static void excelRead()

        try 
            int i;
            int j;

            String path = "./data/data.xlsx";
            XSSFWorkbook workbook = new XSSFWorkbook(path);
            XSSFSheet sheet = workbook.getSheet("sheet1");
            for (i = 0; i <=5;i++) 
                for (j = 0; j<=2;j++) 
                    String data = sheet.getRow(i).getCell(j).getStringCellValue();
                    System.out.print(data + "   " );
                    if(j == 2)
                        System.out.println("         ");
                    
                
            
         catch (IOException e) 
            e.printStackTrace();
         catch (NullPointerException e)
            e.printStackTrace();
        
    


我这里有两个问题,

    显示所有数据后显示NullPointerException 我不知道如何将数据显示到JTable

编辑:

这是在 Jtable 上显示 excel 文件数据的代码,但它给了我一个 ArrayOutofBounds 异常:

package util;

import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import javax.swing.*;
import java.awt.*;
import java.io.IOException;

public class Jtable extends JPanel 
    JTable table;

    public Jtable() 
        try 


            String path = "./data/data.xlsx";
            XSSFWorkbook workbook = new XSSFWorkbook(path);
            XSSFSheet sheet = workbook.getSheet("sheet1");
            String[] column = "name", "age", "profession", "gender", "company";
            String[][] data = 
                     sheet.getRow(0).getCell(0).getStringCellValue(),
                            sheet.getRow(0).getCell(1).getStringCellValue(),
                            sheet.getRow(0).getCell(2).getStringCellValue(),
                    sheet.getRow(1).getCell(0).getStringCellValue(),
                            sheet.getRow(1).getCell(1).getStringCellValue(),
                            sheet.getRow(1).getCell(2).getStringCellValue(),
                    sheet.getRow(2).getCell(0).getStringCellValue(),
                            sheet.getRow(2).getCell(1).getStringCellValue(),
                            sheet.getRow(2).getCell(2).getStringCellValue(),
                    sheet.getRow(3).getCell(0).getStringCellValue(),
                            sheet.getRow(3).getCell(1).getStringCellValue(),
                            sheet.getRow(3).getCell(2).getStringCellValue(),
                    sheet.getRow(4).getCell(0).getStringCellValue(),
                            sheet.getRow(4).getCell(1).getStringCellValue(),
                            sheet.getRow(4).getCell(2).getStringCellValue()
            ;
            table = new JTable(data, column);
            table.setPreferredScrollableViewportSize(new Dimension(450, 63));
            table.setFillsViewportHeight(true);
            JScrollPane scrollPane = new JScrollPane(table);
            add(scrollPane);
        catch (IOException e) 
            e.printStackTrace();
         catch (NullPointerException e) 
        
    


    public static void main(String[] args) 
        JFrame frame = new JFrame();
        Jtable panel = new Jtable();
        frame.add(panel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(500, 500);
        frame.setVisible(true);


    

    public static void excelRead() 

        try 
            int i;
            int j;

            String path = "./data/data.xlsx";
            XSSFWorkbook workbook = new XSSFWorkbook(path);
            XSSFSheet sheet = workbook.getSheet("sheet1");
            for (i = 0; i <= 5; i++) 
                for (j = 0; j <= 2; j++) 
                    String data = sheet.getRow(i).getCell(j).getStringCellValue();
                    System.out.print(data + "   ");
                    if (j == 2) 
                        System.out.println("         ");
                    
                
            
         catch (IOException e) 
            e.printStackTrace();
         catch (NullPointerException e) 
        catch (ArrayIndexOutOfBoundsException e)
            e.printStackTrace();
        
    


【问题讨论】:

如果您发布完整的堆栈跟踪 - 无需发布堆栈跟踪。 OP 应该能够读取堆栈跟踪以确定导致问题的行。那么 OP 应该能够解决问题,或者准确地告诉我们语句和该语句中为空的变量。 对于NPE,读取异常并确定哪个变量是null,对于JTable,首先使用虚拟数据创建JTable,然后将信息从Excel转换为@ 987654331@,如图in the tutorial,那么你就搞定了。 您是否尝试过用自己的TableModel 制作自己的JTable?我发布了教程的链接。如果你还没有,你还在等什么?为了获得更好的帮助,请尽快发布带有静态数据的正确minimal reproducible example,表明您已经尝试过JTable 部分,那么如果您仍然不知道如何将Excel 部分与表格部分连接起来,我可以提供帮助跨度> @Frakcool 该问题现已开放供回答。 (抱歉拖了这么久,忙于其他事情。) @AndrewThompson 没问题,我也忙于一些工作,明天我会抽出时间来做这个:) 【参考方案1】:

你所有的ArrayIndexOutOfBoundsException我想都来自这个小部分:

for (i = 0; i <= 5; i++) 
    for (j = 0; j <= 2; j++) 
        // ...
    

你看到错误了吗?

让我们更仔细地看一下:

i <= 5;               j <= 2;

数组有 N 个项目,但它们的索引从 0N - 1,假设您有 5 个项目:

Index    N
  0      1
  1      2
  2      3
  3      4
  4      5
  5      ???

您告诉您的程序从 0 迭代到 5,而在索引 5 处您什么都没有,您正在检查超出范围的内容!

你怎么能解决这个问题?删除比较中的 = 部分

i < 5;           j < 2;

或者更好的是,为您的 Excel 文件使用Iterator,这样,无论您有 1 个、1000 个还是 100 万个条目,您都不必为每个条目修改程序,并且您还可以添加更多列,您的程序不会中断。

至于您的JTable,我的以下答案基于this answer,其中您的数据来自ArrayList 的数据,但您以0 条目开始您的DefaultTableModel,然后添加它们。

在这里,我将向您展示如何:

    将来自 Excel 的数据显示到您的控制台中。 将数据添加到ArrayLists后显示 添加带有虚拟数据的JTable 添加一个JTable,其中包含您从第 2 步获得的 Excel 文件中的数据。

所有这些都嵌入到正确的Minimal, Reproducible Example (MRE) 中,这是您在下一个问题时所期望的。这个问题是一个例外,因为您真的不知道如何使您的程序正常工作,但是对于您未来的问题,我们将要求您创建类似的内容以便我们复制粘贴并能够运行您的程序而无需没有(最好)改变。

在这种情况下,您只需进行一次修改即可运行我的程序:文件路径

import java.awt.BorderLayout;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.SwingUtilities;
import javax.swing.table.DefaultTableModel;

import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellType;
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.xssf.usermodel.XSSFWorkbook;

public class JTableFromExcel 
    private JFrame frame;
    private JTable simpleTable;
    private JTable excelTable;
    private JScrollPane scrollForSimpleTable;
    private JScrollPane scrollForExcelTable;

    private String[] columnNames = "Name", "Profession", "Salary";
    private String[][] data = "Foo", "Foo_Prof", "12345", "Bar", "Bar_Prof", "13579";

    private List<String> columnNamesFromExcel;
    private List<List<String>> dataFromExcel;

    //Creates the UI
    private void createAndShowGUI() 
        retrieveDataFromExcel();

        frame = new JFrame(getClass().getSimpleName());

        simpleTable = new JTable(data, columnNames);
        scrollForSimpleTable = new JScrollPane(simpleTable);

        DefaultTableModel tableModel = new DefaultTableModel(columnNamesFromExcel.toArray(), 0);
        for (List<String> row : dataFromExcel) 
            tableModel.addRow(row.toArray(new String[0]));
        

        excelTable = new JTable(tableModel);
        scrollForExcelTable = new JScrollPane(excelTable);

        frame.add(scrollForSimpleTable, BorderLayout.WEST);
        frame.add(scrollForExcelTable, BorderLayout.EAST);
        frame.pack();
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setVisible(true);
    

    //Opens the Excel file and sets up the data and column names
    @SuppressWarnings("resource")
    private void retrieveDataFromExcel() 
        FileInputStream excelFile;

        columnNamesFromExcel = new ArrayList<>();
        dataFromExcel = new ArrayList<>();
        try 
            excelFile = new FileInputStream(new File("PATH/TO/YOUR/FILE.xlsx"));
            Workbook workbook = new XSSFWorkbook(excelFile);
            Sheet datatypeSheet = workbook.getSheetAt(0);
            Iterator<Row> iterator = datatypeSheet.iterator(); //We use an iterator to get all rows

            while (iterator.hasNext()) 
                Row currentRow = iterator.next();
                Iterator<Cell> cellIterator = currentRow.iterator();

                List <String> dataRow = new ArrayList<>();
                while (cellIterator.hasNext()) 
                    Cell currentCell = cellIterator.next();
                    if (currentRow.getRowNum() == 0)  //Row 0 is the header
                        if (currentCell.getCellType() == CellType.STRING) 
                            columnNamesFromExcel.add(currentCell.getStringCellValue());
                         else if (currentCell.getCellType() == CellType.NUMERIC) 
                            columnNamesFromExcel.add(currentCell.getStringCellValue());
                        
                     else 
                        if (currentCell.getCellType() == CellType.STRING) 
                            dataRow.add(currentCell.getStringCellValue());
                         else if (currentCell.getCellType() == CellType.NUMERIC) 
                            dataRow.add(String.valueOf(currentCell.getNumericCellValue()));
                        
                    
                    System.out.print(currentCell + " ");
                
                if (currentRow.getRowNum() > 0)  //Row 0 is the header, if we add the first row, it will add an empty array because we didn't add anything to it before, so we skip it
                    dataFromExcel.add(dataRow);
                
                System.out.println();

            
         catch (FileNotFoundException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
         catch (IOException e) 
            // TODO Auto-generated catch block
            e.printStackTrace();
        
    

    public static void main(String[] args) 
        SwingUtilities.invokeLater(new JTableFromExcel()::createAndShowGUI);
    

这就是你运行上述程序时得到的结果

这是控制台上的输出(excel文件包含相同的信息)

NAME PROFESSION SALARY 
FOO FOO_PROF 12345.0 
BAR BAR_PROF 13579.0 
WAKANDA WAKANDA_PROF 99999.0 

【讨论】:

以上是关于java中如何在JTable中显示excel数据的主要内容,如果未能解决你的问题,请参考以下文章

java中如何把JTable设置为不可编辑

java的swing编程,Jtable的单元格如何赋值

请问在java JTable中如何设置单元格字体居中对齐?

java大神们,用Jtable做一个想excel一样的表格

如何在 Java Netbeans 中查看从 xampp 到 jtable 的数据

java Jtable 如何动态添加button按钮