mirror of
https://github.com/apache/superset.git
synced 2026-04-19 16:14:52 +00:00
feat: Add excel export (#22006)
Co-authored-by: Igor Șincariov <igorsinc@pm.me> Co-authored-by: EugeneTorap <evgenykrutpro@gmail.com>
This commit is contained in:
@@ -46,7 +46,7 @@ from superset.exceptions import QueryObjectValidationError
|
||||
from superset.extensions import event_logger
|
||||
from superset.utils.async_query_manager import AsyncQueryTokenException
|
||||
from superset.utils.core import create_zip, get_user_id, json_int_dttm_ser
|
||||
from superset.views.base import CsvResponse, generate_download_headers
|
||||
from superset.views.base import CsvResponse, generate_download_headers, XlsxResponse
|
||||
from superset.views.base_api import statsd_metrics
|
||||
|
||||
if TYPE_CHECKING:
|
||||
@@ -353,24 +353,34 @@ class ChartDataRestApi(ChartRestApi):
|
||||
if result_type == ChartDataResultType.POST_PROCESSED:
|
||||
result = apply_post_process(result, form_data, datasource)
|
||||
|
||||
if result_format == ChartDataResultFormat.CSV:
|
||||
# Verify user has permission to export CSV file
|
||||
if result_format in ChartDataResultFormat.table_like():
|
||||
# Verify user has permission to export file
|
||||
if not security_manager.can_access("can_csv", "Superset"):
|
||||
return self.response_403()
|
||||
|
||||
if not result["queries"]:
|
||||
return self.response_400(_("Empty query result"))
|
||||
|
||||
if len(result["queries"]) == 1:
|
||||
# return single query results csv format
|
||||
data = result["queries"][0]["data"]
|
||||
return CsvResponse(data, headers=generate_download_headers("csv"))
|
||||
is_csv_format = result_format == ChartDataResultFormat.CSV
|
||||
|
||||
if len(result["queries"]) == 1:
|
||||
# return single query results
|
||||
data = result["queries"][0]["data"]
|
||||
if is_csv_format:
|
||||
return CsvResponse(data, headers=generate_download_headers("csv"))
|
||||
|
||||
return XlsxResponse(data, headers=generate_download_headers("xlsx"))
|
||||
|
||||
# return multi-query results bundled as a zip file
|
||||
def _process_data(query_data: Any) -> Any:
|
||||
if result_format == ChartDataResultFormat.CSV:
|
||||
encoding = current_app.config["CSV_EXPORT"].get("encoding", "utf-8")
|
||||
return query_data.encode(encoding)
|
||||
return query_data
|
||||
|
||||
# return multi-query csv results bundled as a zip file
|
||||
encoding = current_app.config["CSV_EXPORT"].get("encoding", "utf-8")
|
||||
files = {
|
||||
f"query_{idx + 1}.csv": result["data"].encode(encoding)
|
||||
for idx, result in enumerate(result["queries"])
|
||||
f"query_{idx + 1}.{result_format}": _process_data(query["data"])
|
||||
for idx, query in enumerate(result["queries"])
|
||||
}
|
||||
return Response(
|
||||
create_zip(files),
|
||||
|
||||
Reference in New Issue
Block a user