override protected void HandleStartElement(XmlNodeInformation nodeInfo) { if (NameTableUtils.Equals(nodeInfo.NodeName, m_sheet) && HandleSheetStart(nodeInfo)) return; if (NameTableUtils.Equals(nodeInfo.NodeName, m_externalRef)) { if (IsCleaning && m_interestedInExternalLinks) { m_inExternalLinks = true; return; } else { m_inExternalLinks = false; } } else if (NameTableUtils.Equals(nodeInfo.NodeName, m_definedName)) { if (IsCleaning && (m_interestedInExternalLinks || m_interestedInHiddenData)) { SetFlagsForCleaning(nodeInfo); } else { m_inHiddenData = false; m_inExternalLinks = false; } } else if (nodeInfo.NodeName == "workbookView" && IsCleaning && ShouldWriteStartNode(nodeInfo)) { string currentValue = nodeInfo.GetAttributeValue("activeTab"); if (!string.IsNullOrEmpty(currentValue) && GetPositionOfSheetsToBeDeleted().Count != 0) {//if we remove any sheets because they are hidden this value can corrupt the document //so we default reset it to the first sheet - seems to be the simplest solution nodeInfo.ResetAttributeValue("", "activeTab", "", "0"); } ResetFirstSheet(nodeInfo); } if (m_inHiddenSheet || m_inExternalLinks || m_inHiddenData) return; base.HandleStartElement(nodeInfo); }
public void SetRowHiddenState(XmlNodeInformation nodeInfo, MinMaxFilterRowRefs filterRefs) { string state = nodeInfo.GetAttributeValue("hidden"); if (state == "1") { string rowRef = nodeInfo.GetAttributeValue("r"); int row = Int32.Parse(rowRef); if (row >= filterRefs.m_minRow) { if (row <= filterRefs.m_maxRow) { //this row is a filter row, so we ignore any hidden state and reset the row to unhidden m_inHiddenRow = false; nodeInfo.ResetAttributeValue("", "hidden", "", "0"); return; } } } SetRowHiddenState(state); }
//this method is satsifactory for the moment - if we ever have a workbook where we are //going to delete all the sheet content we will need some additional handling //in several places including this private void ResetFirstSheet(XmlNodeInformation nodeInfo) { string currentFirstSheet = nodeInfo.GetAttributeValue("firstSheet"); if (string.IsNullOrEmpty(currentFirstSheet))//this attribute isn't always set return; List<int> deletingSheetPositions = GetPositionOfSheetsToBeDeleted(); if (deletingSheetPositions.Count > 0) { bool resetFirstSheet = false; int current = Int32.Parse(currentFirstSheet); while (deletingSheetPositions.Contains(current)) { current++; resetFirstSheet = true; } if (resetFirstSheet) nodeInfo.ResetAttributeValue("", "firstSheet", "", current.ToString()); } }