Anzahl Kopien und Drucker bei Word/Excel

Nutzung, Komponenten, .NET

Moderator: Moderatoren

Antworten
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Anzahl Kopien und Drucker bei Word/Excel

Beitrag von Koverhage »

Hier wie ich das jetzt gemacht habe. Funktioniert alles Super. Danke für die vielen Hilfen hier.

//////////////////////////////////////////////////////////////////////
// Oeffnet ein MS Word-Dokument und ersetzt die Lesezeichen mit
// Werten, die in der Liste aData uebergeben wurden. Das Ergebnis
// wird dann auf die Festplatte geschrieben.
//////////////////////////////////////////////////////////////////////
FUNCTION WordFillDocument(cFile,cSaveAs,lPrint,lDruOrEdit,nCopies,cPrinter)
LOCAL oWord,oBM,oDoc
local mess1 := LGTrans(('Cdb')->sprache,'0051001','Microsoft Word ist nicht installiert')
local lWordFinished := .f.
local i := 0
LOCAL nEvent := 0, mp1, mp2
LOCAL lBackground := .f.
LOCAL cOldPrinter

#if XPPVER > 01890000

default lDruOrEdit to .f.
default lPrint to .f.
default nCopies to 1

i := Rat( ".",cFile)
if i < 1
cFile := cFile + ".doc"
endif

IF(ValType(cSaveAs)=="C")
i := Rat( ".",cSaveAs)
if i < 1
cSaveAs := cSaveAs + ".doc"
endif
ENDIF

if !Fexists(cFile)
msgbox("Datei: "+cFile+" nicht gefunden")
endif

// Erzeugen einer ActiveX-Komponente
oWord := CreateObject("opendocument.WriterDocument.1")
IF Empty( oWord )
oWord := CreateObject("Word.Application")
ENDIF
IF Empty( oWord )
MsgBox( mess1 )
ENDIF
if lDruOrEdit
oWord := oWord:dynamicCast(ActiveXObject())
oWord:Quit := {||lWordFinished := .T.}
oWord:visible := .T.
lWordFinished := .F.
else
oWord:visible := .F.
oWord:DisplayAlerts := .F.
endif

// Oeffnen eines Word-Dokuments und Zugriff auf
// eine Sammlung von Lesezeichen
oWord:documents:open( cFile )
oDoc := oWord:ActiveDocument
oBM := oDoc:Bookmarks

// Ersetzen des Lesezeichens durch einen neuen
// Wert
// Kundendaten
ReplaceBookmark(oBM , "C_KDNR" , c_kdnr ) // Kundenummer


// Speichern des Ergebnisses
IF(ValType(cSaveAs)=="C")
oDoc:saveas(cSaveAs)
ENDIF

// Optionales Ausgeben auf dem angegebenen Drucker
IF(ValType(lPrint)=="L" .AND. lPrint)
cOldPrinter := oWord:ActivePrinter := rtrim(cPrinter)
oDoc:PrintOut(lBackground,NIL,NIL,NIL,NIL,NIL,NIL,nCopies)
oWord:ActivePrinter := cOldPrinter
ENDIF

if lDruOrEdit
Do WHILE !lWordFinished
// Just wait
nEvent := AppEvent( @mp1, @mp2, , 1)
EndDo
else
// Schliessen des Dokuments und zerstoeren das
// ActiveX-Objektes.
oDoc:close()
sleep(0)
oWord:Quit()
sleep(0)
endif
oWord:destroy()
sleep(0)
#endif
RETURN NIL
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Koverhage »

Hallo,

ich benutze wie im vorherigen Beispiel die Printout Methode um um Dokumente über Word zu drucken.
Der Hintergrund: Der Anwender kann den Drucker und die Anzahl der Kopien
festlegen.

Nun aber das Problem.
Wenn der Anwender im Dokument über Seite einrichten den Drucker und z.B. Schächte ausgewählt hat, werden diese Einstellungen nicht berücksichtigt.
Wenn er aber das Dokument in Word öffnet und druckt werden diese Einstellungen berücksichtigt.

Leider gibt es für die Printout Methode keine Eigenschaften, wo der Schacht angegeben werden kann.

Ich könnte versuchen dir Printout Methode ohne Parameter aufzurufen,
aber es macht für mich wenig Sinn, wenn der Anwender bei jedem Word
Dokument die Druckeinstellungen über Seite einrichten festlegen soll.
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Koverhage »

Habe das gefunden, aber wie mache ich das in Xbase++ ?

erstes Beispiel
1.
Dim sCurrentPrinter As String
2.
sCurrentPrinter = ActivePrinter
3.
wrd.ActivePrinter = "\\BTBEAPAPP04\PBTBEA00004M"
4.
Const WdPrinterLowerbin = 2
5.
wrd.Options.DefaultTrayID = WdPrinterLowerbin
6.
wrd.Application.PrintOut FileName:=""

2. Beispiel

From the HELP text in vB:

DefaultTrayID Property

Returns or sets the default tray your printer uses to print
documents.

Read/write WdPaperTray.

WdPaperTray can be one of these WdPaperTray constants.

wdPrinterAutomaticSheetFeed
wdPrinterDefaultBin
wdPrinterEnvelopeFeed
wdPrinterFormSource
wdPrinterLargeCapacityBin
wdPrinterLargeFormatBin
wdPrinterLowerBin
wdPrinterManualEnvelopeFeed
wdPrinterManualFeed
wdPrinterMiddleBin
wdPrinterOnlyBin
wdPrinterPaperCassette
wdPrinterSmallFormalBin
wdPrinterTractorFeed
wdPrinterUpperBin


Remarks
You can use the DefaultTray property with a string from the
Default tray box on the Print tab in the Options dialog box
to set this same option.

Example
This example sets Word to use the upper print tray, and
then it prints the active document.

Options.DefaultTrayID = wdPrinterUpperBin
ActiveDocument.PrintOut
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hallo Klaus,

nimm doch bitte den CODE Tag für eingefügten Code, das kann man sonst kaum lesen.

Zu VB:

Code: Alles auswählen

wrd.xxxx = "123"   ->    oWord:xxx := "123"
wrd.printer Parameter = "123"xxxx = "123"   ->    das ist ein Methodenaufruf mit Parameterübergabe.
In VB kann man die Klammern weglassen und Parameter per Namen statt per Reihenfolge übergeben, das können wir nicht. Somit musst du herausbekommen welche Parameter angegeben werden müssen und den Typ dazu.

Code: Alles auswählen

z.B.  oWord:printer(1,2,3,"123",...)
Soweit ich das weiß (ich bin mir ziemlich sicher ;-) ) sind die Namen der Drucker und die Codes der BIN (Druckfächer) von Druckerobjekt vorgegeben und somit für alle Programmiersprachen identisch. Wenn das stimmt, kannst du diese Infos auch über Xbase++ ermitteln:

Code: Alles auswählen

oPRN := XbpPrinter():new()
aDruckerliste := oPRN:List()
... Druckerauswahl
oPRN := XbpPrinter():create(aDruckerliste[nAuswahl]) // Parameter unterscheiden sich von NEW() !
aBins := oPRN:paperBins()
... Auswahl welcher BIN gewünscht ist (die Bezeichnungen sind sehr unterschiedlich:
* Automatische Auswahl,
* Universaleinzug
* Fach 1 ...
* Manuell ...
aBins -> { { nBinID, nBinName}, ...
In der Hilfe steht zwar, dass vordefinierte Werte für nBinID zur Verwendung in setPaperBin() zur Verfügung stehen, aber das ist zumindest irreführend.

In der xpbBin steht:

Code: Alles auswählen

// Vordefinierte Papierschächte f
Gruß
Hubert
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Koverhage »

Hubert,

die Werte für die Schächte liegen ja vor bzw. kommen über XbpPrinter.

Habe das aber mittlerweile gelöst, sobald die Tests erfolgreich waren, poste ich hier selbstverständlich den Code.

Vielleicht habe ich ja dann die ein oder andere neue Frage ;-)
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Koverhage »

wie versprochen hier wie die Einstellungen gesetzt werden können und es mir bzw. unseren Kunden erstmal ausreichend ist, da sie den Drucker, den Schacht für die erste Seite und die folgenden Seiten, sowie die Anzahl der Kopien angeben können.


oWord:documents:open( cFile )
oDoc := oWord:ActiveDocument
oBM := oDoc:Bookmarks
// Objekt für Druckereinstellungen
oDruckerSettings := oDoc:PageSetup

// Sichern der aktuellen Einstellungen
nFirstTrayID := oDruckerSettings:FirstPageTray
nOtherTrayID := oDruckerSettings:OtherPagesTray

// Setzen der gewünschten Werte
// Returns or sets the paper tray to use for the first page
// of a document or section.
oDruckerSettings:FirstPageTray := nSchacht1

// Returns or sets the paper tray to be used for all
// but the first page of a document or section.
oDruckerSettings:OtherPagesTray := nSchacht2

// Returns or sets the orientation of the page.
// oDruckerSettings:Orientation :=

// True for Microsoft Word to print a document in a series
// of booklets so the printed pages can be folded and
// read as a book.
// oDruckerSettings:BookFoldPrinting :=

// True for Microsoft Word to reverse the printing order for book
// fold printing of bidirectional or Asian language documents.
// oDruckerSettings:BookFoldRevPrinting :=

// Returns or sets the height of the page in points.
// oDruckerSettings:PageHeight :=

// Returns or sets the width of the page in points.
// oDruckerSettings:PageWidth :=

// Returns or sets the paper size
// oDruckerSettings:PaperSize :=

// Returns or sets the distance (in points) between the top edge
// of the page and the top boundary of the body text.
// oDruckerSettings:TopMargin :=

// Returns or sets the distance (in points) between the left edge
// of the page and the left boundary of the body text.
// oDruckerSettings:LeftMargin :=

// Returns or sets the distance (in points) between the bottom edge
// of the page and the bottom boundary of the body text.
// oDruckerSettings:BottomMargin :=

// Returns or sets the distance (in points) between the right edge
// of the page and the right boundary of the body text.
// oDruckerSettings:RightMargin :=

// True if Microsoft Word prints the specified document two pages
// per sheet.
// oDruckerSettings:TwoPagesOnOne :=


// Dokument drucken
cOldPrinter := oWord:ActivePrinter := rtrim(cPrinter)
oDoc:PrintOut(lBackground,NIL,NIL,NIL,NIL,NIL,NIL,nCopies)
oWord:ActivePrinter := cOldPrinter

// gesicherte Einstellungen zurücksetzen
oDruckerSettings:FirstPageTray := nFirstTrayID
oDruckerSettings:OtherPagesTray := nOtherTrayID
Benutzeravatar
Koverhage
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2470
Registriert: Fr, 23. Dez 2005 8:00
Wohnort: Aalen
Hat sich bedankt: 102 Mal
Danksagung erhalten: 3 Mal
Kontaktdaten:

Beitrag von Koverhage »

Noch ein Hinweis zu der Stolperfalle Orientation

bei Microsoft ist 0 = Portrait, 1 = Landscape

bei Xbase++: 1 = Portrait, 2 = Landscape
Antworten