private static Dictionary <string, Dictionary <string, DefinedName> > GetCacheNames(ExecuteArgs param) { var cacheNames = new Dictionary <string, Dictionary <string, DefinedName> >(StringComparer.OrdinalIgnoreCase); foreach (var item in param.Codes.Where(p => p.Attribute.Category == "General" || p.Attribute.Category == param.ProcedureCategory)) { var split = item.Attribute.Code.Split('!'); if (split.Length == 2) { var sheet = split[0].Trim('\''); if (!cacheNames.TryGetValue(sheet, out var names)) { cacheNames[sheet] = names = new Dictionary <string, DefinedName>(); } var defName = new DefinedName { Name = item.Attribute.Code, Sheet = sheet, Reference = split[1], Code = item }; names[defName.Range.Start.ToString()] = defName; } } return(cacheNames); }
private void ParseTableDefinition(ExecuteArgs param, Dictionary <string, DefinedName> cacheNames, Stream tableDefinitionPart, TableDefinitionPart newTableDefinitionPart) { using (var reader = OpenXmlReader.Create(tableDefinitionPart)) using (var writer = XmlWriter.Create(newTableDefinitionPart.GetStream(), new XmlWriterSettings { Encoding = Encoding.UTF8, CloseOutput = true })) { writer.WriteStartDocument(true); while (reader.Read()) { if (reader.ElementType == typeof(Excel.Table)) { var table = (Excel.Table)reader.LoadCurrentElement(); var code = param.ParseCode(table.Name); if (code != null) { var reference = CellRange.Parse(table.Reference.Value); var defName = new DefinedName { Name = table.Name, Range = reference, Code = code, CacheValue = param.GetValue(code) }; if (defName.CacheValue is QResult result && result.Values.Count > 0) { var index = reference.Start.Row + result.Values.Count; if (index > reference.End.Row) { defName.NewRange = new CellRange(reference.Start, new CellReference(reference.End.Col, index)); table.Reference = defName.NewRange.ToString(); //table.TotalsRowCount = (uint)newrange.Rows; } defName.Table = table; cacheNames[defName.Range.Start.ToString()] = defName; } } WriteElement(writer, table); } else if (reader.IsStartElement) { WriteStartElement(writer, reader); } else if (reader.IsEndElement) { writer.WriteEndElement(); } } writer.WriteEndDocument(); writer.Flush(); } }
private void ParseWorkbookPart(ExecuteArgs param, Dictionary <string, Dictionary <string, DefinedName> > cacheNames, Stream workbookPart, WorkbookPart newWorkbookPart, List <Excel.Sheet> sheetList) { using (var reader = OpenXmlReader.Create(workbookPart)) using (var writer = XmlWriter.Create(newWorkbookPart.GetStream(), new XmlWriterSettings { Encoding = Encoding.UTF8, CloseOutput = true })) { writer.WriteStartDocument(true); while (reader.Read()) { //if (reader.ElementType == typeof(AlternateContent)) //{ // var alternate = (AlternateContent)reader.LoadCurrentElement(); // continue; //} if (reader.ElementType == typeof(Excel.DefinedName)) { var name = (Excel.DefinedName)reader.LoadCurrentElement(); if (!string.IsNullOrEmpty(name.InnerText)) { var split = name.InnerText.Split('!'); if (split.Length == 2) { var sheet = split[0].Trim('\''); var code = param.ParseCode(name.Name); if (code != null) { if (!cacheNames.TryGetValue(sheet, out var names)) { cacheNames[sheet] = names = new Dictionary <string, DefinedName>(); } var defName = new DefinedName { Name = name.Name, Sheet = sheet, Reference = split[1], Code = code }; names.Add(defName.Range.Start.ToString(), defName); } } } WriteElement(writer, name); } else if (reader.ElementType == typeof(Excel.Sheet)) { var sheet = (Excel.Sheet)reader.LoadCurrentElement(); sheetList.Add(sheet); WriteElement(writer, sheet); } else if (reader.IsStartElement) { WriteStartElement(writer, reader); } else if (reader.IsEndElement) { writer.WriteEndElement(); } } writer.WriteEndDocument(); writer.Flush(); } }