Создайте Org Chart с помощью interop excel - PullRequest
1 голос
/ 16 октября 2019

Я хочу создать лист Excel с организационной диаграммой с данными из базы данных.

Я поиграл с библиотекой interop Excel в консольном приложении ac #, но я застрял.

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

Возможно ли даже добавить собственные данные в диаграмму через библиотеку interop excel?

Это мой кодпока что:

    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[88];

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

        smartArtShape.AlternativeText = "Test";

    }

Это результат: enter image description here

1 Ответ

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

Да, функциональность доступна через "взаимодействие" :-) Это просто немного ... загадочно, особенно для тех, кто не из PowerPoint.

Поскольку SmartArt "обернут"в объекте Shape сначала необходимо получить Shape, затем через него объект SmartArt - Shape имеет свойства HasSmartArt (test) и SmartArt (use).

(Обратите внимание, что мне очень полезно явно объявлять объект тип , а не полагаться на var для «угадывания». Это очень помогает при устранении неполадок.)

Фактическое содержимое («коробки»): Nodes. По какой-то причине PIA не предоставляют Node-объекты (но они присутствуют в объектной модели COM), поэтому доступ к ним немного обходится в C #. Чтобы получить все узлы, используйте свойство AllNodes для возврата коллекции.

Затем к объектам Node можно обратиться с индексированием коллекции nds[i]. Отдельный узел может быть назначен SmartArtNode или объекту Office Shape. Для целей этого вопроса - добавления текста - следующим шагом будет то же самое ...

"Ящики" сами по себе являются текстовыми полями Office Drawing (Shapes) и имеют свойство TextFrame2.TextRange.Text длядоступ к их контенту. (Обратите внимание, что содержимое по умолчанию на самом деле является заполнителем, поэтому это свойство не будет возвращать ничего для вновь созданного SmartArt.)

Примечание. Код в вопросе пытается использовать AlternativeText- это похоже на «AltText» в объектах HTML, оно предоставляет доступную информацию и не имеет отношения к тому, что вы пытаетесь сделать.

static void Main(string[] args)
{
    excelApp = new Excel.Application();
    excelApp.Visible = true;
    Excel.Workbook wb = excelApp.Workbooks.Add();
    Excel.Worksheet ws = (Excel.Worksheet) wb.Worksheets[1];

    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;

      for (int i = 1; i <= nds.Count; i++)
      {
          Office.SmartArtNode nd = nds[i]; //both work
          var shpNode = nd.Shapes.Item(1);
          nd.TextFrame2.TextRange.Text = "Testing Node " + i;
          shpNode.TextFrame2.TextRange.Text = "Testing Shape " + i;
      }
    }
}
...