Index: src/sas/sasgui/perspectives/fitting/basepage.py
===================================================================
--- src/sas/sasgui/perspectives/fitting/basepage.py	(revision 1c699de71430bdd653ccc6c37fafbe9f0c5c4aee)
+++ src/sas/sasgui/perspectives/fitting/basepage.py	(revision b76e65abd61ba91ec2f10fe99c1e0df6f102becb)
@@ -2929,4 +2929,39 @@
             return False
 
+
+    def _get_copy_params_details(self):
+        """
+        Combines polydisperse parameters with self.parameters so that they can
+        be written to the clipboard (for Excel or LaTeX). Also returns a list of
+        the names of parameters that have been fitted
+
+        :returns: all_params - A list of all parameters, in the format of 
+        self.parameters
+        :returns: fitted_par_names - A list of the names of parameters that have
+        been fitted
+        """
+        # Names of params that are being fitted
+        fitted_par_names = [param[1] for param in self.param_toFit]
+        # Names of params with associated polydispersity
+        disp_params = [param[1].split('.')[0] for param in self.fittable_param]
+
+        # Create array of all parameters
+        all_params = copy.copy(self.parameters)
+        for param in self.parameters:
+            if param[1] in disp_params:
+                # Polydisperse params aren't in self.parameters, so need adding
+                # to all_params
+                name = param[1] + ".width"
+                index = all_params.index(param) + 1
+                to_insert = []
+                if name in fitted_par_names:
+                    # Param is fitted, so already has a param list in self.param_toFit
+                    to_insert = self.param_toFit[fitted_par_names.index(name)]
+                else:
+                    # Param isn't fitted, so mockup a param list
+                    to_insert = [None, name, self.model.getParam(name), None, None]
+                all_params.insert(index, to_insert)
+        return all_params, fitted_par_names
+
     def get_copy_excel(self):
         """
@@ -2942,42 +2977,43 @@
         Get the string copies of the param names and values in the tap
         """
+        if not self.parameters:
+            # Do nothing if parameters doesn't exist
+            return False
+
         content = ''
-
         crlf = chr(13) + chr(10)
         tab = chr(9)
 
-        # Do it if params exist
-        if self.parameters:
-
-            disp_params = []
-            for param in self.disp_list:
-                p1, p2 = param.split('.')
-                if p1 not in disp_params:
-                    disp_params.append(p1)
-
-            for param in self.parameters:
-                content += param[1]  # parameter name
+        all_params, fitted_param_names = self._get_copy_params_details()
+
+        # Construct row of parameter names
+        for param in all_params:
+            name = param[1] # Parameter name
+            content += name
+            content += tab
+            if name in fitted_param_names:
+                # Only print errors for fitted parameters
+                content += name + "_err"
                 content += tab
-                if param[1] in disp_params:
-                    content += param[1] + ".width"
-                    content += tab
-                content += param[1] + "_err"
-                content += tab
-
-            content += crlf
-
-            # row of values and errors...
-            for param in self.parameters:
-                content += param[2].GetValue()  # value
-                content += tab
-                if param[1] in disp_params:
-                    content += str(self.model.getParam(param[1] + '.width'))
-                    content += tab
-                content += param[4].GetValue()  # error
-                content += tab
-
-            return content
-        else:
-            return False
+
+        content += crlf
+
+        # Construct row of parameter values and errors
+        for param in all_params:
+            value = param[2]
+            if hasattr(value, 'GetValue'):
+                # param[2] is a text box
+                value = value.GetValue()
+            else:
+                # param[2] is a float (from our self._get_copy_params_details)
+                value = str(value)
+            content += value
+            content += tab
+            if param[1] in fitted_param_names:
+                # Only print errors for fitted parameters
+                content += param[4].GetValue()
+                content += tab 
+
+        return content
 
     def get_copy_latex(self):
@@ -2994,4 +3030,8 @@
         Get the string copies of the param names and values in the tap
         """
+        if not self.parameters:
+            # Do nothing if self.parameters doesn't exist
+            return False
+        
         content = '\\begin{table}'
         content += '\\begin{tabular}[h]'
@@ -3000,48 +3040,49 @@
         tab = chr(9)
 
-        # Do it if params exist
-        if self.parameters:
-            disp_params = []
-            for param in self.disp_list:
-                p1, p2 = param.split('.')
-                if p1 not in disp_params:
-                    disp_params.append(p1)
-
-            content += '{|'
-            for param in (self.parameters + disp_params):
-                content += 'l|l|'
-            content += '}\hline'
-            content += crlf
-
-            for index, param in enumerate(self.parameters):
-                content += param[1].replace('_', '\_')  # parameter name
+        all_params, fitted_param_names = self._get_copy_params_details()
+
+        content += '{|'
+        for param in all_params:
+            content += 'l|l|'
+        content += '}\hline'
+        content += crlf
+
+        # Construct row of parameter names
+        for index, param in enumerate(all_params):
+            name = param[1] # Parameter name
+            content += name.replace('_', '\_')  # Escape underscores
+            if name in fitted_param_names:
+                # Only print errors for fitted parameters
                 content += ' & '
-                if param[1] in disp_params:
-                    content += param[1].replace('_', '\_') + ".width"
-                    content += ' & '
-                content += param[1].replace('_', '\_') + "\_err"
-                if index < len(self.parameters) - 1:
-                    content += ' & '
-            content += '\\\\ \\hline'
-            content += crlf
-
-            # row of values and errors...
-            for index, param in enumerate(self.parameters):
-                content += param[2].GetValue()  # parameter value
+                content += name.replace('_', '\_') + "\_err"
+            if index < len(all_params) - 1:
                 content += ' & '
-                if param[1] in disp_params:
-                    content += str(self.model.getParam(param[1] + '.width'))
-                    content += ' & '
-                content += param[4].GetValue()  # parameter error
-                if index < len(self.parameters) - 1:
-                    content += ' & '
-            content += '\\\\ \\hline'
-            content += crlf
-
-            content += '\\end{tabular}'
-            content += '\\end{table}'
-            return content
-        else:
-            return False
+
+        content += '\\\\ \\hline'
+        content += crlf
+
+        # Construct row of values and errors
+        for index, param in enumerate(all_params):
+            value = param[2]
+            if hasattr(value, "GetValue"):
+                # value is a text box
+                value = value.GetValue()
+            else:
+                # value is a float (from self._get_copy_params_details)
+                value = str(value)
+            content += value
+            if param[1] in fitted_param_names:
+                # Only print errors for fitted params
+                content += ' & '
+                content += param[4].GetValue()
+            if index < len(all_params) - 1:
+                content += ' & '
+        
+        content += '\\\\ \\hline'
+        content += crlf
+        content += '\\end{tabular}'
+        content += '\\end{table}'
+
+        return content
 
     def set_clipboard(self, content=None):
