ExportToXLSX
Exports context data to a Microsoft Excel Open XML Spreadsheet (XLSX) file.
- Type
- python
- Pack
- CommonScripts
Source
import demistomock as demisto # noqa: F401
from CommonServerPython import * # noqa: F401
from xlsxwriter import Workbook
from xlsxwriter.format import Format
def write_data(sheet: str, data_item: dict | list, data_headers: list | None, workbook: Workbook, bold: Format, border: Format):
if not isinstance(data_item, list):
data_item = [data_item]
if not data_headers:
data_headers = list(data_item[0].keys())
worksheet = workbook.add_worksheet(sheet)
row = 0
col = 0
for key in data_headers:
worksheet.write(row, col, key, bold)
col += 1
for item in data_item:
if item and isinstance(item, dict):
col = 0
row += 1
for header in data_headers:
item_value = item.get(header)
if item_value:
if isinstance(item_value, list):
worksheet.write(row, col, ", ".join(item_value), border)
else:
worksheet.write(row, col, str(item_value), border)
col += 1
def parse_data(data: str | dict | list, sheets: list):
if isinstance(data, str): # Indicates that the data is a comma-separated list of context keys.
data_list = json.loads("[" + data + "]")
if len(sheets) != len(data_list):
raise ValueError("Number of sheet names should be equal to the number of data items.")
return data_list
else:
if len(sheets) != 1:
raise ValueError("Number of sheet names should be equal to the number of data items.")
return [data]
def prepare_bold_and_border(workbook: Workbook, is_bold: bool, is_border: bool):
bold_value = 1 if is_bold else 0
border_value = 1 if is_border else 0
bold = workbook.add_format({"bold": bold_value, "border": border_value})
border = workbook.add_format({"border": border_value})
return bold, border
def main():
try:
args = demisto.args()
data = args.get("data")
file_name = args.get("file_name")
if not is_filename_valid(file_name): # pragma: no cover
raise DemistoException("The file name contains invalid characters")
sheet_name = args.get("sheet_name")
headers = args.get("headers")
is_bold = argToBoolean(args.get("bold", "true"))
is_border = argToBoolean(args.get("border", "true"))
sheets = argToList(sheet_name)
data = parse_data(data, sheets)
if headers:
headers_list = argToList(headers, separator=";")
if len(sheets) != len(headers_list):
raise ValueError("Number of sheet headers should be equal to the number of sheet names")
else:
headers_list = None
with Workbook(file_name) as workbook:
bold, border = prepare_bold_and_border(workbook, is_bold, is_border)
multi_header_list: list[list | None] = []
if headers_list: # Can be 1 item in case there is one sheet, or multiple items in case there are multiple
# sheets
for header_list in headers_list:
multi_header_list.append(header_list.split(","))
else:
multi_header_list = [None] * len(sheets)
for sheet, data_item, headers_list in zip(sheets, data, multi_header_list):
write_data(sheet, data_item, headers_list, workbook, bold, border)
return_results(file_result_existing_file(file_name))
except Exception as ex:
return_error(f"Failed to execute ExportToXLSX script. Error: {ex!s}")
if __name__ in ("__main__", "__builtin__", "builtins"):
main()
README
Exports context data to a Microsoft Excel Open XML Spreadsheet (XLSX) file.
Script Data
| Name | Description |
|---|---|
| Script Type | python3 |
| Tags | |
| Cortex XSOAR Version | 5.0.0 |
Inputs
| Argument Name | Description |
|---|---|
| file_name | The output file name (for example “Report.xlsx”). |
| data | The data to export. Accepts a context key of a dictionary or a list of dictionaries for a single sheet file (${data}). Separate multiple sheet files using a comma “,”. For example, if you are exporting multiple sheet files, the argument would be: ${data1},${data2}. |
| sheet_name | The sheet name. Separate multiple sheet names using a comma “,”, for example, sheet1,sheet2. |
| headers | A comma-separated list of headers. The order that you pass the headers determines how they display in the exported sheet(s). Separated multiple sheets using a semicolon. For example, if you are exporting two sheets that includes two headers each, the argument would be: “header1,header2;header3,header4”. |
| bold | Whether table headers should be bold. If this argument is set to “true”, table headers are bold. Default is “true”. |
| border | Whether borders should be added to table cells. If this argument is set to “true”, borders are added to table cells. Default is “true”. |
Outputs
There are no outputs for this script.