From cf95d2d0031fdc5356afced0787d919295eeb159 Mon Sep 17 00:00:00 2001 From: Willem-Jan Meerkerk Date: Wed, 8 Jul 2020 12:42:47 +0200 Subject: [PATCH] Improve regex for detecting external file names --- src/XLParser.Tests/FormulaAnalysisTest.cs | 62 +++++++++++++++++++++++ src/XLParser.Tests/ParserTests.cs | 24 +++++++++ src/XLParser/ExcelFormulaGrammar.cs | 2 +- 3 files changed, 87 insertions(+), 1 deletion(-) diff --git a/src/XLParser.Tests/FormulaAnalysisTest.cs b/src/XLParser.Tests/FormulaAnalysisTest.cs index 118f597..ef71ed2 100644 --- a/src/XLParser.Tests/FormulaAnalysisTest.cs +++ b/src/XLParser.Tests/FormulaAnalysisTest.cs @@ -352,6 +352,68 @@ public void ExternalWorkbookDefinedNameGlobalScope() Assert.AreEqual("Items", result.First().Name); } + [TestMethod] + public void MultipleExternalWorkbookSingleCell() + { + List result = new FormulaAnalyzer(@"=SUM('C:\Users\Willem-Jan\Desktop\[Data.xlsx]Sheet1'!$A$1,'C:\Users\Willem-Jan\Desktop\[Data.xlsx]Sheet1'!$A$2)").ParserReferences().ToList(); + Assert.AreEqual(2, result.Count); + + Assert.AreEqual(ReferenceType.Cell, result[0].ReferenceType); + Assert.AreEqual("Data.xlsx", result[0].FileName); + Assert.AreEqual("Sheet1", result[0].Worksheet); + + Assert.AreEqual(ReferenceType.Cell, result[1].ReferenceType); + Assert.AreEqual("Data.xlsx", result[1].FileName); + Assert.AreEqual("Sheet1", result[1].Worksheet); + } + + [TestMethod] + public void MultipleExternalWorkbookCellRange() + { + List result = new FormulaAnalyzer(@"=SUM('C:\Users\Willem-Jan\Desktop\[Data.xlsx]Sheet1'!$A$1:$A$10,'C:\Users\Willem-Jan\Desktop\[Data.xlsx]Sheet1'!$A$11:$A$20)").ParserReferences().ToList(); + Assert.AreEqual(2, result.Count); + + Assert.AreEqual(ReferenceType.CellRange, result[0].ReferenceType); + Assert.AreEqual("Data.xlsx", result[0].FileName); + Assert.AreEqual("Sheet1", result[0].Worksheet); + + Assert.AreEqual(ReferenceType.CellRange, result[1].ReferenceType); + Assert.AreEqual("Data.xlsx", result[1].FileName); + Assert.AreEqual("Sheet1", result[1].Worksheet); + } + + [TestMethod] + public void MultipleExternalWorkbookDefinedNameLocalScope() + { + List result = new FormulaAnalyzer(@"=SUM('C:\Users\Willem-Jan\Desktop\[Data.xlsx]Sheet1'!FirstItem,'C:\Users\Willem-Jan\Desktop\[Data.xlsx]Sheet1'!SecondItem)").ParserReferences().ToList(); + Assert.AreEqual(2, result.Count); + + Assert.AreEqual(ReferenceType.UserDefinedName, result[0].ReferenceType); + Assert.AreEqual("Data.xlsx", result[0].FileName); + Assert.AreEqual("Sheet1", result[0].Worksheet); + Assert.AreEqual("FirstItem", result[0].Name); + + Assert.AreEqual(ReferenceType.UserDefinedName, result[1].ReferenceType); + Assert.AreEqual("Data.xlsx", result[1].FileName); + Assert.AreEqual("Sheet1", result[1].Worksheet); + Assert.AreEqual("SecondItem", result[1].Name); + } + + [TestMethod] + public void MultipleExternalWorkbookDefinedNameGlobalScope() + { + List result = new FormulaAnalyzer(@"=SUM('C:\Users\Willem-Jan\Desktop\Data.xlsx'!Items,'C:\Users\Willem-Jan\Desktop\Data.xlsx'!Items2)").ParserReferences().ToList(); + Assert.AreEqual(2, result.Count); + + Assert.AreEqual(ReferenceType.UserDefinedName, result[0].ReferenceType); + Assert.AreEqual("Data.xlsx", result[0].FileName); + Assert.AreEqual("Items", result[0].Name); + + Assert.AreEqual(ReferenceType.UserDefinedName, result[1].ReferenceType); + Assert.AreEqual("Data.xlsx", result[1].FileName); + Assert.AreEqual("Items2", result[1].Name); + } + [TestMethod] public void DirectSheetReference() { diff --git a/src/XLParser.Tests/ParserTests.cs b/src/XLParser.Tests/ParserTests.cs index bbff629..ee6913a 100644 --- a/src/XLParser.Tests/ParserTests.cs +++ b/src/XLParser.Tests/ParserTests.cs @@ -743,6 +743,30 @@ public void ExternalWorkbookDefinedNameGlobalScope() Test(@"'C:\Users\Willem-Jan\Desktop\Data.xlsx'!Items"); } + [TestMethod] + public void MultipleExternalWorkbookSingleCell() + { + Test(@"=SUM('C:\Users\Willem-Jan\Desktop\[Data.xlsx]Sheet1'!$A$1,'C:\Users\Willem-Jan\Desktop\[Data.xlsx]Sheet1'!$A$2)"); + } + + [TestMethod] + public void MultipleExternalWorkbookCellRange() + { + Test(@"=SUM('C:\Users\Willem-Jan\Desktop\[Data.xlsx]Sheet1'!$A$1:$A$10,'C:\Users\Willem-Jan\Desktop\[Data.xlsx]Sheet1'!$A$11:$A$20)"); + } + + [TestMethod] + public void MultipleExternalWorkbookDefinedNameLocalScope() + { + Test(@"=SUM('C:\Users\Willem-Jan\Desktop\[Data.xlsx]Sheet1'!FirstItem,'C:\Users\Willem-Jan\Desktop\[Data.xlsx]Sheet1'!SecondItem)"); + } + + [TestMethod] + public void MultipleExternalWorkbookDefinedNameGlobalScope() + { + Test(@"=SUM('C:\Users\Willem-Jan\Desktop\Data.xlsx'!Items,'C:\Users\Willem-Jan\Desktop\Data.xlsx'!Items2)"); + } + [TestMethod] public void TestFilePathWithSpace() { diff --git a/src/XLParser/ExcelFormulaGrammar.cs b/src/XLParser/ExcelFormulaGrammar.cs index ee8f6ea..38d66bd 100644 --- a/src/XLParser/ExcelFormulaGrammar.cs +++ b/src/XLParser/ExcelFormulaGrammar.cs @@ -179,7 +179,7 @@ public class ExcelFormulaGrammar : Grammar { Priority = TerminalPriority.FileName }; // Source: https://stackoverflow.com/a/14632579 - private const string fileNameRegex = @"[^\.].*\..{1,4}"; + private const string fileNameRegex = @"[^\.]+\..{1,4}"; public Terminal FileNameWindowsToken { get; } = new RegexBasedTerminal(GrammarNames.TokenFileNameWindows, fileNameRegex) { Priority = TerminalPriority.FileName };