Populate list with Excel range and keep formatting
variable names

1-letter variable names are difficult to understand. Correct names for variables, functions and classes goes already a long way to comment the intent of the code.
r is a data range, c is a cell, l is the last row in the range, then call em thus

functions

I would extract the code that is needed to parse 1 cell:

def convert_cell(data):
    """converts a single cell"""
    data_string = str(data)
    if data_string == "0.0":
        return "0"
    if data_string[0] == 0:
        return data_string
    if data_string == "None":
        return ""
    try:
        float(data_string)
        return str(int(data))
    except ValueError:
        return data_string


The advantage is that you cal skip some levels of nesting, and it is really clear what each type of input get transformed to. I also refactored the multiple calls to str(c) to a variable

generator

Instead of starting a list, and appending to it, you can better yield the results.

def convertdata(data_range, last_column):
    for cell in data_range:
        yield convert_cell(cell)
        is_last_column = cell.Column == last_column
        is_last_row = cell.Row - 1 == data_range.Rows.Count
        yield "\n" if is_last_column and not is_last_row else "\t"

data_range = sheet.Range(sheet.Cells(2, 1), sheet.Cells(lrow, lcol))
dataf = ''.join(convertdata(data_range, lcol))