From 80854ab2ccbd4b81a166a1d6800de391d92ae2f0 Mon Sep 17 00:00:00 2001 From: Chris Hill-Scott Date: Thu, 12 May 2022 15:48:09 +0100 Subject: [PATCH] Force xlsm files to open with pyexcel-xlsx `.xlsm` files are like `.xlxs` files but with macros enabled. They store data in the same XML-based format as `.xlsx` files. Pyexcel will try to use the xlrd package to parse `.xlsm` files. This used to work because xlrd used to support reading `.xlsx` files. xlrd has dropped support for `.xlsx` files in version 2 because of security concerns. This means that when pyexcel asks xlrd to parse a `.xlsm` file it causes an error. This commit adds some branching to force `.xlsm` files to be opened with pyexcel-xlsx instead, which does support `.xlsx` files. --- app/models/spreadsheet.py | 10 ++++++++++ tests/app/main/views/test_send.py | 4 ++-- .../excel 2007 with macro support.xlsm | Bin 3 files changed, 12 insertions(+), 2 deletions(-) rename tests/{non_spreadsheet_files => spreadsheet_files}/excel 2007 with macro support.xlsm (100%) diff --git a/app/models/spreadsheet.py b/app/models/spreadsheet.py index 7b66a7b0f..59ca2bdd7 100644 --- a/app/models/spreadsheet.py +++ b/app/models/spreadsheet.py @@ -3,6 +3,7 @@ from io import StringIO from os import path import pyexcel +import pyexcel_xlsx class Spreadsheet(): @@ -72,6 +73,15 @@ class Spreadsheet(): file_content = StringIO( Spreadsheet.normalise_newlines(file_content)) + if extension == 'xlsm': + file_data = pyexcel_xlsx.get_data(file_content) + instance = cls.from_rows( + # Get the first sheet from the workbook + list(file_data.values())[0], + filename, + ) + return instance + instance = cls.from_rows( pyexcel.iget_array( file_type=extension, diff --git a/tests/app/main/views/test_send.py b/tests/app/main/views/test_send.py index 7d192f2a0..3dda1a696 100644 --- a/tests/app/main/views/test_send.py +++ b/tests/app/main/views/test_send.py @@ -300,8 +300,8 @@ def test_set_sender_redirects_if_one_sms_sender( def test_that_test_files_exist(): - assert len(test_spreadsheet_files) == 7 - assert len(test_non_spreadsheet_files) == 7 + assert len(test_spreadsheet_files) == 8 + assert len(test_non_spreadsheet_files) == 6 def test_should_not_allow_files_to_be_uploaded_without_the_correct_permission( diff --git a/tests/non_spreadsheet_files/excel 2007 with macro support.xlsm b/tests/spreadsheet_files/excel 2007 with macro support.xlsm similarity index 100% rename from tests/non_spreadsheet_files/excel 2007 with macro support.xlsm rename to tests/spreadsheet_files/excel 2007 with macro support.xlsm