Можно ли сгенерировать временную шкалу дорожной карты PowerPoint из C #?

2

Я знаю, что PowerPoint имеет API, такой как Excel и слово. Есть ли способ генерировать план маршрута по временной шкале программно (у меня есть список этапов и дат из базы данных)?

Есть ли у кого-нибудь ссылки или примерный код о том, как начать, пытаясь программно заполнить шаблон дорожной карты временной шкалы в powerpoint.

Вот пример (не большой) того, что я пытаюсь сделать: http://www.jumpdesign.net/aboutcd/02history/Short_history_timeline.jpg

  • 0
    Вы имеете в виду график?
  • 0
    @Otaku - вот пример: jumpdesign.net/aboutcd/02history/Short_history_timeline.jpg
Показать ещё 2 комментария
Теги:
powerpoint
office-automation

1 ответ

2
Лучший ответ

Хорошо, это все еще требует кучу работы, но, надеюсь, этого достаточно, чтобы вы начали.

Sub GenerateTimeLine()
    Dim ap As Presentation
    Set ap = ActivePresentation

    'Set to first slide
    Dim sl As Slide
    Set sl = ap.Slides(1)

    'Use Slide Master for Presentation dimensions
    Dim sm As Master
    Set sm = ap.SlideMaster

    'Create a timeline body of 75% the width of the slide
    Dim w As Integer
    w = sm.Width * 0.75

    'Create a timeline body of 5% the height of the slide
    Dim h As Integer
    h = sm.Height * 0.1

    'Center horizontal position of timeline body
    Dim posX As Integer
    posX = Abs(w - sm.Width) / 2

    'Center vertical position of timeline body
    Dim posY As Integer
    posY = Abs(h - sm.Height) / 2

    'Add main shape
    Dim timeLineBodyShape As Shape
    Set timeLineBodyShape = sl.Shapes.AddShape(msoShapeRectangle, posX, posY, w, h)

    'Set up initial variables
    Dim timeLineBodyName As String
    timeLineBodyName = "Showjumping"
    Dim yearMin As Integer
    Dim yearMax As Integer
    yearMin = 1864
    yearMax = 2006

    'Add to variables timeline
    With timeLineBodyShape.TextFrame
        With .Ruler.TabStops
            .Add ppTabStopLeft, 0
            .Add ppTabStopCenter, timeLineBodyShape.Width / 2
            .Add ppTabStopRight, timeLineBodyShape.Width
        End With
        With .TextRange
            .InsertAfter CStr(yearMin) + Chr(9) + timeLineBodyName + Chr(9) + CStr(yearMax)
            .Font.Bold = msoTrue
        End With
    End With

    'Create time line nodes
    Dim timeLineNodeYear As Integer
    Dim timeLineNodeText As String
    Dim timeLineNodeTop As Boolean

    timeLineNodeYear = 1864
    timeLineNodeText = "First Competition. Horse Show of the Royal Dublin Society"
    timeLineNodeTop = True
    AddtimeLineNode timeLineBodyShape, timeLineNodeYear, timeLineNodeText, timeLineNodeTop, _
        sl, yearMin, yearMax, sm

    timeLineNodeYear = 1912
    timeLineNodeText = "Stockholm Olympic Games. Team competition for first time in jumping"
    timeLineNodeTop = False
    AddtimeLineNode timeLineBodyShape, timeLineNodeYear, timeLineNodeText, timeLineNodeTop, _
        sl, yearMin, yearMax, sm

    timeLineNodeYear = 1925
    timeLineNodeText = "Aachen. For the first time Aachen Grand Prix"
    timeLineNodeTop = True
    AddtimeLineNode timeLineBodyShape, timeLineNodeYear, timeLineNodeText, timeLineNodeTop, _
        sl, yearMin, yearMax, sm

    timeLineNodeYear = 1953
    timeLineNodeText = "Paris. For first time World Championship for men"
    timeLineNodeTop = False
    AddtimeLineNode timeLineBodyShape, timeLineNodeYear, timeLineNodeText, timeLineNodeTop, _
        sl, yearMin, yearMax, sm

    timeLineNodeYear = 1979
    timeLineNodeText = "The first Volvo World Cup Final"
    timeLineNodeTop = True
    AddtimeLineNode timeLineBodyShape, timeLineNodeYear, timeLineNodeText, timeLineNodeTop, _
        sl, yearMin, yearMax, sm

    timeLineNodeYear = 1990
    timeLineNodeText = "Stockholm. The first World Equestrian Games"
    timeLineNodeTop = False
    AddtimeLineNode timeLineBodyShape, timeLineNodeYear, timeLineNodeText, timeLineNodeTop, _
        sl, yearMin, yearMax, sm

    timeLineNodeYear = 2006
    timeLineNodeText = "Aachen. Biggest World Equestrian Games until now"
    timeLineNodeTop = True
    AddtimeLineNode timeLineBodyShape, timeLineNodeYear, timeLineNodeText, timeLineNodeTop, _
        sl, yearMin, yearMax, sm

End Sub
Sub AddtimeLineNode(tlShape As Shape, tlYear As Integer, tlText As String, tlTop As Boolean, _
        sl As Slide, yearMin As Integer, yearMax As Integer, sm As Master)

    'Positioning calculations
    Dim shapeDifference As Single
    shapeDifference = tlShape.Width - tlShape.Left

    Dim yearDifference
    yearDifference = yearMax - yearMin

    Dim timeLineNodeShape As Shape

    timeLineNodeShapeWidth = 100
    timeLineNodeShapeHeight = 100

    timeLineNodeShapePosLeft = (tlShape.Left + (((tlYear - yearMin) / yearDifference) * shapeDifference))
    timeLineNodeShapePosTop = 30

    If tlTop Then
        Set timeLineNodeShape = sl.Shapes.AddShape(msoShapeRectangularCallout, timeLineNodeShapePosLeft, _
            timeLineNodeShapePosTop, timeLineNodeShapeWidth, timeLineNodeShapeHeight)
        timeLineNodeShapeMid = timeLineNodeShape.Top + timeLineNodeShape.Height / 2
        timeLineBodyShapeHeight = tlShape.Height
        Distance = tlShape.Top - timeLineNodeShapeMid
        handleYplacement = Distance / timeLineNodeShape.Height
        timeLineNodeShape.Adjustments(2) = handleYplacement
    Else
        timeLineNodeShapePosBottom = sm.Height - timeLineNodeShapeHeight - timeLineNodeShapePosTop
        Set timeLineNodeShape = sl.Shapes.AddShape(msoShapeRectangularCallout, timeLineNodeShapePosLeft, _
            timeLineNodeShapePosBottom, timeLineNodeShapeWidth, timeLineNodeShapeHeight)
        timeLineNodeShapeMid = timeLineNodeShape.Top + timeLineNodeShape.Height / 2
        timeLineBodyShapeHeight = tlShape.Height
        Distance = (tlShape.Top + tlShape.Height) - timeLineNodeShapeMid
        handleYplacement = Distance / timeLineNodeShape.Height
        timeLineNodeShape.Adjustments(2) = handleYplacement
    End If

    timeLineNodeShape.TextFrame.TextRange = CStr(tlYear) & ", " & tlText
    timeLineNodeShape.TextFrame2.AutoSize = msoAutoSizeTextToFitShape
End Sub
  • 0
    это очень хорошее начало. Есть еще несколько вещей, которые я хочу добавить, поэтому было бы здорово, если у вас есть предложения. Я нашел лучший "шаблон", и я добавлю ссылку и объясню
  • 0
    @ooo - Я хотел бы увидеть другой пример, если у вас есть. К этому, безусловно, можно добавить кое-что, кроме того, требуется немного больше работы по позиционированию регулировочных ручек.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню