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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java大神们,用Jtable做一个想excel一样的表格相关的知识,希望对你有一定的参考价值。

就是那种很像excel的,

头一行有个输入,然后整个表格最左面有1,2,3,4这样专门显示行数的,表格上面有A,B,C,D这样专门显示列数的.

然后你选中那个单元格它就高亮显示,从头一行的输入里输入东西回车就会显示在那个选中的单元格里
还有做几十行,右面和下面+两个滚动轴能实现么?
能给做下么,拜谢

就我上面说这些就行,主要就是用Jtable 模拟一个类似的界面,不需要那么多功能,基本的这几条就行

3L的大大能不能帮我再+点东西,这个跟我要的还差一点,就一点.别的大大们也来看看,加了我另开一贴给分

你要模拟excel,要做的东西可就多了去了....
..功能那么多,什么时候才能实现的完啊.......
要是单纯的JTable还可以考虑下.....
最好把功能细化一下.....具体希望实现什么....

import javax.swing.*;

import java.awt.*;
import javax.swing.table.*;
import javax.swing.event.*;
import java.awt.event.*;
public class TableRowHeaderTest

public static void main(String[] args)

new TableRowHeaderFrame();


class TableRowHeaderFrame extends JFrame

public TableRowHeaderFrame()
DefaultTableModel model = new DefaultTableModel(50,15);
JTable table = new JTable(model);
/*将table加入JScrollPane*/
JScrollPane scrollPane = new JScrollPane(table,
JScrollPane.VERTICAL_SCROLLBAR_ALWAYS,
JScrollPane.HORIZONTAL_SCROLLBAR_ALWAYS);
/*将rowHeaderTable作为row header加入JScrollPane的RowHeaderView区域*/
scrollPane.setRowHeaderView(new RowHeaderTable(table,40));

// this.getContentPane().add(scrollPane,BorderLayout.CENTER);
this.setContentPane(scrollPane);

this.setVisible(true);
this.setSize(400,300);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);



/**
* 用于显示RowHeader的JTable,只需要将其加入JScrollPane的RowHeaderView即可为JTable生成行标题
*/
class RowHeaderTable extends JTable

private JTable refTable;//需要添加rowHeader的JTable
/**
* 为JTable添加RowHeader,
* @param refTable 需要添加rowHeader的JTable
* @param columnWideth rowHeader的宽度
*/
public RowHeaderTable(JTable refTable,int columnWidth)
super(new RowHeaderTableModel(refTable.getRowCount()));
this.refTable=refTable;
//table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);

this.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);//不可以调整列宽

this.getColumnModel().getColumn(0).setPreferredWidth(columnWidth);
this.setDefaultRenderer(Object.class,new RowHeaderRenderer(refTable,this));//设置渲染器
this.setPreferredScrollableViewportSize (new Dimension(columnWidth,0));


/**
* 用于显示RowHeader的JTable的渲染器,可以实现动态增加,删除行,在Table中增加、删除行时RowHeader
* 一起变化。当选择某行时,该行颜色会发生变化
*/
class RowHeaderRenderer extends JLabel implements TableCellRenderer,ListSelectionListener

JTable reftable;//需要添加rowHeader的JTable
JTable tableShow;//用于显示rowHeader的JTable
public RowHeaderRenderer(JTable reftable,JTable tableShow)

this.reftable = reftable;
this.tableShow=tableShow;
//增加监听器,实现当在reftable中选择行时,RowHeader会发生颜色变化
ListSelectionModel listModel=reftable.getSelectionModel();
listModel.addListSelectionListener(this);

public Component getTableCellRendererComponent(JTable table,Object obj,
boolean isSelected,boolean hasFocus,int row, int col)

((RowHeaderTableModel)table.getModel()).setRowCount(reftable.getRowCount());
JTableHeader header = reftable.getTableHeader();
this.setOpaque(true);
setBorder(UIManager.getBorder("TableHeader.cellBorder"));//设置为TableHeader的边框类型

setHorizontalAlignment(CENTER);//让text居中显示

setBackground(header.getBackground());//设置背景色为TableHeader的背景色
if ( isSelect(row) ) //当选取单元格时,在row header上设置成选取颜色

setForeground(Color.white);
setBackground(Color.lightGray);

else

setForeground(header.getForeground());

setFont(header.getFont());
setText(String.valueOf(row+1));
return this;

public void valueChanged(ListSelectionEvent e)
this.tableShow.repaint();

private boolean isSelect(int row)

int[] sel = reftable.getSelectedRows();
for ( int i=0; i<sel.length; i++ )
if (sel[i] == row )
return true;
return false;



/**
* 用于显示表头RowHeader的JTable的TableModel,不实际存储数据
*/
class RowHeaderTableModel extends AbstractTableModel

private int rowCount;//当前JTable的行数,与需要加RowHeader的TableModel同步
public RowHeaderTableModel(int rowCount)
this.rowCount=rowCount;

public void setRowCount(int rowCount)
this.rowCount=rowCount;

public int getRowCount()
return rowCount;

public int getColumnCount()
return 1;

public Object getValueAt(int row, int column)
return row;



//本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/chosen0ne/archive/2009/08/17/4456685.aspx
参考技术A 可以做到的 参考技术B 可以做,但没人会替你做,自己多学吧 参考技术C 我发邮件给你,百度HI
那个本回答被提问者采纳

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

【中文标题】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 Swing 如何使用DefaultTableModel交替刷新JTable?

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

java spring MVC 用poi做Excel导入碰到一个问题,求大神指教,有关下拉框的问题

excel的某个sheet被加密了,怎么用java打开并读取这个sheet

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

java 查询将JTable导出到Excel文件中