Index: org/encog/workbench/frames/TrainingDataFrame.java
===================================================================
--- org/encog/workbench/frames/TrainingDataFrame.java	(revision 900)
+++ org/encog/workbench/frames/TrainingDataFrame.java	(working copy)
@@ -41,6 +41,7 @@
 import org.encog.workbench.frames.manager.EncogCommonFrame;
 import org.encog.workbench.models.TrainingSetTableModel;
 import org.encog.workbench.process.ImportExport;
+import org.encog.workbench.util.ExcelAdapter;
 
 public class TrainingDataFrame extends EncogCommonFrame {
 
@@ -135,6 +136,7 @@
 		content.add(new JScrollPane(this.table), BorderLayout.CENTER);
 		//
 		setTitle("Edit Training Data");
+		new ExcelAdapter( this.table );
 	}
 
 }
Index: org/encog/workbench/models/TrainingSetTableModel.java
===================================================================
--- org/encog/workbench/models/TrainingSetTableModel.java	(revision 900)
+++ org/encog/workbench/models/TrainingSetTableModel.java	(working copy)
@@ -61,7 +61,6 @@
 		final TableModelEvent tce = new TableModelEvent(this,
 				TableModelEvent.HEADER_ROW);
 		notifyListeners(tce);
-
 	}
 
 	public void addInputColumn() {
@@ -199,17 +198,25 @@
 		this.listeners.remove(l);
 	}
 
-	public void setValueAt(final Object value, int rowIndex,
+	public void setValueAt(final Object rawValue, int rowIndex,
 			final int columnIndex) {
+		Double value = null;
+		if( rawValue instanceof Double ){
+			value = (Double) rawValue;
+		}else{
+			value = Double.parseDouble( rawValue.toString() );
+		}
+		
 		for (final NeuralDataPair pair : this.data) {
 			if (rowIndex == 0) {
 				if (columnIndex >= pair.getInput().size()) {
 					pair.getIdeal().setData(
 							columnIndex - pair.getInput().size(),
 							((Double) value).doubleValue());
+				}else{
+					pair.getInput().setData(columnIndex,
+							((Double) value).doubleValue());
 				}
-				pair.getInput().setData(columnIndex,
-						((Double) value).doubleValue());
 			}
 			rowIndex--;
 		}
Index: org/encog/workbench/util/ExcelAdapter.java
===================================================================
--- org/encog/workbench/util/ExcelAdapter.java	(revision 0)
+++ org/encog/workbench/util/ExcelAdapter.java	(revision 0)
@@ -0,0 +1,128 @@
+package org.encog.workbench.util;
+
+import java.awt.*;
+import java.awt.event.*;
+import javax.swing.*;
+
+import org.encog.workbench.models.TrainingSetTableModel;
+
+import java.awt.datatransfer.*;
+import java.util.*;
+
+/**
+ * ExcelAdapter enables Copy-Paste Clipboard functionality on JTables. The
+ * clipboard data format used by the adapter is compatible with the clipboard
+ * format used by Excel. This provides for clipboard interoperability between
+ * enabled JTables and Excel.
+ */
+public class ExcelAdapter implements ActionListener {
+	private Clipboard system;
+	private JTable table;
+	private TrainingSetTableModel model;
+
+	/**
+	 * The Excel Adapter is constructed with a JTable on which it enables
+	 * Copy-Paste and acts as a Clipboard listener.
+	 */
+	public ExcelAdapter(JTable table) {
+		if( table.getModel() instanceof TrainingSetTableModel ){
+			model = (TrainingSetTableModel)table.getModel();
+		}else{
+			System.out.println( table.getModel() );
+			throw new RuntimeException( "Table model not supported by " +
+					"ExcelAdapter." );
+		}
+		
+		this.table = table;
+		KeyStroke copy = KeyStroke.getKeyStroke(KeyEvent.VK_C,
+				ActionEvent.CTRL_MASK, false);
+		// Identifying the copy KeyStroke user can modify this
+		// to copy on some other Key combination.
+		KeyStroke paste = KeyStroke.getKeyStroke(KeyEvent.VK_V,
+				ActionEvent.CTRL_MASK, false);
+		// Identifying the Paste KeyStroke user can modify this
+		// to copy on some other Key combination.
+		this.table.registerKeyboardAction(this, "Copy", copy,
+				JComponent.WHEN_FOCUSED);
+		this.table.registerKeyboardAction(this, "Paste", paste,
+				JComponent.WHEN_FOCUSED);
+		system = Toolkit.getDefaultToolkit().getSystemClipboard();
+	}
+
+	/**
+	 * Public Accessor methods for the Table on which this adapter acts.
+	 */
+	public JTable getJTable() {
+		return table;
+	}
+
+	public void setJTable(JTable jTable1) {
+		this.table = jTable1;
+	}
+
+	/**
+	 * This method is activated on the Keystrokes we are listening to in this
+	 * implementation. Here it listens for Copy and Paste ActionCommands.
+	 * Selections comprising non-adjacent cells result in invalid selection and
+	 * then copy action cannot be performed. Paste is done by aligning the upper
+	 * left corner of the selection with the 1st element in the current
+	 * selection of the JTable.
+	 */
+	public void actionPerformed(ActionEvent e) {
+		if (e.getActionCommand().compareTo("Copy") == 0) {
+			StringBuffer sbf = new StringBuffer();
+			// Check to ensure we have selected only a contiguous block of
+			// cells
+			int numcols = table.getSelectedColumnCount();
+			int numrows = table.getSelectedRowCount();
+			int[] rowsselected = table.getSelectedRows();
+			int[] colsselected = table.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(table.getValueAt(rowsselected[i],
+							colsselected[j]));
+					if (j < numcols - 1)
+						sbf.append("\t");
+				}
+				sbf.append("\n");
+			}
+			StringSelection stsel = new StringSelection(sbf.toString());
+			system = Toolkit.getDefaultToolkit().getSystemClipboard();
+			system.setContents(stsel, stsel);
+		}
+		if (e.getActionCommand().compareTo("Paste") == 0) {
+			int startRow = (table.getSelectedRows())[0];
+			int startCol = (table.getSelectedColumns())[0];
+			try {
+				String trstring = (String) (system.getContents(this)
+						.getTransferData(DataFlavor.stringFlavor));
+				StringTokenizer st1 = new StringTokenizer(trstring, "\n");
+				for (int i = 0; st1.hasMoreTokens(); i++) {
+					String rowstring = st1.nextToken();
+					StringTokenizer st2 = new StringTokenizer(rowstring, "\t");
+					for (int j = 0; st2.hasMoreTokens(); j++) {
+						String value = (String) st2.nextToken();
+						setValue(value, startRow + i, startCol + j);
+					}
+				}
+			} catch (Exception ex) {
+				ex.printStackTrace();
+			}
+		}
+	}
+	
+	private void setValue( String value, int row, int column ){
+		if( table.getRowCount() <= row ){
+			model.addRow(-1);
+		}
+		table.setValueAt( value, row, column );
+	}
+}

