Example #1
0
        //*************************************************************************
        //  Method: ImportGraph()
        //
        /// <summary>
        /// Imports edges and vertices from a graph to the edge and vertex
        /// worksheets.
        /// </summary>
        ///
        /// <param name="sourceGraph">
        /// Graph to import the edges and vertices from.
        /// </param>
        ///
        /// <param name="edgeAttributes">
        /// Array of edge attribute names that have been added to the metadata of
        /// the graph's vertices.  Can be null.
        /// </param>
        ///
        /// <param name="vertexAttributes">
        /// Array of vertex attribute names that have been added to the metadata of
        /// the graph's vertices.  Can be null.
        /// </param>
        ///
        /// <param name="clearTablesFirst">
        /// true if the NodeXL tables in <paramref
        /// name="destinationNodeXLWorkbook" /> should be cleared first.
        /// </param>
        ///
        /// <param name="destinationNodeXLWorkbook">
        /// NodeXL workbook the edges and vertices will be imported to.
        /// </param>
        ///
        /// <remarks>
        /// This method creates a row in the edge worksheet for each edge in
        /// <paramref name="sourceGraph" />, and a row in the vertex worksheet for
        /// each edge.
        ///
        /// <para>
        /// For each attribute name in <paramref name="edgeAttributes" /> (if
        /// <paramref name="edgeAttributes" /> is not null), a column is added to
        /// the edge worksheet if the column doesn't already exist, and the
        /// corresponding attribute values stored on the edges are use to fill the
        /// column.  The same is done for <paramref name="vertexAttributes" /> and
        /// the vertex worksheet.
        /// </para>
        ///
        /// </remarks>
        //*************************************************************************
        public void ImportGraph(
            IGraph sourceGraph,
            String [] edgeAttributes,
            String [] vertexAttributes,
            Boolean clearTablesFirst,
            Microsoft.Office.Interop.Excel.Workbook destinationNodeXLWorkbook
            )
        {
            Debug.Assert(sourceGraph != null);
            Debug.Assert(destinationNodeXLWorkbook != null);
            AssertValid();

            if (clearTablesFirst)
            {
            NodeXLWorkbookUtil.ClearAllNodeXLTables(destinationNodeXLWorkbook);
            }

            // Get the required table that contains edge data.  GetEdgeTable()
            // throws an exception if the table is missing.

            EdgeWorksheetReader oEdgeWorksheetReader = new EdgeWorksheetReader();

            ListObject oEdgeTable =
            oEdgeWorksheetReader.GetEdgeTable(destinationNodeXLWorkbook);

            // Get the required columns.

            Range oVertex1NameColumnData = null;
            Range oVertex2NameColumnData = null;

            if (
            !ExcelUtil.TryGetTableColumnData(oEdgeTable,
                EdgeTableColumnNames.Vertex1Name, out oVertex1NameColumnData)
            ||
            !ExcelUtil.TryGetTableColumnData(oEdgeTable,
                EdgeTableColumnNames.Vertex2Name, out oVertex2NameColumnData)
            )
            {
            ErrorUtil.OnMissingColumn();
            }

            // Import the edges and their attributes into the workbook.

            ImportEdges(sourceGraph, edgeAttributes, oEdgeTable,
            oVertex1NameColumnData, oVertex2NameColumnData, !clearTablesFirst);

            // Populate the vertex worksheet with the name of each unique vertex in
            // the edge worksheet.

            ( new VertexWorksheetPopulator() ).PopulateVertexWorksheet(
            destinationNodeXLWorkbook, false);

            // Get the table that contains vertex data.

            ListObject oVertexTable;
            Range oVertexNameColumnData = null;
            Range oVisibilityColumnData = null;

            if (
            !ExcelUtil.TryGetTable(destinationNodeXLWorkbook,
                WorksheetNames.Vertices, TableNames.Vertices, out oVertexTable)
            ||
            !ExcelUtil.TryGetTableColumnData(oVertexTable,
                VertexTableColumnNames.VertexName, out oVertexNameColumnData)
            ||
            !ExcelUtil.TryGetTableColumnData(oVertexTable,
                CommonTableColumnNames.Visibility, out oVisibilityColumnData)
            )
            {
            ErrorUtil.OnMissingColumn();
            }

            // Import isolated vertices and the attributes for all the graph's
            // vertices.

            ImportVertices(sourceGraph, vertexAttributes, oVertexTable,
            oVertexNameColumnData, oVisibilityColumnData);
        }
        //*************************************************************************
        //  Method: GetRequiredTables()
        //
        /// <summary>
        /// Gets the tables required for populating the vertex worksheet.
        /// </summary>
        ///
        /// <param name="oWorkbook">
        /// Workbook containing the graph data.
        /// </param>
        ///
        /// <param name="oEdgeTable">
        /// Where the edge table gets stored.
        /// </param>
        ///
        /// <param name="oVertexTable">
        /// Where the vertex table gets stored.
        /// </param>
        ///
        /// <remarks>
        /// This method checks for tables and table columns that are required for
        /// vertex worksheet population.
        ///
        /// <para>
        /// If there is a problem with the workbook, a <see
        /// cref="WorkbookFormatException" /> is thrown.
        /// </para>
        ///
        /// </remarks>
        //*************************************************************************
        protected void GetRequiredTables(
            Microsoft.Office.Interop.Excel.Workbook oWorkbook,
            out ListObject oEdgeTable,
            out ListObject oVertexTable
            )
        {
            Debug.Assert(oWorkbook != null);
            AssertValid();

            // Get the required table that contains edge data.  GetEdgeTable()
            // checks for the required vertex name columns.

            EdgeWorksheetReader oEdgeWorksheetReader = new EdgeWorksheetReader();

            oEdgeTable = oEdgeWorksheetReader.GetEdgeTable(oWorkbook);

            // Normally, the vertex table isn't required, but to avoid having to
            // create the table in code if it's missing, require it here.

            if ( ExcelUtil.TryGetTable(oWorkbook, WorksheetNames.Vertices,
            TableNames.Vertices, out oVertexTable) )
            {
            // Make sure the vertex name column exists.

            ListColumn oColumn;

            if ( !ExcelUtil.TryGetTableColumn(oVertexTable,
                VertexTableColumnNames.VertexName, out oColumn) )
            {
                oVertexTable = null;
            }
            }
            else
            {
            oVertexTable = null;
            }

            if (oVertexTable == null)
            {
            throw new WorkbookFormatException(String.Format(

                "To use this feature, there must be a worksheet named \"{0}\""
                + " that contains a table named \"{1}\", and that table must"
                + " contain a column named \"{2}\"."
                + "\r\n\r\n"
                + "{3}"
                ,
                WorksheetNames.Vertices,
                TableNames.Vertices,
                VertexTableColumnNames.VertexName,
                ErrorUtil.GetTemplateMessage()
                ) );
            }
        }
Example #3
0
        //*************************************************************************
        //  Method: ReadWorkbookInternal()
        //
        /// <summary>
        /// Creates a NodeXL graph from the contents of an Excel workbook.
        /// </summary>
        ///
        /// <param name="workbook">
        /// Workbook containing the graph data.
        /// </param>
        ///
        /// <param name="readWorkbookContext">
        /// Provides access to objects needed for converting an Excel workbook to a
        /// NodeXL graph.
        /// </param>
        ///
        /// <returns>
        /// A new graph.
        /// </returns>
        ///
        /// <remarks>
        /// If <paramref name="workbook" /> contains valid graph data, a new <see
        /// cref="IGraph" /> is created from the workbook contents and returned.
        /// Otherwise, a <see cref="WorkbookFormatException" /> is thrown.
        /// </remarks>
        //*************************************************************************
        protected IGraph ReadWorkbookInternal(
            Microsoft.Office.Interop.Excel.Workbook workbook,
            ReadWorkbookContext readWorkbookContext
            )
        {
            Debug.Assert(readWorkbookContext != null);
            Debug.Assert(workbook != null);
            AssertValid();

            if (readWorkbookContext.PopulateVertexWorksheet)
            {
            // Create and use the object that fills in the vertex worksheet.

            VertexWorksheetPopulator oVertexWorksheetPopulator =
                new VertexWorksheetPopulator();

            try
            {
                oVertexWorksheetPopulator.PopulateVertexWorksheet(
                    workbook, false);
            }
            catch (WorkbookFormatException)
            {
                // Ignore this type of error, which occurs when the vertex
                // worksheet is missing, for example.
            }
            }

            // Create a graph with the appropriate directedness.

            PerWorkbookSettings oPerWorkbookSettings =
            new PerWorkbookSettings(workbook);

            IGraph oGraph = new Graph(oPerWorkbookSettings.GraphDirectedness);

            // Read the edge worksheet.  This adds data to oGraph,
            // ReadWorkbookContext.VertexNameDictionary, and
            // ReadWorkbookContext.EdgeIDDictionary.

            EdgeWorksheetReader oEdgeWorksheetReader = new EdgeWorksheetReader();

            oEdgeWorksheetReader.ReadWorksheet(workbook, readWorkbookContext,
            oGraph);

            oEdgeWorksheetReader = null;

            // Read the vertex worksheet.  This adds metadata to the vertices in
            // oGraph; adds any isolated vertices to oGraph and
            // ReadWorkbookContext.VertexNameDictionary; and removes any skipped
            // vertices (and their incident edges) from
            // ReadWorkbookContext.VertexNameDictionary,
            // ReadWorkbookContext.EdgeIDDictionary, and oGraph.

            VertexWorksheetReader oVertexWorksheetReader =
            new VertexWorksheetReader();

            oVertexWorksheetReader.ReadWorksheet(workbook, readWorkbookContext,
            oGraph);

            oVertexWorksheetReader = null;

            if (readWorkbookContext.ReadAllEdgeAndVertexColumns)
            {
            // The other worksheets should be ignored.

            return (oGraph);
            }

            if (readWorkbookContext.ReadGroups)
            {
            // Read the group worksheets.  This adds metadata to the vertices
            // in oGraph and to oGraph itself.

            GroupWorksheetReader oGroupWorksheetReader =
                new GroupWorksheetReader();

            oGroupWorksheetReader.ReadWorksheet(workbook,
                readWorkbookContext, oGraph);

            oGroupWorksheetReader = null;
            }

            // Read the per-workbook settings that are stored directly on the
            // graph.

            oPerWorkbookSettings.ReadWorksheet(workbook, readWorkbookContext,
            oGraph);

            return (oGraph);
        }
        //*************************************************************************
        //  Method: OnLoad()
        //
        /// <summary>
        /// Handles the Load event.
        /// </summary>
        ///
        /// <param name="e">
        /// Standard event argument.
        /// </param>
        //*************************************************************************
        protected override void OnLoad(
            EventArgs e
            )
        {
            AssertValid();

            base.OnLoad(e);

            // Get the required edge table before the user does anything in the
            // dialog.

            EdgeWorksheetReader oEdgeWorksheetReader = new EdgeWorksheetReader();

            try
            {
            m_oEdgeTable = oEdgeWorksheetReader.GetEdgeTable(m_oWorkbook);
            }
            catch (Exception oException)
            {
            // The edge table couldn't be found.  Tell the user and close the
            // dialog.

            ErrorUtil.OnException(oException);

            this.Close();

            return;
            }
        }
        //*************************************************************************
        //  Method: GetDestinationEdgeTable()
        //
        /// <summary>
        /// Gets the edge table in the destination NodeXL workbook.
        /// </summary>
        ///
        /// <param name="oDestinationNodeXLWorkbook">
        /// NodeXL Workbook containing the edge table.
        /// </param>
        ///
        /// <returns>
        /// The edge table.
        /// </returns>
        //*************************************************************************
        protected ListObject GetDestinationEdgeTable(
            Microsoft.Office.Interop.Excel.Workbook oDestinationNodeXLWorkbook
            )
        {
            Debug.Assert(oDestinationNodeXLWorkbook != null);

            EdgeWorksheetReader oEdgeWorksheetReader = new EdgeWorksheetReader();

            return ( oEdgeWorksheetReader.GetEdgeTable(
            oDestinationNodeXLWorkbook) );
        }