public override string Parse(Stream stream, string fileName, ExecuteArgs param) { // bool flag = false; stream.Position = 0; using (var xl = SpreadsheetDocument.Open(stream, true)) { //IEnumerable<DocumentFormat.OpenXml.Packaging.SharedStringTablePart> sp = xl.WorkbookPart.GetPartsOfType<DocumentFormat.OpenXml.Packaging.SharedStringTablePart>(); foreach (WorksheetPart part in xl.WorkbookPart.WorksheetParts) { var sharedStrings = ReadStringTable(xl.WorkbookPart.SharedStringTablePart); Excel.Worksheet worksheet = part.Worksheet; Excel.SheetData sd = worksheet.GetFirstChild <Excel.SheetData>(); var results = FindParsedCells(sharedStrings, sd); foreach (Excel.Cell cell in results) { string val = ReadCell(cell, sharedStrings); Regex re = new Regex("#.[^#]*#", RegexOptions.IgnoreCase); MatchCollection mc = re.Matches(val); foreach (Match m in mc) { object res = ParseString(param, m.Value.Trim("#<>".ToCharArray())); if (res != null) { //flag = true; Excel.Row newRow = null; if (res is QResult query) { var sref = CellReference.Parse(cell.CellReference.Value); int count = 0; foreach (object[] dataRow in query.Values) { count++; int col = sref.Col; newRow = GetRow(sd, sref.Row, newRow == null, cell.Parent as Excel.Row); foreach (object kvp in dataRow) { Excel.Cell ncell = GetCell(newRow, kvp, col, sref.Row, 0, sharedStrings); if (ncell.Parent == null) { newRow.Append(ncell); } col++; } sref.Row++; } if (newRow != null) { uint rcount = newRow.RowIndex.Value; foreach (var item in newRow.ElementsAfter()) { if (item is Excel.Row) { rcount++; ((Excel.Row)item).RowIndex = rcount; foreach (var itemCell in item.ChildElements) { if (itemCell is Excel.Cell) { var reference = CellReference.Parse(((Excel.Cell)itemCell).CellReference); reference.Row = (int)rcount; ((Excel.Cell)itemCell).CellReference = reference.ToString(); } } } } } } else { val = val.Replace(m.Value, res.ToString()); WriteCell(cell, val, sharedStrings); } } } } WriteStringTable(xl.WorkbookPart.SharedStringTablePart, sharedStrings); } } stream.Flush(); return(stream is FileStream fileStream ? fileStream.Name : null); }