import java.awt.*;
import java.awt.event.*;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.nio.file.Path;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
import javax.swing.table.DefaultTableModel;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
public class excelTojTable extends JFrame {
/**
*
*/
private static final long serialVersionUID = 1L;
static JTable table;
static JScrollPane scroll;
// header is Vector contains table Column
static Vector headers = new Vector();
static Vector data = new Vector();
// Model is used to construct
DefaultTableModel model = null;
// data is Vector contains Data from Excel File static Vector data = new Vector();
static JButton jbClick;
static JFileChooser jChooser;
static int tableWidth = 0;
// set the tableWidth
static int tableHeight = 0;
// set the tableHeight
public excelTojTable()
{
super("Import Excel To JTable");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
JPanel buttonPanel = new JPanel();
//buttonPanel.setBackground(Color.white);
/*
*
* jChooser = new JFileChooser();
jbClick = new JButton("Select Excel File");
buttonPanel.add(jbClick, BorderLayout.CENTER);
// Show Button Click Event
jbClick.addActionListener(new ActionListener()
{
@Override public void actionPerformed(ActionEvent arg0)
{
jChooser.showOpenDialog(null);
jChooser.setDialogTitle("Select only Excel workbooks");
File file = jChooser.getSelectedFile();
if(file==null)
{
JOptionPane.showMessageDialog(null, "Please select any Excel file.", "Help",JOptionPane.INFORMATION_MESSAGE);
return;
}
else if(!file.getName().endsWith("xls"))
{
JOptionPane.showMessageDialog(null, "Please select only Excel file.", "Error",JOptionPane.ERROR_MESSAGE);
}
else
{
fillData(file);
model = new DefaultTableModel(data, headers);
tableWidth = model.getColumnCount() * 150;
tableHeight = model.getRowCount() * 25;
table.setPreferredSize(new Dimension( tableWidth, tableHeight)); table.setModel(model);
}
}
}
);
*
*
*/
table = new JTable();
table.setAutoCreateRowSorter(true);
model = new DefaultTableModel(data, headers);
table.setModel(model);
table.setBackground(Color.pink);
table.setAutoResizeMode(JTable.AUTO_RESIZE_OFF);
table.setEnabled(false);
table.setRowHeight(25);
table.setRowMargin(4);
tableWidth = model.getColumnCount() * 150;
tableHeight = model.getRowCount() * 25;
table.setPreferredSize(new Dimension( tableWidth, tableHeight));
scroll = new JScrollPane(table); scroll.setBackground(Color.pink);
scroll.setPreferredSize(new Dimension(300, 300));
scroll.setHorizontalScrollBarPolicy( JScrollPane.HORIZONTAL_SCROLLBAR_AS_NEEDED);
scroll.setVerticalScrollBarPolicy( JScrollPane.VERTICAL_SCROLLBAR_AS_NEEDED);
getContentPane().add(buttonPanel, BorderLayout.NORTH);
getContentPane().add(scroll, BorderLayout.CENTER);
setSize(600, 600);
setResizable(true); setVisible(true);
}
/** * Fill JTable with Excel file data. * * @param file * file :contains xls file to display in jTable */
void fillData(File file)
{
int index=-1;
HSSFWorkbook workbook = null;
try {
try {
FileInputStream inputStream = new FileInputStream (new File("C:\\A.xls"));
workbook = new HSSFWorkbook(inputStream);
}
catch (IOException ex)
{
Logger.getLogger(excelTojTable.class. getName()).log(Level.SEVERE, null, ex);
}
String[] strs=new String[workbook.getNumberOfSheets()];
//get all sheet names from selected workbook
for (int i = 0; i < strs.length; i++)
{
strs[i]= workbook.getSheetName(i);
}
JFrame frame = new JFrame("Input Dialog");
String selectedsheet = (String) JOptionPane.showInputDialog(frame, "Which worksheet you want to import ?", "Select Worksheet",
JOptionPane.QUESTION_MESSAGE,
null,
strs,
strs[0]);
if (selectedsheet!=null)
{
for (int i = 0; i < strs.length; i++)
{
if (workbook.getSheetName(i).equalsIgnoreCase(selectedsheet))
index=i;
}
HSSFSheet sheet = workbook.getSheetAt(index);
HSSFRow row=sheet.getRow(0);
headers.clear();
for (int i = 0; i < row.getLastCellNum(); i++)
{
HSSFCell cell1 = row.getCell(i);
headers.add(cell1.toString());
}
data.clear();
for (int j = 1; j < sheet.getLastRowNum() + 1; j++)
{
Vector d = new Vector();
row=sheet.getRow(j);
int noofrows=row.getLastCellNum();
for (int i = 0; i < noofrows; i++)
{
//To handle empty excel cells
HSSFCell cell=row.getCell(i, org.apache.poi.ss.usermodel.Row.CREATE_NULL_AS_BLANK );
System.out.println (cell.getCellType());
d.add(cell.toString());
}
d.add("\n");
data.add(d);
}
}
else
{
return;
}
}
catch (Exception e)
{
e.printStackTrace();
}
}
public static void main(String[] args) {
new excelTojTable();
}
}
我想将Excel(.xls)文件导入JTable,代码可以正常使用jChooser,但我不需要使用它,我想直接使用文件路径来实现这个过程。我试图这样做,但它返回null。我的代码中缺少的点在哪里
答案 0 :(得分:1)
我只能提供可读的文件..
在这种情况下,最简单的方法是将电子表格作为embedded-resource提供,并通过URL访问它。正确形成URL后,获取输入流并使用HSSFWorkbook(InputStream, boolean)
构造函数加载它。
有关获取正确网址的详细信息,请参阅info. page for embedded resource。
请注意,嵌入资源不可用作File
对象。
答案 1 :(得分:0)
代码可以正常使用jChooser
文件选择器将提供完整路径和目录;
FileInputStream inputStream = new FileInputStream (new File("C:\\A.xls"));
我猜你需要指定包含文件的正确目录。
所以使用文件选择器重新测试并添加调试代码以显示File对象。然后获取该字符串值并创建File对象。通过这种方式,您可以正确地编码路径。
问题是你为什么要这样做。您不应该在程序中使用硬编码数据。
编辑:
所以基本上你需要重写ActionListener代码。逻辑应该是这样的:
File file = getFile();
System.out.println(file); // make sure the File object is the same in both cases.
fileData( file );
然后在getFile()
方法中添加逻辑以获取File对象。首先,您可以尝试简单地返回硬编码的File对象。然后,您可以更改代码以从文件选择器获取文件。如果你返回相同的File对象,那么代码就可以了。