Projekt

Allgemein

Profil

« Zurück | Weiter » 

Revision 90815a31

Von Joachim Zach vor mehr als 14 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
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