Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 90815a31

Von Joachim Zach vor fast 15 Jahren hinzugefügt

  • ID 90815a31b45ced8f49c31502cff1c8155e692a7a
  • Vorgänger bedf5ec6
  • Nachfolger 4236c151

Optionale minimale Excel-Unterstützung für Druckvorlagen (Austausch von Platzhalter-Variablen in Excel-Dateien). Entsprechend noch für strict angepasst

Unterschiede anzeigen:

SL/CT.pm
return $result;
}
sub parse_excel_file {
$main::lxdebug->enter_sub();
my ($self, $myconfig, $form) = @_;
my $locale = $main::locale;
$form->{formname} = 'sales_quotation';
$form->{type} = 'sales_quotation';
$form->{format} = 'excel';
$form->{media} = 'screen';
$form->{quonumber} = 1;
# $form->{"notes"} will be overridden by the customer's/vendor's "notes" field. So save it here.
$form->{ $form->{"formname"} . "notes" } = $form->{"notes"};
my $inv = "quo";
my $due = "req";
$form->{"${inv}date"} = $form->{transdate};
$form->{label} = $locale->text('Quotation');
my $numberfld = "sqnumber";
my $order = 1;
# assign number
$form->{what_done} = $form->{formname};
map({ delete($form->{$_}); } grep(/^cp_/, keys(%{ $form })));
my $output_dateformat = $myconfig->{"dateformat"};
my $output_numberformat = $myconfig->{"numberformat"};
my $output_longdates = 1;
# map login user variables
map { $form->{"login_$_"} = $myconfig->{$_} } ("name", "email", "fax", "tel", "company");
# format item dates
for my $field (qw(transdate_oe deliverydate_oe)) {
map {
$form->{$field}[$_] = $locale->date($myconfig, $form->{$field}[$_], 1);
} 0 .. $#{ $form->{$field} };
}
if ($form->{shipto_id}) {
$form->get_shipto($myconfig);
}
$form->{notes} =~ s/^\s+//g;
$form->{templates} = $myconfig->{templates};
delete $form->{printer_command};
$form->get_employee_info($myconfig);
my ($cvar_date_fields, $cvar_number_fields) = CVar->get_field_format_list('module' => 'CT', 'prefix' => 'vc_');
if (scalar @{ $cvar_date_fields }) {
format_dates($output_dateformat, $output_longdates, @{ $cvar_date_fields });
}
while (my ($precision, $field_list) = each %{ $cvar_number_fields }) {
reformat_numbers($output_numberformat, $precision, @{ $field_list });
}
$form->{excel} = 1;
my $extension = 'xls';
my $form->{IN} = "$form->{formname}.${extension}";
delete $form->{OUT};
$form->parse_template($myconfig, $main::userspath);
$main::lxdebug->leave_sub();
}
1;
SL/Form.pm
} elsif ( $self->{"format"} =~ /elstertaxbird/i ) {
$template = XMLTemplate->new($self->{"IN"}, $self, $myconfig, $userspath);
} elsif ( $self->{"format"} =~ /excel/i ) {
$template = ExcelTemplate->new($self->{"IN"}, $self, $myconfig, $userspath);
$ext_for_format = 'xls';
} elsif ( defined $self->{'format'}) {
$self->error("Outputformat not defined. This may be a future feature: $self->{'format'}");
......
my $extension = $self->{format} =~ /pdf/i ? ".pdf"
: $self->{format} =~ /postscript/i ? ".ps"
: $self->{format} =~ /opendocument/i ? ".odt"
: $self->{format} =~ /excel/i ? ".xls"
: $self->{format} =~ /html/i ? ".html"
: "";
SL/Template.pm
return 1;
}
##########################################################
####
#### ExcelTemplate
####
##########################################################
package ExcelTemplate;
use vars qw(@ISA);
@ISA = qw(SimpleTemplate);
sub new {
my $type = shift;
my $self = $type->SUPER::new(@_);
return $self;
}
sub _init {
my $self = shift;
$self->{source} = shift;
$self->{form} = shift;
$self->{myconfig} = shift;
$self->{userspath} = shift;
$self->{error} = undef;
$self->set_tag_style('<<', '>>');
}
sub get_mime_type() {
my ($self) = @_;
return "application/msexcel";
}
sub uses_temp_file {
return 1;
}
sub parse {
$main::lxdebug->enter_sub();
my $self = shift;
local *OUT = shift;
my $form = $self->{"form"};
open(IN, "$form->{templates}/$form->{IN}") or do { $self->{"error"} = "$!"; return 0; };
my @lines = <IN>;
close IN;
my $contents = join("", @lines);
my @indices;
$contents =~ s{
$self->{tag_start} [<]* (\s?) [<>\s]* ([\w\s]+) [<>\s]* $self->{tag_end}
}{
$self->format_vars(align_right => $1 ne '', varstring => $2, length => length($&), indices => \@indices)
}egx;
if (!defined($contents)) {
$main::lxdebug->leave_sub();
return 0;
}
print OUT $contents;
$main::lxdebug->leave_sub();
return 1;
}
sub format_vars {
my ($self, %params) = @_;
my $form = $self->{"form"};
my @indices = @{ $params{indices} };
my $align_right = $params{align_right};
my $varstring = $params{varstring};
my $length = $params{length};
$varstring =~ s/(\w+)/ $self->_get_loop_variable($1, 0, @indices) /eg;
my $old_string=$varstring;
my $new_string = sprintf "%*s", ($align_right ? 1 : -1 ) * $length, $varstring;
if (!defined($new_string) || $new_string eq ''){
$main::lxdebug->message(0, 'varstring' . $varstring . "old" . $old_string);
# return substr $varstring, ($align_right ? (0, $length) : -$length);
}
return substr $new_string, ($align_right ? (0, $length) : -$length);
}
1;
bin/mozilla/io.pl
(!$options{no_html}) ?
opthash("html", $form->{DF}{html}, "HTML") : undef,
($main::opendocument_templates && !$options{no_opendocument}) ?
opthash("opendocument", $form->{DF}{opendocument}, $locale->text("OpenDocument/OASIS")) : undef;
opthash("opendocument", $form->{DF}{opendocument}, $locale->text("OpenDocument/OASIS")) : undef,
($main::excel_templates && !$options{no_excel}) ?
opthash("excel", $form->{DF}{excel}, $locale->text("Excel")) : undef;
push @LANGUAGE_ID,
map { opthash($_->{id}, ($_->{id} eq $form->{language_id} ? 'selected' : ''), $_->{description}) } +{}, @{ $form->{languages} }
......
} elsif ($form->{"format"} =~ /opendocument/) {
$form->{opendocument} = 1;
$extension = 'odt';
} elsif ($form->{"format"} =~ /excel/) {
$form->{excel} = 1;
$extension = 'xls';
}
my $email_extension = '_email' if (($form->{media} eq 'email') && (-f "$myconfig{templates}/$form->{formname}_email$form->{language}${printer_code}.${extension}"));
config/lx-erp.conf
$webdav = 0;
$lizenzen = 1;
$vertreter = 0;
$excel_templates = 0; # Minimalunterst?tzung f?r Excel-Druckvorlagen
# Zeige Felder f?r Mindesthaltbarkeitsdatum
$show_best_before = 0;
doc/changelog
# Veränderungen von Lx-Office ERP #
###################################
Kleinere neue Features und Detailverbesserungen:
- Druckvorlage optional auf Excel erweitert, um Variablen die sich nicht in foreach-Schleifen
befinden anzuzeigen (s.a.: doc/excel_templates.txt).
2010-03-24 - Release 2.6.1
Größere neue Features:
doc/excel_templates.txt
Table of Contents
-----------------
Inhalt der Anleitung
1 Zusammenfassung
2 Bedienung
3 Exceltemplate Syntax
4 Einschr?nkungen
Zusammenfassung
---------------
Dieses Dokument beschreibt den Mechanismus, mit dem Exceltemplates abgearbeitet
werden, und die Einschr?nkungen die damit einhergehen.
Bedienung
---------
Der Excel Mechanismus muss in der Konfigurationsdatei aktiviert werden. Die
Konfigurationsoption hei?t:
$excel_templates = 1;
Eine Excelvorlage kann dann unter dem Namen einer beliebigen anderen Vorlage mit
der Endung .xls gespeichert werden. In den normalen Verkaufsmasken taucht nun
"Excel" als ausw?hlbares Format auf, und kann von da an bnutzt weren wie Latex
oder OpenOffice Vorlagen.
Der Sonderfall der Angebote aus der Kundenmaske ist ebenfalls eine
Angebotsvorlage, und wird unter dem internen Namen der Angebote
"sales_quotation.xls" gespeichert.
Exceltemplate Syntax
--------------------
Einfache Syntax: <<varname>>
Wobei "<<" und ">>" die Delimiter sind. Da Excel auf festen Breiten besteht,
kann der Tag k?nstlich verl?ngert werden, indem weitere "<" oder ">" gegef?gt
werden. Der Tag muss nicht symmetrisch sein.
Beispiel: <<<<<varname>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Um die Limitierung der festen Breite zu reduzieren, k?nnen weitere Variablen in
einem Block interpoliert werden. Whitespace wird dazwishen dann erhalten.
Beispiel: <<<<<varname1 varname2 varname3>>>>>>>>>>>>>>>>>>>>>>>>>>
Die Variablen werden interpoliert, und linksb?ndig mit Leerzeichen auf die
gew?nschte L?nge aufgef?llt. Ist der String zu lang, werden ?berz?hlige Zeichen
abgeschnitten.
Es ist ausserdem m?glich Daten rechtsb?ndig darzustellen, wenn der Block mit
einem Leerzeichen anf?ngt.
Beispiel: <<<<<< varname>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
w?rde rechtsb?ndig triggern. Wenn bei rechtsb?ndiger Ausrichtung Text
abgeschnitten werden muss, wird er vom linken Ende entfernt.
Einschr?nkungen
---------------
Das Excelformat bis 2002 ist ein bin?res Format, und kann nicht mit vertretbarem
Aufwand editiert werden. Der Templatemechanismus beschr?nkt sich daher darauf,
Textstellen _exakt_ durch einen anderen Text zu ersetzen.
Aus dem gleichen Grund sind die Templatekonstrukte <% if %> und <% foreach %>
nicht vorhanden. Der Delimiter <% %> kommt in den Headerinformationen evtl vor,
deshalb wurde auf den sichereren "<<"/">>" gewechselt.

Auch abrufbar als: Unified diff