【问题标题】:Copy jTable row with its grid lines into excel/word documents将 jTable 行及其网格线复制到 excel/word 文档中
【发布时间】:2014-07-26 02:40:05
【问题描述】:

是否可以复制 jTable 行并将其粘贴到 Word 文档或带有格式化网格(彩色水平和垂直网格线)的新电子邮件中。如果可以,如何?

当我从 jTable 复制一行并将其粘贴到 Word 文档中时,Word 将其识别为表格行,但我必须通过添加网格线并为其着色来设置样式

【问题讨论】:

  • 有两个选项可以做到这一点,但这取决于目标的能力。您可以将内容作为 HTML,将其放置在 HTML 表格中,或者您可以创建基于“文本”的行版本(例如使用 -| +)。更大的问题是如何格式化单元格。他们的选择可能是将行的快照呈现到 BufferedImage 并导出
  • @MadProgrammer 有没有获取现有 jTable 的 HTML 版本的方法?
  • 不,你必须再写一个,问题是格式化数据的输出,因为这通常是由 TableCellRenderer 完成的,它返回一个组件,而不是文本
  • @MadProgrammer 很抱歉打扰您,但还有一个问题。我为复制按钮使用了以下代码:Action copy = logtable.getActionMap().get("copy"); ActionEvent ae = new ActionEvent(logtable, ActionEvent.ACTION_PERFORMED, "");复制.actionPerformed(ae);其中 logtable 是我的 jTable .. 我应该在哪里添加 HTML 代码来绘制复制数据的表格?

标签: java swing grid jtable copy


【解决方案1】:

这是一个非常简单的示例,将一行数据复制到基于HTML 的表中。我能够复制任何行并作为基于 HTML 的表格粘贴到 word 中,而没有(很多)问题

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);

        }

    }
}

这是非常有限的,因为这将简单地使用每个单元格的toString 方法来获取单元格的值,这意味着单元格值不会根据值类型或应用程序要求“格式化”。您将不得不自己设计一个将单元格值格式化为String 的解决方案

【讨论】:

  • 非常感谢!这很有用:)
猜你喜欢
  • 1970-01-01
  • 2016-10-09
  • 2023-02-08
  • 1970-01-01
  • 2016-06-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多