2010-06-23 2 views
2

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

Кто-нибудь есть какие-либо ссылки или пример кода о том, как приступить к работе на попытке программно заполнить шаблон сроки дорожной карты в PowerPoint

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

+0

Вы имеете в виду схему? –

+0

@ Отаку - вот пример: http://www.jumpdesign.net/aboutcd/02history/Short_history_timeline.jpg – leora

+0

Да, что-то вроде этого вполне выполнимо. Сначала я буду искать, если это было сделано раньше - если нет, я буду вводить код для вас в VBA. Похоже, интересно создать его. :) –

ответ

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

Это очень хорошее начало. есть еще несколько вещей, которые я хочу добавить, поэтому было бы замечательно, если бы у вас были предложения. Я нашел лучший «шаблон», и я добавлю ссылку и объясню – leora

+0

@ooo. Мне бы хотелось увидеть другой пример, если он у вас есть. Конечно, есть вещи, которые можно добавить к этому - также требуется немного больше работы по позиционированию ручек настройки. –

Смежные вопросы