| import gradio as gr | |
| from app import demo as app | |
| import os | |
| _docs = {'SpreadsheetComponent': {'description': 'Creates a spreadsheet component that can display and edit tabular data with question answering capabilities.', 'members': {'__init__': {'value': {'type': 'pandas.core.frame.DataFrame | list | dict | None', 'default': 'None', 'description': 'Default value to show in spreadsheet. Can be a pandas DataFrame, list of lists, or dictionary'}}, 'postprocess': {}, 'preprocess': {'return': {'type': 'typing.Any', 'description': "The preprocessed input data sent to the user's function in the backend."}, 'value': None}}, 'events': {}}, '__meta__': {'additional_interfaces': {}, 'user_fn_refs': {'SpreadsheetComponent': []}}} | |
| abs_path = os.path.join(os.path.dirname(__file__), "css.css") | |
| with gr.Blocks( | |
| css=abs_path, | |
| theme=gr.themes.Default( | |
| font_mono=[ | |
| gr.themes.GoogleFont("Inconsolata"), | |
| "monospace", | |
| ], | |
| ), | |
| ) as demo: | |
| gr.Markdown( | |
| """ | |
| # `gradio_spreadsheetcomponent` | |
| <div style="display: flex; gap: 7px;"> | |
| <a href="https://pypi.org/project/gradio_spreadsheetcomponent/" target="_blank"><img alt="PyPI - Version" src="https://img.shields.io/pypi/v/gradio_spreadsheetcomponent"></a> | |
| </div> | |
| This component is used to answer questions about spreadsheets. | |
| """, elem_classes=["md-custom"], header_links=True) | |
| app.render() | |
| gr.Markdown( | |
| """ | |
| ## Installation | |
| ```bash | |
| pip install gradio_spreadsheetcomponent | |
| ``` | |
| ## Usage | |
| ```python | |
| import gradio as gr | |
| from gradio_spreadsheetcomponent import SpreadsheetComponent | |
| from dotenv import load_dotenv | |
| import os | |
| import pandas as pd | |
| def answer_question(file, question): | |
| if not file or not question: | |
| return "Please upload a file and enter a question." | |
| # Load the spreadsheet data | |
| df = pd.read_excel(file.name) | |
| # Create a SpreadsheetComponent instance | |
| spreadsheet = SpreadsheetComponent(value=df) | |
| # Use the component to answer the question | |
| return spreadsheet.answer_question(question) | |
| with gr.Blocks() as demo: | |
| gr.Markdown("# Spreadsheet Question Answering") | |
| with gr.Row(): | |
| file_input = gr.File(label="Upload Spreadsheet", file_types=[".xlsx"]) | |
| question_input = gr.Textbox(label="Ask a Question") | |
| answer_output = gr.Textbox(label="Answer", interactive=False, lines=4) | |
| submit_button = gr.Button("Submit") | |
| submit_button.click(answer_question, inputs=[file_input, question_input], outputs=answer_output) | |
| if __name__ == "__main__": | |
| demo.launch() | |
| ``` | |
| """, elem_classes=["md-custom"], header_links=True) | |
| gr.Markdown(""" | |
| ## `SpreadsheetComponent` | |
| ### Initialization | |
| """, elem_classes=["md-custom"], header_links=True) | |
| gr.ParamViewer(value=_docs["SpreadsheetComponent"]["members"]["__init__"], linkify=[]) | |
| gr.Markdown(""" | |
| ### User function | |
| The impact on the users predict function varies depending on whether the component is used as an input or output for an event (or both). | |
| - When used as an Input, the component only impacts the input signature of the user function. | |
| - When used as an output, the component only impacts the return signature of the user function. | |
| The code snippet below is accurate in cases where the component is used as both an input and an output. | |
| - **As input:** Is passed, the preprocessed input data sent to the user's function in the backend. | |
| ```python | |
| def predict( | |
| value: typing.Any | |
| ) -> Unknown: | |
| return value | |
| ``` | |
| """, elem_classes=["md-custom", "SpreadsheetComponent-user-fn"], header_links=True) | |
| demo.load(None, js=r"""function() { | |
| const refs = {}; | |
| const user_fn_refs = { | |
| SpreadsheetComponent: [], }; | |
| requestAnimationFrame(() => { | |
| Object.entries(user_fn_refs).forEach(([key, refs]) => { | |
| if (refs.length > 0) { | |
| const el = document.querySelector(`.${key}-user-fn`); | |
| if (!el) return; | |
| refs.forEach(ref => { | |
| el.innerHTML = el.innerHTML.replace( | |
| new RegExp("\\b"+ref+"\\b", "g"), | |
| `<a href="#h-${ref.toLowerCase()}">${ref}</a>` | |
| ); | |
| }) | |
| } | |
| }) | |
| Object.entries(refs).forEach(([key, refs]) => { | |
| if (refs.length > 0) { | |
| const el = document.querySelector(`.${key}`); | |
| if (!el) return; | |
| refs.forEach(ref => { | |
| el.innerHTML = el.innerHTML.replace( | |
| new RegExp("\\b"+ref+"\\b", "g"), | |
| `<a href="#h-${ref.toLowerCase()}">${ref}</a>` | |
| ); | |
| }) | |
| } | |
| }) | |
| }) | |
| } | |
| """) | |
| demo.launch() | |