让JTable和Excel粘贴复制

import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import java.awt.datatransfer.*;
import java.util.*;
/** 
* ExcelAdapter 实现 JTables 中的复制粘贴
* 剪贴板功能。 适配器所用的剪贴板数据格式 
* 与 Excel 所用的剪贴板格式兼容。这提供了 
* 支持的 JTables 和 Excel 间的互操作。 
*/

public class ExcelAdapter implements ActionListener
{
	private String rowstring,value;
	private Clipboard system;
	private StringSelection stsel;
	private JTable jTable1 ;
	/** 
	* Excel 适配器由 JTable 构成,
	* 它实现了 JTable 上的复制粘贴 
	* 功能,并充当剪贴板监听程序。
	*/
	public ExcelAdapter(JTable myJTable)
	{
		jTable1 = myJTable;
		KeyStroke copy = KeyStroke.getKeyStroke(KeyEvent.VK_C,ActionEvent.CTRL_MASK,false);
		// 确定复制按键用户可以对其进行修改
		// 以实现其它按键组合的复制功能。
		KeyStroke paste = KeyStroke.getKeyStroke(KeyEvent.VK_V,ActionEvent.CTRL_MASK,false);
		// 确定粘贴按键用户可以对其进行修改
		// 以实现其它按键组合的复制功能。
		jTable1.registerKeyboardAction(this,"Copy",copy,JComponent.WHEN_FOCUSED);
		jTable1.registerKeyboardAction(this,"Paste",paste,JComponent.WHEN_FOCUSED);
		system = Toolkit.getDefaultToolkit().getSystemClipboard();
	}
	/**
	* 此适配器运行图表的公共读方法。
	*/
	public JTable getJTable() {return jTable1;}
	public void setJTable(JTable jTable1) {this.jTable1=jTable1;}
	/**
	* 在我们监听此实现的按键上激活这种方法。
	* 此处,它监听复制和粘贴 ActionCommands。
	* 包含不相邻单元格的选择导致选择无效,
	* 而且此后复制动作无法执行。
	* 粘贴的方法是将选定内容的左上角与
	* JTable 的当前选定内容的第一个元素对齐。
	*/
	public void actionPerformed(ActionEvent e)
	{
		if (e.getActionCommand().compareTo("Copy")==0)
		{
			StringBuffer sbf=new StringBuffer();
		// 检查以确保我们仅选择了单元格的
		// 相邻块
			int numcols=jTable1.getSelectedColumnCount();
			int numrows=jTable1.getSelectedRowCount();
			int[] rowsselected=jTable1.getSelectedRows();
			int[] colsselected=jTable1.getSelectedColumns();
			if (!((numrows-1==rowsselected[rowsselected.length-1]-rowsselected[0] &&
						numrows==rowsselected.length) &&
					(numcols-1==colsselected[colsselected.length-1]-colsselected[0] &&
					numcols==colsselected.length))){
				JOptionPane.showMessageDialog(null, "Invalid Copy Selection",
						"Invalid Copy Selection",
						JOptionPane.ERROR_MESSAGE);
				return;
			}
			for (int i=0;i<numrows;i++){
				for (int j=0;j<numcols;j++){
					sbf.append(jTable1.getValueAt(rowsselected[i],colsselected[j]));
					if (j<numcols-1){
						 sbf.append("\t");
					}
				}
				sbf.append("\n");
			}
			stsel = new StringSelection(sbf.toString());
			system = Toolkit.getDefaultToolkit().getSystemClipboard();
			system.setContents(stsel,stsel);
		}
		if (e.getActionCommand().compareTo("Paste")==0){
			System.out.println("Trying to Paste");
			int startRow=(jTable1.getSelectedRows())[0];
			int startCol=(jTable1.getSelectedColumns())[0];
			try{
				String trstring= (String)(system.getContents(this).
				getTransferData(DataFlavor.stringFlavor));
				System.out.println("String is:"+trstring);
				StringTokenizer st1=new StringTokenizer(trstring," ");
				String[] rowContents = trstring.split("\n");
				if(rowContents != null && rowContents.length > 0){
					for(int rowIndex=0;rowIndex < rowContents.length; rowIndex++){
						String rowContent = rowContents[rowIndex];
						String[] columnContents = rowContent.split("\t");
						if(columnContents != null && columnContents.length > 0){
							for(int columnIndex=0;columnIndex<columnContents.length;columnIndex++){
								String value = columnContents[columnIndex];
								jTable1.setValueAt(value, startRow+rowIndex, startCol+columnIndex);
							}
						}
					}
				}
//				System.out.println();
//				for(int i=0;st1.hasMoreTokens();i++)
//				{
//					rowstring=st1.nextToken();
//					StringTokenizer st2=new StringTokenizer(rowstring," ");
//					for(int j=0;st2.hasMoreTokens();j++)
//					{
//					value=(String)st2.nextToken();
//					if (startRow+i< jTable1.getRowCount() &&
//					startCol+j< jTable1.getColumnCount())
//					jTable1.setValueAt(value,startRow+i,startCol+j);
//					System.out.println("Putting "+ value+"atrow="+startRow+i+"column="+startCol+j);
//					}
//				}
			}
			catch(Exception ex){
				ex.printStackTrace();
			}
		}
	}
}

  

posted @ 2021-08-05 15:27  信铁寒胜  阅读(93)  评论(0编辑  收藏  举报