sc/qa/unit/data/xlsx/too-many-cols-rows.xlsx |binary
 sc/qa/unit/subsequent_filters_test2.cxx      |    6 ++
 sc/source/filter/oox/excelfilter.cxx         |   74 ++++-----------------------
 3 files changed, 19 insertions(+), 61 deletions(-)

New commits:
commit a3988b2d147a2442b348d58b79dbd6e71472b7af
Author:     Luboš Luňák <l.lu...@collabora.com>
AuthorDate: Wed Mar 23 11:48:09 2022 +0100
Commit:     Luboš Luňák <l.lu...@collabora.com>
CommitDate: Wed Mar 30 00:02:52 2022 +0200

    handle xlsx with too large sheets the same way as e.g. ods
    
    The generic approach sets an error code on import and then
    SfxBaseModel::handleLoadError() takes care of it. This also
    allows checking for the warning in unittests. A drawback is
    that this generic approach can handle only one error code,
    so if a sheets has too many rows and column, there will be
    only one warning, but I consider that to be minor.
    
    Change-Id: I1d5f7f9162ef63c3c2e8414823d18a1ff50ad71e
    Reviewed-on: https://gerrit.libreoffice.org/c/core/+/131970
    Tested-by: Jenkins
    Reviewed-by: Luboš Luňák <l.lu...@collabora.com>

diff --git a/sc/qa/unit/data/xlsx/too-many-cols-rows.xlsx 
b/sc/qa/unit/data/xlsx/too-many-cols-rows.xlsx
new file mode 100644
index 000000000000..45ef9a11f5e8
Binary files /dev/null and b/sc/qa/unit/data/xlsx/too-many-cols-rows.xlsx differ
diff --git a/sc/qa/unit/subsequent_filters_test2.cxx 
b/sc/qa/unit/subsequent_filters_test2.cxx
index d54267d99e56..a5173eda727b 100644
--- a/sc/qa/unit/subsequent_filters_test2.cxx
+++ b/sc/qa/unit/subsequent_filters_test2.cxx
@@ -3086,6 +3086,12 @@ void ScFiltersTest2::testTooManyColsRows()
     CPPUNIT_ASSERT(xDocSh->GetErrorCode() == SCWARN_IMPORT_ROW_OVERFLOW
                    || xDocSh->GetErrorCode() == SCWARN_IMPORT_COLUMN_OVERFLOW);
     xDocSh->DoClose();
+
+    xDocSh = loadDoc(u"too-many-cols-rows.", FORMAT_XLSX);
+    CPPUNIT_ASSERT(xDocSh.is());
+    CPPUNIT_ASSERT(xDocSh->GetErrorCode() == SCWARN_IMPORT_ROW_OVERFLOW
+                   || xDocSh->GetErrorCode() == SCWARN_IMPORT_COLUMN_OVERFLOW);
+    xDocSh->DoClose();
 }
 
 CPPUNIT_TEST_SUITE_REGISTRATION(ScFiltersTest2);
diff --git a/sc/source/filter/oox/excelfilter.cxx 
b/sc/source/filter/oox/excelfilter.cxx
index e5815200e063..e73e0204c50f 100644
--- a/sc/source/filter/oox/excelfilter.cxx
+++ b/sc/source/filter/oox/excelfilter.cxx
@@ -33,11 +33,6 @@
 #include <document.hxx>
 #include <docsh.hxx>
 #include <scerrors.hxx>
-#include <vcl/svapp.hxx>
-#include <vcl/weld.hxx>
-#include <svtools/sfxecode.hxx>
-#include <svtools/ehdl.hxx>
-#include <tools/urlobj.hxx>
 #include <tools/diagnose_ex.h>
 
 namespace oox::xls {
@@ -108,66 +103,23 @@ bool ExcelFilter::importDocument()
         WorkbookGlobalsRef xBookGlob(WorkbookHelper::constructGlobals(*this));
         if (xBookGlob)
         {
-            rtl::Reference<FragmentHandler> xWorkbookFragment( new 
WorkbookFragment(*xBookGlob, aWorkbookPath));
+            rtl::Reference<WorkbookFragment> xWorkbookFragment( new 
WorkbookFragment(*xBookGlob, aWorkbookPath));
 
-            const WorkbookFragment* pWF = static_cast<const 
WorkbookFragment*>(xWorkbookFragment.get());
-            const ScDocument& rDoc = pWF->getScDocument();
-            if (ScDocShell* pDocSh = 
static_cast<ScDocShell*>(rDoc.GetDocumentShell()))
-                pDocSh->SetInitialLinkUpdate( pDocSh->GetMedium());
+            ScDocument& rDoc = xWorkbookFragment->getScDocument();
+            ScDocShell* pDocSh = 
static_cast<ScDocShell*>(rDoc.GetDocumentShell());
+            assert( pDocSh );
+            pDocSh->SetInitialLinkUpdate( pDocSh->GetMedium());
 
             bool bRet = importFragment( xWorkbookFragment);
-            if (bRet)
+            if (bRet && !pDocSh->GetErrorCode())
             {
-                const AddressConverter& rAC = pWF->getAddressConverter();
-                if (rAC.isTabOverflow() || rAC.isColOverflow() || 
rAC.isRowOverflow())
-                {
-                    if (rDoc.IsUserInteractionEnabled())
-                    {
-                        // Show data loss warning.
-
-                        INetURLObject aURL( getFileUrl());
-                        SfxErrorContext aContext( ERRCTX_SFX_OPENDOC,
-                                aURL.getName( INetURLObject::LAST_SEGMENT, 
true,
-                                    
INetURLObject::DecodeMechanism::WithCharset),
-                                nullptr, RID_ERRCTX);
-
-                        OUString aWarning;
-                        aContext.GetString( ERRCODE_NONE.MakeWarning(), 
aWarning);
-                        aWarning += ":\n";
-
-                        OUString aMsg;
-                        if (rAC.isTabOverflow())
-                        {
-                            if (ErrorHandler::GetErrorString( 
SCWARN_IMPORT_SHEET_OVERFLOW, aMsg))
-                                aWarning += aMsg;
-                        }
-                        if (rAC.isColOverflow())
-                        {
-                            if (!aMsg.isEmpty())
-                                aWarning += "\n";
-                            if (ErrorHandler::GetErrorString( 
SCWARN_IMPORT_COLUMN_OVERFLOW, aMsg))
-                                aWarning += aMsg;
-                        }
-                        if (rAC.isRowOverflow())
-                        {
-                            if (!aMsg.isEmpty())
-                                aWarning += "\n";
-                            if (ErrorHandler::GetErrorString( 
SCWARN_IMPORT_ROW_OVERFLOW, aMsg))
-                                aWarning += aMsg;
-                        }
-
-                        /* XXX displaying a dialog here is ugly and should
-                         * rather happen at UI level instead of at the filter
-                         * level, but it seems there's no way to transport
-                         * detailed information other than returning true or
-                         * false at this point? */
-
-                        std::unique_ptr<weld::MessageDialog> 
xWarn(Application::CreateMessageDialog(ScDocShell::GetActiveDialogParent(),
-                                                                   
VclMessageType::Warning, VclButtonsType::Ok,
-                                                                   aWarning));
-                        xWarn->run();
-                    }
-                }
+                const AddressConverter& rAC = 
xWorkbookFragment->getAddressConverter();
+                if (rAC.isTabOverflow())
+                    pDocSh->SetError(SCWARN_IMPORT_SHEET_OVERFLOW);
+                else if (rAC.isColOverflow())
+                    pDocSh->SetError(SCWARN_IMPORT_COLUMN_OVERFLOW);
+                else if (rAC.isRowOverflow())
+                    pDocSh->SetError(SCWARN_IMPORT_ROW_OVERFLOW);
             }
             return bRet;
         }

Reply via email to