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);
        }
Example #2
0
        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());
            }
        }