Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
198 views
in Technique[技术] by (71.8m points)

java - Copy jTable row with its grid lines into excel/word documents

Is it possible to copy jTable row and paste it into word document or in a new email with its formatted grid (colored horizontal and vertical grid lines).. If yes, how?

When I copy a row from jTable and paste it into word document, Word recognizes it as a table row but I have to style it by adding grid lines and coloring them

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Reply

0 votes
by (71.8m points)

This is a VERY simply example of copying a row of data into a HTML based table. I was able to copy any row and paste into word as a HTML based table without (to many) issues

CopyTable

CopyWord

import java.awt.EventQueue;
import java.awt.Toolkit;
import java.awt.datatransfer.Clipboard;
import java.awt.datatransfer.DataFlavor;
import java.awt.datatransfer.StringSelection;
import java.awt.datatransfer.Transferable;
import java.awt.datatransfer.UnsupportedFlavorException;
import java.awt.event.ActionEvent;
import java.io.InputStream;
import java.io.Reader;
import java.io.StringBufferInputStream;
import java.io.StringReader;
import java.util.ArrayList;
import java.util.Vector;
import javax.swing.AbstractAction;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.table.DefaultTableModel;

public class CopyTable {

    public static void main(String[] args) {
        new CopyTable();
    }

    public CopyTable() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                DefaultTableModel model = new DefaultTableModel();
                for (int index = 0; index < 26; index++) {
                    model.addColumn((char) (index + 65));
                }

                for (int row = 0; row < 26; row++) {
                    Vector rowData = new Vector();
                    for (int col = 0; col < 26; col++) {
                        rowData.add(row + "x" + col);
                    }
                    model.addRow(rowData);
                }

                JTable table = new JTable(model);
                table.getActionMap().put("copy", new AbstractAction() {
                    @Override
                    public void actionPerformed(ActionEvent e) {
                        int row = table.getSelectedRow();
                        StringBuilder sb = new StringBuilder(128);
                        sb.append("<table border=1 width=100%><tr>");
                        for (int col = 0; col < table.getColumnCount(); col++) {
                            sb.append("<td>");
                            sb.append(table.getValueAt(row, col).toString());
                            sb.append("</td>");
                        }
                        sb.append("</tr></table>");

                        Clipboard clipboard = Toolkit.getDefaultToolkit().getSystemClipboard();
                        clipboard.setContents(new HtmlSelection(sb.toString()), null);
                    }
                });

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new JScrollPane(table));
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    private static class HtmlSelection implements Transferable {

        private static ArrayList htmlFlavors = new ArrayList();

        static {

            try {

                htmlFlavors.add(new DataFlavor("text/html;class=java.lang.String"));

                htmlFlavors.add(new DataFlavor("text/html;class=java.io.Reader"));

                htmlFlavors.add(new DataFlavor("text/html;charset=unicode;class=java.io.InputStream"));

            } catch (ClassNotFoundException ex) {

                ex.printStackTrace();

            }

        }

        private String html;

        public HtmlSelection(String html) {

            this.html = html;

        }

        public DataFlavor[] getTransferDataFlavors() {

            return (DataFlavor[]) htmlFlavors.toArray(new DataFlavor[htmlFlavors.size()]);

        }

        public boolean isDataFlavorSupported(DataFlavor flavor) {

            return htmlFlavors.contains(flavor);

        }

        public Object getTransferData(DataFlavor flavor) throws UnsupportedFlavorException {

            if (String.class.equals(flavor.getRepresentationClass())) {

                return html;

            } else if (Reader.class.equals(flavor.getRepresentationClass())) {

                return new StringReader(html);

            } else if (InputStream.class.equals(flavor.getRepresentationClass())) {

                return new StringBufferInputStream(html);

            }

            throw new UnsupportedFlavorException(flavor);

        }

    }
}

This is very limited, as this will simply use each cell's toString method to get the value of the cell, this means that the cell value is not "formatted" according to the values type or application requirements. You're going to have to devise a solution for formatting the cell values to String yourself


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
OGeek|极客中国-欢迎来到极客的世界,一个免费开放的程序员编程交流平台!开放,进步,分享!让技术改变生活,让极客改变未来! Welcome to OGeek Q&A Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...