讓JTable和Excel貼上複製
阿新 • • 發佈:2021-08-05
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(); } } } }