Неверно добавлены узлы Smartart в таблицу Excel с Interop-Excel в C # - PullRequest
0 голосов
/ 18 октября 2019

У меня есть консольное приложение ac #, которое создает лист Excel, содержащий объект smartart с высокотехнологичным макетом (оргструктура). Когда я продолжаю добавлять узлы к объекту smartart, он размещает узлы на неправильных уровнях.

Первый созданный узел называется «узел 1» и правильно размещается на первом уровне. Затем я создаю 4 новых узла (узел 1.1, узел 1.2, узел 1.3, узел 1.4) из первого узла для размещения на втором уровне с узлом 1 в качестве родительского узла. Я также создал узел третьего уровня (узел 1.1.1) с узлом 1.1 в качестве родительского узла.

Я каким-то образом получаю следующий результат: Result of current code

Где этоожидаемый результат: Intended result

Вот мой код:

private static Excel.Workbook Wb = null;
    private static Excel.Application Xl = null;
    private static Excel.Worksheet Sheet = null;

    static void Main(string[] args)
    {
        Xl = new Excel.Application();
        Xl.Visible = true;
        Wb = Xl.Workbooks.Add();
        Sheet = Wb.Worksheets[1];

        var myLayout = Xl.SmartArtLayouts[93];

        var smartArtShape = Sheet.Shapes.AddSmartArt(myLayout, 50, 50, 600, 600);

        smartArtShape.AlternativeText = "Test";

        if (smartArtShape.HasSmartArt == Office.MsoTriState.msoTrue)
        {
            Office.SmartArt smartArt = smartArtShape.SmartArt;
            Office.SmartArtNodes nds = smartArt.AllNodes;

            //Delete template nodes
            for (int i = nds.Count; i >= 1; i--)
            {
                nds[i].Delete();
            }

            //Add main node
            Office.SmartArtNode main = smartArt.Nodes.Add();
            main.TextFrame2.TextRange.Text = "Node 1";

            //Add main child node
            Office.SmartArtNode aNode = main.Nodes.Add();
            aNode.TextFrame2.TextRange.Text = "Node 1.1";
            //Add 1.1 child node
            Office.SmartArtNode a2Node = aNode.Nodes.Add();
            a2Node.TextFrame2.TextRange.Text = "Node 1.1.1";

            //Add main child node
            Office.SmartArtNode bNode = main.Nodes.Add();
            bNode.TextFrame2.TextRange.Text = "Node 1.2";

            //Add main child node
            Office.SmartArtNode cNode = main.Nodes.Add();
            cNode.TextFrame2.TextRange.Text = "Node 1.3";

            //Add main child node
            Office.SmartArtNode dNode = main.Nodes.Add();
            dNode.TextFrame2.TextRange.Text = "Node 1.4";
        }
    }

1 Ответ

1 голос
/ 19 октября 2019

В коде, о котором идет речь, отсутствует параметр в методе AddNode: Office.MsoSmartArtNodePosition, который указывает, где должен находиться новый узел относительно узла, к которому он добавляется.

В приведенном ниже примере кода используется .msoSmartArtNodeBelow через, но также можно добавлять узлы до, после или выше. (Если бы использовалась более старая версия C #, код даже не скомпилировался бы, что говорит о попытке сделать язык «более прощающим», как языки VB ...)

Пример кода демонстрируетдва подхода:

  • первый - цикл for для четырех узлов на втором уровне;один на третьем уровне вставляется индивидуально. Таким образом, этот последний относится к правильному узлу (первому), который назначается определенному SmartArtNode объекту на первой итерации.
  • второй (закомментированный) вставляет и маркирует каждый узел отдельно.

Примечание. Поскольку нет необходимости удалять первый узел, этот код оставляет его без изменений, помечает его и присваивает его объекту SmartArtNode (верхнего уровня).

    var myLayout = excelApp.SmartArtLayouts[88];

    var smartArtShape = ws.Shapes.AddSmartArt(myLayout, 50, 50, 200, 200);

    if (smartArtShape.HasSmartArt == Office.MsoTriState.msoTrue)
    {
      Office.SmartArt smartArt = smartArtShape.SmartArt;
      Office.SmartArtNodes nds = smartArt.AllNodes;
      Office.SmartArtNode ndTop = null;
      foreach (Office.SmartArtNode nd in nds)
      {
          if (nd.Level != 1)
          {
              nd.Delete();
          }
          else
          {
              ndTop = nd;
              ndTop.TextFrame2.TextRange.Text = "Node 1";
          }
      }

      Office.SmartArtNode ndLev2 = null;
      Office.SmartArtNode ndLev2_1 = null;
      for (int i = 1; i <= 4; i++)
      {
          ndLev2 = ndTop.AddNode(Office.MsoSmartArtNodePosition.msoSmartArtNodeBelow);
          if (i == 1) ndLev2_1 = ndLev2;
          ndLev2.TextFrame2.TextRange.Text = "Node 1." + i;
      }

      //Office.SmartArtNode ndLev2_1 = ndTop.AddNode(Office.MsoSmartArtNodePosition.msoSmartArtNodeBelow);
      //ndLev2_1.TextFrame2.TextRange.Text = "Node 1.1";

      //Office.SmartArtNode ndLev2_2 = ndTop.AddNode(Office.MsoSmartArtNodePosition.msoSmartArtNodeBelow);
      //ndLev2_2.TextFrame2.TextRange.Text = "Node 1.2";

      //Office.SmartArtNode ndLev2_3 = ndTop.AddNode(Office.MsoSmartArtNodePosition.msoSmartArtNodeBelow);
      //ndLev2_3.TextFrame2.TextRange.Text = "Node 1.3";

      Office.SmartArtNode ndLev2_1_1 = ndLev2_1.AddNode(Office.MsoSmartArtNodePosition.msoSmartArtNodeBelow);
      ndLev2_1_1.TextFrame2.TextRange.Text = "Node 1.1.1";

    }
...