Revision 90815a31
Von Joachim Zach vor mehr als 14 Jahren hinzugefügt
SL/CT.pm | ||
---|---|---|
1089 | 1089 |
return $result; |
1090 | 1090 |
} |
1091 | 1091 |
|
1092 |
sub parse_excel_file { |
|
1093 |
$main::lxdebug->enter_sub(); |
|
1094 |
|
|
1095 |
my ($self, $myconfig, $form) = @_; |
|
1096 |
my $locale = $main::locale; |
|
1097 |
|
|
1098 |
$form->{formname} = 'sales_quotation'; |
|
1099 |
$form->{type} = 'sales_quotation'; |
|
1100 |
$form->{format} = 'excel'; |
|
1101 |
$form->{media} = 'screen'; |
|
1102 |
$form->{quonumber} = 1; |
|
1103 |
|
|
1104 |
|
|
1105 |
# $form->{"notes"} will be overridden by the customer's/vendor's "notes" field. So save it here. |
|
1106 |
$form->{ $form->{"formname"} . "notes" } = $form->{"notes"}; |
|
1107 |
|
|
1108 |
my $inv = "quo"; |
|
1109 |
my $due = "req"; |
|
1110 |
$form->{"${inv}date"} = $form->{transdate}; |
|
1111 |
$form->{label} = $locale->text('Quotation'); |
|
1112 |
my $numberfld = "sqnumber"; |
|
1113 |
my $order = 1; |
|
1114 |
|
|
1115 |
# assign number |
|
1116 |
$form->{what_done} = $form->{formname}; |
|
1117 |
|
|
1118 |
map({ delete($form->{$_}); } grep(/^cp_/, keys(%{ $form }))); |
|
1119 |
|
|
1120 |
my $output_dateformat = $myconfig->{"dateformat"}; |
|
1121 |
my $output_numberformat = $myconfig->{"numberformat"}; |
|
1122 |
my $output_longdates = 1; |
|
1123 |
|
|
1124 |
# map login user variables |
|
1125 |
map { $form->{"login_$_"} = $myconfig->{$_} } ("name", "email", "fax", "tel", "company"); |
|
1126 |
|
|
1127 |
# format item dates |
|
1128 |
for my $field (qw(transdate_oe deliverydate_oe)) { |
|
1129 |
map { |
|
1130 |
$form->{$field}[$_] = $locale->date($myconfig, $form->{$field}[$_], 1); |
|
1131 |
} 0 .. $#{ $form->{$field} }; |
|
1132 |
} |
|
1133 |
|
|
1134 |
if ($form->{shipto_id}) { |
|
1135 |
$form->get_shipto($myconfig); |
|
1136 |
} |
|
1137 |
|
|
1138 |
$form->{notes} =~ s/^\s+//g; |
|
1139 |
|
|
1140 |
$form->{templates} = $myconfig->{templates}; |
|
1141 |
|
|
1142 |
delete $form->{printer_command}; |
|
1143 |
|
|
1144 |
$form->get_employee_info($myconfig); |
|
1145 |
|
|
1146 |
my ($cvar_date_fields, $cvar_number_fields) = CVar->get_field_format_list('module' => 'CT', 'prefix' => 'vc_'); |
|
1147 |
|
|
1148 |
if (scalar @{ $cvar_date_fields }) { |
|
1149 |
format_dates($output_dateformat, $output_longdates, @{ $cvar_date_fields }); |
|
1150 |
} |
|
1151 |
|
|
1152 |
while (my ($precision, $field_list) = each %{ $cvar_number_fields }) { |
|
1153 |
reformat_numbers($output_numberformat, $precision, @{ $field_list }); |
|
1154 |
} |
|
1155 |
|
|
1156 |
$form->{excel} = 1; |
|
1157 |
my $extension = 'xls'; |
|
1158 |
|
|
1159 |
my $form->{IN} = "$form->{formname}.${extension}"; |
|
1160 |
|
|
1161 |
delete $form->{OUT}; |
|
1162 |
|
|
1163 |
$form->parse_template($myconfig, $main::userspath); |
|
1164 |
|
|
1165 |
$main::lxdebug->leave_sub(); |
|
1166 |
} |
|
1167 |
|
|
1092 | 1168 |
1; |
SL/Form.pm | ||
---|---|---|
1178 | 1178 |
} elsif ( $self->{"format"} =~ /elstertaxbird/i ) { |
1179 | 1179 |
$template = XMLTemplate->new($self->{"IN"}, $self, $myconfig, $userspath); |
1180 | 1180 |
|
1181 |
} elsif ( $self->{"format"} =~ /excel/i ) { |
|
1182 |
$template = ExcelTemplate->new($self->{"IN"}, $self, $myconfig, $userspath); |
|
1183 |
$ext_for_format = 'xls'; |
|
1184 |
|
|
1181 | 1185 |
} elsif ( defined $self->{'format'}) { |
1182 | 1186 |
$self->error("Outputformat not defined. This may be a future feature: $self->{'format'}"); |
1183 | 1187 |
|
... | ... | |
1385 | 1389 |
my $extension = $self->{format} =~ /pdf/i ? ".pdf" |
1386 | 1390 |
: $self->{format} =~ /postscript/i ? ".ps" |
1387 | 1391 |
: $self->{format} =~ /opendocument/i ? ".odt" |
1392 |
: $self->{format} =~ /excel/i ? ".xls" |
|
1388 | 1393 |
: $self->{format} =~ /html/i ? ".html" |
1389 | 1394 |
: ""; |
1390 | 1395 |
|
SL/Template.pm | ||
---|---|---|
1477 | 1477 |
return 1; |
1478 | 1478 |
} |
1479 | 1479 |
|
1480 |
|
|
1481 |
########################################################## |
|
1482 |
#### |
|
1483 |
#### ExcelTemplate |
|
1484 |
#### |
|
1485 |
########################################################## |
|
1486 |
|
|
1487 |
package ExcelTemplate; |
|
1488 |
|
|
1489 |
use vars qw(@ISA); |
|
1490 |
|
|
1491 |
@ISA = qw(SimpleTemplate); |
|
1492 |
|
|
1493 |
sub new { |
|
1494 |
my $type = shift; |
|
1495 |
|
|
1496 |
my $self = $type->SUPER::new(@_); |
|
1497 |
|
|
1498 |
return $self; |
|
1499 |
} |
|
1500 |
sub _init { |
|
1501 |
my $self = shift; |
|
1502 |
|
|
1503 |
$self->{source} = shift; |
|
1504 |
$self->{form} = shift; |
|
1505 |
$self->{myconfig} = shift; |
|
1506 |
$self->{userspath} = shift; |
|
1507 |
|
|
1508 |
$self->{error} = undef; |
|
1509 |
|
|
1510 |
$self->set_tag_style('<<', '>>'); |
|
1511 |
} |
|
1512 |
|
|
1513 |
sub get_mime_type() { |
|
1514 |
my ($self) = @_; |
|
1515 |
|
|
1516 |
return "application/msexcel"; |
|
1517 |
} |
|
1518 |
|
|
1519 |
sub uses_temp_file { |
|
1520 |
return 1; |
|
1521 |
} |
|
1522 |
|
|
1523 |
sub parse { |
|
1524 |
$main::lxdebug->enter_sub(); |
|
1525 |
|
|
1526 |
my $self = shift; |
|
1527 |
local *OUT = shift; |
|
1528 |
my $form = $self->{"form"}; |
|
1529 |
|
|
1530 |
open(IN, "$form->{templates}/$form->{IN}") or do { $self->{"error"} = "$!"; return 0; }; |
|
1531 |
my @lines = <IN>; |
|
1532 |
close IN; |
|
1533 |
|
|
1534 |
my $contents = join("", @lines); |
|
1535 |
my @indices; |
|
1536 |
$contents =~ s{ |
|
1537 |
$self->{tag_start} [<]* (\s?) [<>\s]* ([\w\s]+) [<>\s]* $self->{tag_end} |
|
1538 |
}{ |
|
1539 |
$self->format_vars(align_right => $1 ne '', varstring => $2, length => length($&), indices => \@indices) |
|
1540 |
}egx; |
|
1541 |
|
|
1542 |
if (!defined($contents)) { |
|
1543 |
$main::lxdebug->leave_sub(); |
|
1544 |
return 0; |
|
1545 |
} |
|
1546 |
|
|
1547 |
print OUT $contents; |
|
1548 |
|
|
1549 |
$main::lxdebug->leave_sub(); |
|
1550 |
return 1; |
|
1551 |
} |
|
1552 |
|
|
1553 |
sub format_vars { |
|
1554 |
my ($self, %params) = @_; |
|
1555 |
my $form = $self->{"form"}; |
|
1556 |
my @indices = @{ $params{indices} }; |
|
1557 |
my $align_right = $params{align_right}; |
|
1558 |
my $varstring = $params{varstring}; |
|
1559 |
my $length = $params{length}; |
|
1560 |
|
|
1561 |
$varstring =~ s/(\w+)/ $self->_get_loop_variable($1, 0, @indices) /eg; |
|
1562 |
my $old_string=$varstring; |
|
1563 |
my $new_string = sprintf "%*s", ($align_right ? 1 : -1 ) * $length, $varstring; |
|
1564 |
if (!defined($new_string) || $new_string eq ''){ |
|
1565 |
$main::lxdebug->message(0, 'varstring' . $varstring . "old" . $old_string); |
|
1566 |
# return substr $varstring, ($align_right ? (0, $length) : -$length); |
|
1567 |
} |
|
1568 |
return substr $new_string, ($align_right ? (0, $length) : -$length); |
|
1569 |
} |
|
1570 |
|
|
1480 | 1571 |
1; |
bin/mozilla/io.pl | ||
---|---|---|
1184 | 1184 |
(!$options{no_html}) ? |
1185 | 1185 |
opthash("html", $form->{DF}{html}, "HTML") : undef, |
1186 | 1186 |
($main::opendocument_templates && !$options{no_opendocument}) ? |
1187 |
opthash("opendocument", $form->{DF}{opendocument}, $locale->text("OpenDocument/OASIS")) : undef; |
|
1187 |
opthash("opendocument", $form->{DF}{opendocument}, $locale->text("OpenDocument/OASIS")) : undef, |
|
1188 |
($main::excel_templates && !$options{no_excel}) ? |
|
1189 |
opthash("excel", $form->{DF}{excel}, $locale->text("Excel")) : undef; |
|
1188 | 1190 |
|
1189 | 1191 |
push @LANGUAGE_ID, |
1190 | 1192 |
map { opthash($_->{id}, ($_->{id} eq $form->{language_id} ? 'selected' : ''), $_->{description}) } +{}, @{ $form->{languages} } |
... | ... | |
1592 | 1594 |
} elsif ($form->{"format"} =~ /opendocument/) { |
1593 | 1595 |
$form->{opendocument} = 1; |
1594 | 1596 |
$extension = 'odt'; |
1597 |
} elsif ($form->{"format"} =~ /excel/) { |
|
1598 |
$form->{excel} = 1; |
|
1599 |
$extension = 'xls'; |
|
1595 | 1600 |
} |
1596 | 1601 |
|
1597 | 1602 |
my $email_extension = '_email' if (($form->{media} eq 'email') && (-f "$myconfig{templates}/$form->{formname}_email$form->{language}${printer_code}.${extension}")); |
config/lx-erp.conf | ||
---|---|---|
42 | 42 |
$webdav = 0; |
43 | 43 |
$lizenzen = 1; |
44 | 44 |
$vertreter = 0; |
45 |
$excel_templates = 0; # Minimalunterst?tzung f?r Excel-Druckvorlagen |
|
45 | 46 |
|
46 | 47 |
# Zeige Felder f?r Mindesthaltbarkeitsdatum |
47 | 48 |
$show_best_before = 0; |
doc/changelog | ||
---|---|---|
2 | 2 |
# Veränderungen von Lx-Office ERP # |
3 | 3 |
################################### |
4 | 4 |
|
5 |
|
|
6 |
|
|
7 |
|
|
8 |
|
|
9 |
|
|
10 |
|
|
11 |
|
|
12 |
|
|
13 |
|
|
14 |
Kleinere neue Features und Detailverbesserungen: |
|
15 |
|
|
16 |
- Druckvorlage optional auf Excel erweitert, um Variablen die sich nicht in foreach-Schleifen |
|
17 |
befinden anzuzeigen (s.a.: doc/excel_templates.txt). |
|
18 |
|
|
19 |
|
|
5 | 20 |
2010-03-24 - Release 2.6.1 |
6 | 21 |
|
7 | 22 |
Größere neue Features: |
doc/excel_templates.txt | ||
---|---|---|
1 |
Table of Contents |
|
2 |
----------------- |
|
3 |
|
|
4 |
Inhalt der Anleitung |
|
5 |
1 Zusammenfassung |
|
6 |
2 Bedienung |
|
7 |
3 Exceltemplate Syntax |
|
8 |
4 Einschr?nkungen |
|
9 |
|
|
10 |
|
|
11 |
|
|
12 |
Zusammenfassung |
|
13 |
--------------- |
|
14 |
|
|
15 |
Dieses Dokument beschreibt den Mechanismus, mit dem Exceltemplates abgearbeitet |
|
16 |
werden, und die Einschr?nkungen die damit einhergehen. |
|
17 |
|
|
18 |
|
|
19 |
|
|
20 |
Bedienung |
|
21 |
--------- |
|
22 |
|
|
23 |
Der Excel Mechanismus muss in der Konfigurationsdatei aktiviert werden. Die |
|
24 |
Konfigurationsoption hei?t: |
|
25 |
|
|
26 |
$excel_templates = 1; |
|
27 |
|
|
28 |
Eine Excelvorlage kann dann unter dem Namen einer beliebigen anderen Vorlage mit |
|
29 |
der Endung .xls gespeichert werden. In den normalen Verkaufsmasken taucht nun |
|
30 |
"Excel" als ausw?hlbares Format auf, und kann von da an bnutzt weren wie Latex |
|
31 |
oder OpenOffice Vorlagen. |
|
32 |
|
|
33 |
Der Sonderfall der Angebote aus der Kundenmaske ist ebenfalls eine |
|
34 |
Angebotsvorlage, und wird unter dem internen Namen der Angebote |
|
35 |
"sales_quotation.xls" gespeichert. |
|
36 |
|
|
37 |
|
|
38 |
|
|
39 |
Exceltemplate Syntax |
|
40 |
-------------------- |
|
41 |
|
|
42 |
Einfache Syntax: <<varname>> |
|
43 |
|
|
44 |
Wobei "<<" und ">>" die Delimiter sind. Da Excel auf festen Breiten besteht, |
|
45 |
kann der Tag k?nstlich verl?ngert werden, indem weitere "<" oder ">" gegef?gt |
|
46 |
werden. Der Tag muss nicht symmetrisch sein. |
|
47 |
|
|
48 |
Beispiel: <<<<<varname>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> |
|
49 |
|
|
50 |
Um die Limitierung der festen Breite zu reduzieren, k?nnen weitere Variablen in |
|
51 |
einem Block interpoliert werden. Whitespace wird dazwishen dann erhalten. |
|
52 |
|
|
53 |
Beispiel: <<<<<varname1 varname2 varname3>>>>>>>>>>>>>>>>>>>>>>>>>> |
|
54 |
|
|
55 |
Die Variablen werden interpoliert, und linksb?ndig mit Leerzeichen auf die |
|
56 |
gew?nschte L?nge aufgef?llt. Ist der String zu lang, werden ?berz?hlige Zeichen |
|
57 |
abgeschnitten. |
|
58 |
|
|
59 |
Es ist ausserdem m?glich Daten rechtsb?ndig darzustellen, wenn der Block mit |
|
60 |
einem Leerzeichen anf?ngt. |
|
61 |
|
|
62 |
Beispiel: <<<<<< varname>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> |
|
63 |
|
|
64 |
w?rde rechtsb?ndig triggern. Wenn bei rechtsb?ndiger Ausrichtung Text |
|
65 |
abgeschnitten werden muss, wird er vom linken Ende entfernt. |
|
66 |
|
|
67 |
|
|
68 |
|
|
69 |
Einschr?nkungen |
|
70 |
--------------- |
|
71 |
|
|
72 |
Das Excelformat bis 2002 ist ein bin?res Format, und kann nicht mit vertretbarem |
|
73 |
Aufwand editiert werden. Der Templatemechanismus beschr?nkt sich daher darauf, |
|
74 |
Textstellen _exakt_ durch einen anderen Text zu ersetzen. |
|
75 |
|
|
76 |
Aus dem gleichen Grund sind die Templatekonstrukte <% if %> und <% foreach %> |
|
77 |
nicht vorhanden. Der Delimiter <% %> kommt in den Headerinformationen evtl vor, |
|
78 |
deshalb wurde auf den sichereren "<<"/">>" gewechselt. |
|
79 |
|
Auch abrufbar als: Unified diff
Optionale minimale Excel-Unterstützung für Druckvorlagen (Austausch von Platzhalter-Variablen in Excel-Dateien). Entsprechend noch für strict angepasst