This will return a str of a csv text that is friendly to excel
        :param file_path:        str to the path
        :param quote_everything: bool if True will quote everything if it needs
                                 it or not, this is so it looks pretty in excel.
        :param quote_numbers:    bool if True will quote numbers that are
                                 strings
        :param space_columns:    bool if True it will align columns with spaces
        :return: str

def obj_to_csv(self, file_path=None, quote_everything=False,
                   space_columns=True, quote_numbers=True):
        """
        This will return a str of a csv text that is friendly to excel
        :param file_path:        str to the path
        :param quote_everything: bool if True will quote everything if it needs
                                 it or not, this is so it looks pretty in excel.
        :param quote_numbers:    bool if True will quote numbers that are
                                 strings
        :param space_columns:    bool if True it will align columns with spaces
        :return: str
        """
        list_of_list, column_widths = self.get_data_and_shared_column_widths(
            data_kwargs=dict(quote_numbers=quote_numbers,
                             quote_everything=quote_everything,
                             safe_str=self._excel_cell),
            width_kwargs=dict(padding=0))
        if space_columns:
            csv = [','.join([cell.ljust(column_widths[i])
                             for i, cell in enumerate(row)])
                   for row in list_of_list]
        else:
            csv = [','.join(row) for row in list_of_list]

        if os.name == 'posix':
            ret = '\r\n'.join(csv)
        else:
            ret = '\n'.join(csv)

        self._save_file(file_path, ret)
        return ret