Загруженный файл из Da sh Datatable экспортирует HTML, а не фрейм данных - PullRequest
0 голосов
/ 10 июля 2020

Я новичок в Da sh и борюсь со всей помощью, которую я нашел в Интернете. Любой совет здесь полезен, пожалуйста! У меня есть таблица данных, которую я хочу загрузить с помощью кнопки на экране. Код загрузит файл, но он содержит HTML. Я прочитал это , но не знаю, как добавить @app.server.route в свой код. Когда я прочитал об этом, мне кажется, что серверный маршрут предназначен для больших файлов? У меня всего пара сотен записей. Вот мой код:

import dash
import dash_table
import pandas as pd

#import data
df = pd.read_excel(r'C:\Users\abc\Documents\File.xlsm', sheet_name = "Data")

#clean up the data
new_header = df.iloc[0] #grab the first row for the header
df = df[1:] #take the data less the header row
df.columns = new_header #set the header row as the df header


app = dash.Dash(__name__)

app.layout = html.Div([
        
        html.H3("Data"),
        #horizontal rule
        html.Hr(),
        
        #download button
        html.A(
            html.Button('Download to Excel'),
            id='excel-download',
            download="data.csv",
            href='',
            target="_blank"
        ),
                
        #add a space
        html.P(),
        
        #data table
        dash_table.DataTable(
            id='table',
            columns=[{"name": i, "id": i} for i in df.columns],
            
            data=df.to_dict('records'),
            
            #column headers fixed
            #fixed_rows={'headers': True},
            style_cell={
                'minWidth': 95, 'maxWidth': 95, 'width': 95
            },
            
            #editable formatting
            editable=True,
            filter_action="native",
            sort_action="native",
            sort_mode="multi",
            column_selectable="multi",
            #row_selectable="multi",
            #row_deletable=True,
            selected_columns=[],
            selected_rows=[],
            page_action="native",
            page_current= 0#,
            #page_size= 10,
        ),
        
        
])
        
#style callback
@app.callback(
    Output('datatable-interactivity', 'style_data_conditional'),
    [Input('datatable-interactivity', 'selected_columns')]
)

#download callback  https://community.plotly.com/t/download-raw-data/4700/7
@app.callback(
    dash.dependencies.Output('excel-download', 'href'),
    [dash.dependencies.Input('table', 'value')])
def update_download_link(filter_value):
    dff = filter_data(filter_value)
    csv_string = dff.to_csv(index=False, encoding='utf-8')
    csv_string = "data:text/csv;charset=utf-8," + urllib.quote(csv_string)
    return csv_string



def update_styles(selected_columns):
    return [{
        'if': { 'column_id': i },
        'background_color': '#D2F3FF'
    } for i in selected_columns]


if __name__ == '__main__':
    app.run_server(debug=False, port=5554)

Я не понимаю, как работает строка [dash.dependencies.Input('table', 'value')]) для раздела 'value'. В моем коде нет никакой ценности, как в найденных мною примерах. Я также попытался использовать там «данные», чтобы соответствовать ссылке на данные в DataTable (), но результаты были такими же. Я получаю файл Excel с выводом HTML, а не df.

1 Ответ

1 голос
/ 10 июля 2020

Похоже, вам не хватает export_format

dash_table.DataTable(
            id='table',
            columns=[{"name": i, "id": i} for i in df.columns],
            
            data=df.to_dict('records'),
            
            #column headers fixed
            #fixed_rows={'headers': True},
            style_cell={
                'minWidth': 95, 'maxWidth': 95, 'width': 95
            },
            
            #editable formatting
            editable=True,
            filter_action="native",
            export_format="csv",    # THIS LINE!
            sort_action="native",
            sort_mode="multi",
            column_selectable="multi",
            #row_selectable="multi",
            #row_deletable=True,
            selected_columns=[],
            selected_rows=[],
            page_action="native",
            page_current= 0#,
            #page_size= 10,
        ),
        
...