import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import javax.swing.table.*;

public class ExcelTest {

    /**
     * @param args
     */
    public static void main(String[] args) {
//  An array of book titles and their associated ISBN numbers
        String[][] data = {
            {"Summerall", "0785214925"},
            {"The Secret Message of Jesus", "084990000X"},
            {"Buck Wild", "159555064X"},
            {"25 Ways to Win with People", "0785260943"},
            {"Aesop and the CEO ", "0785260102"},
            {"ALL Business is Show Business ", "0785206086"},
            {"Becoming A Person of Influence", "0785271007"},
            {"Checklist for Life for Leaders", "0785260013"},
            {"Duct Tape Marketing ", "078522100X"},
            {"38 Values to Live By ", "0849916631"},
            {"Blue Moon", "0785260641"},
            {"Blue Like Jazz ", "9780785263708"},
            {"Wild at Heart ", "0785262989"},
            {"Wild Men, Wild Alaska ", "078521772X "},
            {"The Duct Tape Bible, NCV", "0718018249"}
        };
        String[] headers = {"Title", "ISBN"};
        final JFrame frame = new JFrame("JTable to Excel Hack");
        DefaultTableModel model = new DefaultTableModel(data, headers);
        final JTable table = new JTable(model);
        JScrollPane scroll = new JScrollPane(table);
                
//  my JPopupMenu component
        final JPopupMenu popup = new JPopupMenu();

//  the save JMenuItem and its associated ActionListener
        JMenuItem save = new JMenuItem("save to file");
        save.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent action) {
                try {
                    ExcelExporter exp = new ExcelExporter();
                    exp.exportTable(table, new File("results.xls"));
                } catch (IOException ex) {
                    System.out.println(ex.getMessage());
                    ex.printStackTrace();
                }
            }
        });
        popup.add(save);

//  The open JMenuItem and its associated ActionListener
        JMenuItem open = new JMenuItem("open in Excel");
        open.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent action) {
                try {
//     Note that i'm actually saving the file first
                    ExcelExporter exp = new ExcelExporter();
                    File file = new File("results1.xls");
                    exp.exportTable(table, file);
                    ExcelOpener opn = new ExcelOpener();
                    opn.openTable(file);
                } catch (IOException ex) {
                    System.out.println(ex.getMessage());
                    ex.printStackTrace();
                }

            }
        });
        popup.add(open);

//  the following method only works in JDK 5.0 or greater
//  table.setComponentPopupMenu(popup);

        JLabel label1 = new JLabel("Right Click to Export Data...", JLabel.CENTER);

//  the following code is needed for JDK 1.4
        table.addMouseListener(new MouseAdapter() {

            public void mousePressed(MouseEvent event) {
                if (popup.isPopupTrigger(event)) {
                    popup.show(event.getComponent(), event.getX(), event.getY());
                }
            }

            public void mouseReleased(MouseEvent event) {
                if (popup.isPopupTrigger(event)) {
                    popup.show(event.getComponent(), event.getX(), event.getY());
                }
            }
        });

        frame.getContentPane().add("Center", scroll);
        frame.getContentPane().add("South", label1);
        frame.pack();
        frame.setVisible(true);
    }
}

class ExcelExporter {

    public ExcelExporter() {
    }

    public void exportTable(JTable table, File file) throws IOException {
        TableModel model = table.getModel();
        FileWriter out = new FileWriter(file);

        for (int i = 0; i < model.getColumnCount(); i++) {
            out.write(model.getColumnName(i) + "\t");
        }
        out.write("\n");

        for (int i = 0; i < model.getRowCount(); i++) {
            for (int j = 0; j < model.getColumnCount(); j++) {
//   I added this check for the ISBN conversion
                if (j == 0) {
//    the book Title
                    out.write(model.getValueAt(i, j).toString() + "\t");
                } else {
                    /*
                    the ISBN Number
                    Note that I added a \" to the front of the string
                    and a \t followed by a closing \" to let Excel know
                    that this field is to be converted as text
                     */
                    out.write("\"" + model.getValueAt(i, j).toString() + "\t" + "\"");
                }
            }
            out.write("\n");
        }
        out.close();
        System.out.println("write to " + file);
    }
}

class ExcelOpener {

    public ExcelOpener() {
    }

    public void openTable(File file) throws IOException {
        Runtime run = Runtime.getRuntime();
//  I make the assumption that the client has Excel and
//  the file type .XLS is associated with Excel

//  This is a simple check to find out the operating system
        String lcOSName = System.getProperty("os.name").toLowerCase();
        boolean MAC_OS_X = lcOSName.startsWith("mac os x");
        if (MAC_OS_X) {
            run.exec("open " + file);
        } else {
            run.exec("cmd.exe /c start " + file);
        }
        System.out.println(file + " opened");
    }
}