I diagrammi organizzativi sono essenziali per visualizzare la struttura di team, dipartimenti e relazioni di reporting all’interno di un’azienda. Aiutano la direzione e i dipendenti a comprendere la gerarchia e le relazioni tra i ruoli in un’organizzazione. Automatizzare la creazione di questi diagrammi in C# consente agli sviluppatori di generare dinamicamente visualizzazioni da database HR, team di progetto o directory aziendali senza lo sforzo di progettazione manuale in Visio o altri strumenti di diagrammazione.

Questo tutorial spiega come creare un organigramma in C# programmaticamente utilizzando una libreria di diagrammi. Imparerai ad aggiungere nodi gerarchici, collegare le forme usando connettori e a disporre automaticamente il diagramma usando l’algoritmo CompactTree per un aspetto pulito e professionale.

Perché creare un organigramma programmaticamente?

  • Automatizzare i flussi di lavoro HR per generare e aggiornare i diagrammi quando si verificano modifiche al personale o alla struttura.
  • Creare diagrammi gerarchici chiari e standardizzati senza doverli disegnare manualmente in Visio.
  • Risparmiare tempo integrando la generazione dei diagrammi nei sistemi esistenti, come la gestione dei dipendenti o i cruscotti di reporting.
  • Garantire un design coerente applicando programmaticamente stili di forma, connettori e regole di layout.
  • Esportare i diagrammi direttamente nel formato Visio (VSDX) per condividerli e modificarli ulteriormente, se necessario.

Crea organigramma in C#

  1. Aggiungi la libreria di diagrammazione al tuo progetto C# per accedere alle API di creazione e layout di Visio.
  2. Inizializza un nuovo oggetto Diagram e carica forme di base e connettori da un file stencil Visio.
  3. Definisci una struttura gerarchica o un set di dati che rappresenti le relazioni organizzative.
  4. Aggiungi forme dinamicamente per ogni nodo nella gerarchia e memorizza i loro ID per la mappatura delle connessioni.
  5. Usa i connettori per collegare le forme figlie ai loro nodi genitori, formando l’albero gerarchico.
  6. Applica un algoritmo di layout automatico (come CompactTree) per organizzare ordinatamente i nodi.
  7. Salva il diagramma risultante nel formato Visio VSDX.
// Load masters from any existing diagram, stencil or template
string visioStencil = dataDir + "BasicShapes.vss";
const string rectangleMaster = "Rectangle";
const string connectorMaster = "Dynamic connector";
const int pageNumber = 0;
const double width = 1;
const double height = 1;
double pinX = 4.25;
double pinY = 9.5;

// Define values to construct the hierarchy
List<string> listPos = new List<string>(new string[] { 
    "0", "0:0", "0:1", "0:2", "0:3", "0:4", "0:5", "0:6", 
    "0:0:0", "0:0:1", "0:3:0", "0:3:1", "0:3:2", "0:6:0", "0:6:1" 
});

// Define a Hashtable to map the string name to long shape id
System.Collections.Hashtable shapeIdMap = new System.Collections.Hashtable();

// Create a new diagram
Aspose.Diagram.Diagram diagram = new Aspose.Diagram.Diagram(visioStencil);
diagram.Pages[pageNumber].PageSheet.PageProps.PageWidth.Value = 11;

// Add shapes for each hierarchy node
foreach (string orgnode in listPos)
{
    long rectangleId = diagram.AddShape(pinX++, pinY++, width, height, rectangleMaster, pageNumber);
    Aspose.Diagram.Shape shape = diagram.Pages[pageNumber].Shapes.GetShape(rectangleId);
    shape.Text.Value.Add(new Aspose.Diagram.Txt(orgnode));
    shape.Name = orgnode;
    shapeIdMap.Add(orgnode, rectangleId);
}

// Create connections between parent and child nodes
foreach (string orgName in listPos)
{
    int lastColon = orgName.LastIndexOf(':');
    if (lastColon > 0)
    {
        string parendName = orgName.Substring(0, lastColon);
        long shapeId = (long)shapeIdMap[orgName];
        long parentId = (long)shapeIdMap[parendName];
        Aspose.Diagram.Shape connector1 = new Aspose.Diagram.Shape();
        long connecter1Id = diagram.AddShape(connector1, connectorMaster, pageNumber);
        diagram.Pages[pageNumber].ConnectShapesViaConnector(parentId,
            Aspose.Diagram.Manipulation.ConnectionPointPlace.Right,
            shapeId, Aspose.Diagram.Manipulation.ConnectionPointPlace.Left,
            connecter1Id);
    }
}

// Auto layout CompactTree chart
Aspose.Diagram.AutoLayout.LayoutOptions compactTreeOptions = new Aspose.Diagram.AutoLayout.LayoutOptions
{
    LayoutStyle = Aspose.Diagram.AutoLayout.LayoutStyle.CompactTree,
    Direction = Aspose.Diagram.AutoLayout.LayoutDirection.DownThenRight,
    EnlargePage = false
};

diagram.Pages[pageNumber].Layout(compactTreeOptions);

// Save diagram
diagram.Save(dataDir + "ORGChart_out.vsdx", Aspose.Diagram.SaveFileFormat.Vsdx);

Questo esempio di codice crea una gerarchia organizzativa, collega i nodi padre e figlio utilizzando connettori dinamici e applica un layout automatico CompactTree per una struttura pulita. Ogni forma rappresenta un nodo organizzativo etichettato in base all’elenco della gerarchia e il risultato finale viene salvato come file Visio VSDX.

Conclusione

Creare organigrammi in C# offre un modo dinamico per visualizzare le strutture dei team, le gerarchie di reporting e le relazioni dipartimentali senza dover disegnare manualmente in Visio. Con layout automatico e gestione delle connessioni, è possibile generare diagrammi puliti e leggibili direttamente dalle fonti di dati. L’approccio mostrato sopra semplifica la reportistica HR, migliora la coerenza e consente l’integrazione con i flussi di lavoro di automazione aziendale.

Vedi anche