Writes the provided DataFrame to a ODF file.

    Assumes that the DataFrame matches the structure of those produced
    by the ODF() function in this library

    :param df: the DataFrame to write to ODF
    :param file_path: path to which to write the ODF file
    :param headers: A dict of ODF headers, if none are provided will attempt to read them from the ODF file
    :return:

def write_odf(df, file_path, headers=None):
    """
    Writes the provided DataFrame to a ODF file.

    Assumes that the DataFrame matches the structure of those produced
    by the ODF() function in this library

    :param df: the DataFrame to write to ODF
    :param file_path: path to which to write the ODF file
    :param headers: A dict of ODF headers, if none are provided will attempt to read them from the ODF file
    :return:
    """
    if headers is None and hasattr(df, 'headers'):
        headers = df.headers
    else:
        raise AttributeError('ODF headers not provided')

    with open(file_path, 'w') as file:
        file.write(_header_dict_to_str(headers))
        df.to_csv(file, sep='\t', header=False, index=False, mode='w+')