webForumDet fria alternativet

Öppna worddokument och köra ett macro?

ASP

11 svar · 464 visningar · startad av anbj

Medlem sedan juli 2000231 inlägg
Frågan#1

Är det någon som vet hur man gör för att via asp öppna ett nytt word dokument baserat på en viss mall och för att köra ett visst macro i det nya dokumentet? Vad jag har läst mig till så ska detta gå att göra, frågan är bara hur.....

/Anders

Medlem sedan jan. 20013 406 inlägg
#2

Vill också veta

Medlem sedan juli 2000231 inlägg
#3

Som jag fattade det så är den enda möjligheten att bygga ett ActiveX objekt som körs på klienten. Det kräver dock att man kan tillåta körning av ActiveX centralt, så att inte varje användare måste rodda med inställningar för det.

Ett annat alternativ är att länka till .lnk filer, i dessa kan man sätta diverse växlar som behandlar hur man ska öppna dokumentet:
http://support.microsoft.com/default.aspx?scid=kb;en-us;210565

Medlem sedan feb. 20013 023 inlägg
#4

anbj skrev:

Som jag fattade det så är den enda möjligheten att bygga ett ActiveX objekt som körs på klienten. Det kräver dock att man kan tillåta körning av ActiveX centralt, så att inte varje användare måste rodda med inställningar för det.

Ett annat alternativ är att länka till .lnk filer, i dessa kan man sätta diverse växlar som behandlar hur man ska öppna dokumentet:
http://support.microsoft.com/default.aspx?scid=kb;en-us;210565

Strunt i ActiveX och överför koden i makrot till webbsidan så att du manipulerar worddokumentet innan du skickar det till klienten.

Medlem sedan jan. 20013 406 inlägg
#5

OK hur gör man det då?

Medlem sedan mars 20015 287 inlägg
#6

Hur avancerad är wordfilen samt makrot?

Medlem sedan jan. 20013 406 inlägg
#7

Word filen är tom från början. Det är makrot som fyller word filen med informationen.

Så här ser makrot ut:

Sub Katalog()
    With ActiveDocument.Styles(wdStyleNormal).Font
        If .NameFarEast = .NameAscii Then
            .NameAscii = ""
        End If
        .NameFarEast = ""
    End With
    With ActiveDocument.PageSetup
        .LineNumbering.Active = False
        .Orientation = wdOrientPortrait
        .TopMargin = CentimetersToPoints(2.5)
        .BottomMargin = CentimetersToPoints(2.5)
        .LeftMargin = CentimetersToPoints(2.5)
        .RightMargin = CentimetersToPoints(2.5)
        .Gutter = CentimetersToPoints(0)
        .HeaderDistance = CentimetersToPoints(1.25)
        .FooterDistance = CentimetersToPoints(1.25)
        .PageWidth = CentimetersToPoints(21)
        .PageHeight = CentimetersToPoints(29.7)
        .FirstPageTray = wdPrinterDefaultBin
        .OtherPagesTray = wdPrinterDefaultBin
        .SectionStart = wdSectionNewPage
        .OddAndEvenPagesHeaderFooter = False
        .DifferentFirstPageHeaderFooter = False
        .VerticalAlignment = wdAlignVerticalTop
        .SuppressEndnotes = False
        .MirrorMargins = False
        .TwoPagesOnOne = False
        .BookFoldPrinting = False
        .BookFoldRevPrinting = False
        .BookFoldPrintingSheets = 1
        .GutterPos = wdGutterPosLeft
    End With
    ActiveWindow.ActivePane.VerticalPercentScrolled = 0
    If ActiveWindow.View.SplitSpecial <> wdPaneNone Then
        ActiveWindow.Panes(2).Close
    End If
    If ActiveWindow.ActivePane.View.Type = wdNormalView Or ActiveWindow. _
        ActivePane.View.Type = wdOutlineView Then
        ActiveWindow.ActivePane.View.Type = wdPrintView
    End If
    ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader
    If Selection.HeaderFooter.IsHeader = True Then
        ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageFooter
    Else
        ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader
    End If
    Selection.Delete Unit:=wdCharacter, Count:=1
    Selection.Delete Unit:=wdCharacter, Count:=1
    ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument
    Selection.WholeStory
    Selection.Delete Unit:=wdCharacter, Count:=1
    
    'Kör funktionerna
    Call Produkter
    Call Framsida
    Call Innehålssförteckning
    Selection.EndKey Unit:=wdStory
    Selection.TypeBackspace
    Selection.HomeKey Unit:=wdStory
End Sub

Sub Innehålssförteckning()
    Selection.TypeText Text:="Innehåll:"
    Selection.TypeParagraph
    Selection.TypeParagraph
    With ActiveDocument
        .TablesOfContents.Add Range:=Selection.Range, RightAlignPageNumbers:= _
            True, UseHeadingStyles:=True, UpperHeadingLevel:=1, _
            LowerHeadingLevel:=3, IncludePageNumbers:=True, AddedStyles:="", _
            UseHyperlinks:=True, HidePageNumbersInWeb:=True, UseOutlineLevels:= _
            True
        .TablesOfContents(1).TabLeader = wdTabLeaderDots
        .TablesOfContents.Format = wdIndexIndent
    End With
End Sub

Sub Produkter()
  Dim con
  Dim sqlString
  Dim produkterRS
  Dim kategorierRS

  Set con = CreateObject("ADODB.Connection")
  con.Open "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=c:\datbas.mdb"

  sqlString = "SELECT kategori_id, kategori_namn FROM kategori ORDER BY kategori_ordning, kategori_namn"
  Set kategorierRS = con.Execute(sqlString)
  
  
  While Not kategorierRS.EOF
  
    sqlString = "SELECT * FROM produkt Where produkt_kategoriID = " & kategorierRS("kategori_id") & "  ORDER BY produkt_namn"
    Set produkterRS = con.Execute(sqlString)
    If Not produkterRS.EOF Then
      Selection.Style = ActiveDocument.Styles("Rubrik 1")
      Selection.TypeText Text:=kategorierRS("kategori_namn")
      Selection.TypeParagraph
      Selection.TypeParagraph
    End If
    While Not produkterRS.EOF
      ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=1, NumColumns:= _
          2, DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:= _
          wdAutoFitFixed
      With Selection.Tables(1)
          If .Style <> "Tabellrutnät" Then
              .Style = "Tabellrutnät"
          End If
          .ApplyStyleHeadingRows = True
          .ApplyStyleLastRow = True
          .ApplyStyleFirstColumn = True
          .ApplyStyleLastColumn = True
      End With
      Selection.InlineShapes.AddPicture FileName:="http://www.swisstime.se/bilder/klockor/produkt/" & produkterRS("produkt_id") & "_stor.jpg", LinkToFile:=False, SaveWithDocument:=True
      Selection.MoveRight Unit:=wdCharacter, Count:=1
      Selection.Style = ActiveDocument.Styles("Rubrik 2")
      Selection.TypeText Text:=produkterRS("produkt_namn")
      Selection.TypeParagraph
      Selection.TypeText Text:=Replace(Replace(Trim(produkterRS("produkt_kortbeskrivning")), vbTab, " "), "," & vbCrLf, ", ")
      Selection.TypeParagraph
      Selection.Tables(1).Columns(1).SetWidth ColumnWidth:=68.4, RulerStyle:=wdAdjustNone
      Call katlinjerBort
      Selection.MoveDown Unit:=wdLine, Count:=1
      Selection.TypeParagraph

      produkterRS.MoveNext
    Wend
    produkterRS.Close
    Selection.InsertBreak Type:=wdPageBreak
    kategorierRS.MoveNext
  Wend
  kategorierRS.Close
  con.Close
  
End Sub

Sub katlinjerBort()
    With Selection.Tables(1)
        .Borders(wdBorderLeft).LineStyle = wdLineStyleNone
        .Borders(wdBorderRight).LineStyle = wdLineStyleNone
        .Borders(wdBorderTop).LineStyle = wdLineStyleNone
        .Borders(wdBorderBottom).LineStyle = wdLineStyleNone
        .Borders(wdBorderVertical).LineStyle = wdLineStyleNone
        .Borders(wdBorderDiagonalDown).LineStyle = wdLineStyleNone
        .Borders(wdBorderDiagonalUp).LineStyle = wdLineStyleNone
        .Borders.Shadow = False
    End With
    With Options
        .DefaultBorderLineStyle = wdLineStyleSingle
        .DefaultBorderLineWidth = wdLineWidth050pt
        .DefaultBorderColor = wdColorAutomatic
    End With
End Sub

Sub Framsida()
    Selection.HomeKey Unit:=wdStory
    Selection.InsertBreak Type:=wdPageBreak
    Selection.HomeKey Unit:=wdStory
    Selection.TypeParagraph
    Selection.MoveUp Unit:=wdLine, Count:=1
    Selection.Style = ActiveDocument.Styles("Normal")
    Selection.TypeText Text:="Företag"
   Selection.TypeText Text:="Produktkatalog"
    Selection.TypeParagraph
    Selection.TypeParagraph
    Selection.TypeParagraph
    Selection.TypeParagraph
    Selection.InlineShapes.AddPicture FileName:="http://www.swisstime.se/bilder/klockor/produkt/34_stor.jpg", LinkToFile:=False, SaveWithDocument:=True
    Selection.TypeParagraph
    Selection.TypeParagraph
    Selection.TypeParagraph
    With ActiveDocument.Styles(wdStyleNormal).Font
        If .NameFarEast = .NameAscii Then
            .NameAscii = ""
        End If
        .NameFarEast = ""
    End With
    With ActiveDocument.PageSetup
        .LineNumbering.Active = False
        .Orientation = wdOrientPortrait
        .TopMargin = CentimetersToPoints(2.5)
        .BottomMargin = CentimetersToPoints(2.5)
        .LeftMargin = CentimetersToPoints(2.5)
        .RightMargin = CentimetersToPoints(2.5)
        .Gutter = CentimetersToPoints(0)
        .HeaderDistance = CentimetersToPoints(1.25)
        .FooterDistance = CentimetersToPoints(1.25)
        .PageWidth = CentimetersToPoints(21)
        .PageHeight = CentimetersToPoints(29.7)
        .FirstPageTray = wdPrinterDefaultBin
        .OtherPagesTray = wdPrinterDefaultBin
        .SectionStart = wdSectionNewPage
        .OddAndEvenPagesHeaderFooter = False
        .DifferentFirstPageHeaderFooter = True
        .VerticalAlignment = wdAlignVerticalTop
        .SuppressEndnotes = False
        .MirrorMargins = False
        .TwoPagesOnOne = False
        .BookFoldPrinting = False
        .BookFoldRevPrinting = False
        .BookFoldPrintingSheets = 1
        .GutterPos = wdGutterPosLeft
    End With
    Selection.EndKey Unit:=wdStory
    If ActiveWindow.View.SplitSpecial <> wdPaneNone Then
        ActiveWindow.Panes(2).Close
    End If
    If ActiveWindow.ActivePane.View.Type = wdNormalView Or ActiveWindow. _
        ActivePane.View.Type = wdOutlineView Then
        ActiveWindow.ActivePane.View.Type = wdPrintView
    End If
    ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader
    If Selection.HeaderFooter.IsHeader = True Then
        ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageFooter
    Else
        ActiveWindow.ActivePane.View.SeekView = wdSeekCurrentPageHeader
    End If
    Selection.ParagraphFormat.Alignment = wdAlignParagraphRight
    Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldPage
    ActiveWindow.ActivePane.View.SeekView = wdSeekMainDocument
    Selection.HomeKey Unit:=wdStory
    Selection.MoveDown Unit:=wdLine, Count:=8
    Selection.InsertBreak Type:=wdSectionBreakNextPage
    Selection.ParagraphFormat.Alignment = wdAlignParagraphLeft
End Sub
Medlem sedan mars 20015 287 inlägg
#8

Ujuj Addeladde, det där var ett riktigt makro, över min förmåga.

Medlem sedan jan. 20013 406 inlägg
#9

Så svårt är det inte. Om man spelar in ett makro och titta på koden så lär man sig rätt fort. :)

Medlem sedan feb. 20013 023 inlägg
#10

Det är i princip samma kod i ASP-lösningen som i ditt makro. Du måste skapa ett wordobjekt först.
Typ:

Dim oWordApp as Word.Application
Dim oWordApp=Createobject("Word.Application")

sedan kan du använda din makrokod. Du måste bara tänka på att använda oWordApp hela tiden. När du arbetar med makron i Word vet Word om att det är Word du jobbar med. Därför behöver man ingen referens till wordapplikationen.

Det som ser ut såhär i Wordmakro:
ActiveDocument.Name="Clarkbones.doc"

ska se ut såhär i ASP
owordapp.ActiveDocument.Name="Clarkbones.doc"

Spelar man in ett makro får man oftast en mängd kodrader man inte behöver. I extrema fall kan man skippa 90% av koden och ändå få exakt samma resultat. Det beror på att många värden är default och inte behöver sättas, men makrot sätter dem ändå.

Medlem sedan jan. 20013 406 inlägg
#11

Word måste vara installerat på servern eller hur?
Vad ska man installera minimun installation räcker det?
Tänkte köra in en office standard för det tror jag att jag har någon oanvänd licens för.

Medlem sedan feb. 20013 023 inlägg
#12

Addeladde skrev:

Word måste vara installerat på servern eller hur?
Vad ska man installera minimun installation räcker det?
Tänkte köra in en office standard för det tror jag att jag har någon oanvänd licens för.

Jo, Office måste nog vara installerat på servern. Det borde funka med en minimiinstallation, det beror ju lite på vad du skall göra. Är det bara makrokoden du visat hittills så ska det räcka med minimi.

263 ms totalt · 4 externa anrop · v20260731065814-full.a51de22e
122 ms — deklarationer (db)
0 ms — hämta statistik (cache)
138 ms — hämta tråd, inlägg och bilagor (db)
119 ms — ändringar (db)