Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: разработка для Web > excel файлы на сайт


Автор: ежик 6.11.2006, 10:15
Задача такая:

на сай надо выложить данные которые хранятся в MS excel 
эти данные выкладываются автоматически

пробовал написать сценарий:
Код

#!/usr/bin/perl

use Spreadsheet::ParseExcel;
use Spreadsheet::ParseExcel::FmtUnicode;
my $oExcel = new Spreadsheet::ParseExcel;
my $oFmtR = Spreadsheet::ParseExcel::FmtUnicode->new(Unicode_Map => "CP1251");
my $oBook = $oExcel->Parse('Excel/dokladn.xls',$oFmtR);
my($iR, $iC, $oWkS, $oWkC);
for(my $iSheet=0; $iSheet < $oBook->{SheetCount} ; $iSheet++) {
  $oWkS = $oBook->{Worksheet}[$iSheet];
  $merged_r = [];
  $merged_c = [];
  $not_print = [];
  foreach my $line (@{$oWkS->{'MergedArea'}}) {
   $r_s=$line->[0];
   $c_s=$line->[1];
   $r_e=$line->[2];
   $c_e=$line->[3];
   $i=1;
   foreach (1..100) {
   if($r_e > $r_s){
    if ($r_s+$i > $r_e) {
    last;
    }
   }
   if ($c_e > $c_s) {
    if ($c_s+$i > $c_e) {
    last;
    }
   }
   $row_plus= $r_e > $r_s ? $r_s+$i : $r_s;
   $col_plus= $c_e > $c_s ? $c_s+$i : $c_s;
   push(@$not_print,[$row_plus,$col_plus]);
   undef($row_plus);
   undef($col_plus);
   $i++;
   }
   if ($r_e > $r_s) {
   push(@$merged_r,[$r_s,$c_s,($r_e-$r_s+1)]);
   }
   if ($c_e > $c_s) {
   push(@$merged_c,[$r_s,$c_s,($c_e-$c_s+1)]);
   }

  }

  $text .= qq~<table cellspacing="0" cellpadding="0" border="0">\n~;
  for(my $iR = $oWkS->{MinRow}; defined $oWkS->{MaxRow} && $iR <= $oWkS->{MaxRow} ; $iR++) {
   $text .= qq~<tr>\n~;
   for(my $iC = $oWkS->{MinCol}; defined $oWkS->{MaxCol} && $iC <= $oWkS->{MaxCol} ; $iC++) {

    foreach my $retr (@$merged_r) {
     $rowspan = ' rowspan="'.$retr->[2].'"' if ($iR == $retr->[0] && $iC == $retr->[1]);
    }
    foreach my $retc (@$merged_c) {
     $colspan = ' colspan="'.$retc->[2].'"' if ($iR == $retc->[0] && $iC == $retc->[1]);
    }
    foreach my $retn (@$not_print) {
     $nou = 1 if ($iR == $retn->[0] && $iC == $retn->[1]);
    }
    unless (defined($nou)){
     $oWkC = $oWkS->{Cells}[$iR][$iC];

     if(defined($oWkC)){
     my $oFont = $oWkC->{Format}->{Font};
     $text .= qq~<td class="exel~.$iSheet.$iR.$iC.qq~"~.(defined($rowspan) ? $rowspan : '').(defined($colspan) ? $colspan : '').qq~>\n~;
     $css .= '.exel'.$iSheet.$iR.$iC.qq~{\n
text-align: ~.($oWkC->{Format}->{AlignH} == 0 ? 'Left': $oWkC->{Format}->{AlignH} == 1 ? 'Left': $oWkC->{Format}->{AlignH} == 2 ? 'Center': $oWkC->{Format}->{AlignH} == 3 ? 'right':'left').qq~;
vertical-align: ~.($oWkC->{Format}->{AlignV} == 0 ? 'top': $oWkC->{Format}->{AlignV} == 1 ? 'middle': $oWkC->{Format}->{AlignV} == 2 ? 'bottom': $oWkC->{Format}->{AlignV} == 3 ? 'bottom':'bottom').qq~;
font-size: ~.$oFont->{Height}.qq~pt;
~.($oFont->{Italic} == 1 ? "font-style: italic;\n": '').($oFont->{Bold} == 1 ? "font-weight: bold;\n": '').qq~
color: #~.Spreadsheet::ParseExcel->ColorIdxToRGB($oFont->{Color}).qq~;
background-color: #~.Spreadsheet::ParseExcel->ColorIdxToRGB($oWkC->{Format}->{Fill}->[1]).qq~;
border-top: ~.$oWkC->{Format}->{BdrStyle}->[0].qq~px solid #000;
border-right: ~.$oWkC->{Format}->{BdrStyle}->[1].qq~px solid #000;
border-bottom: ~.$oWkC->{Format}->{BdrStyle}->[2].qq~px solid #000;
border-left: ~.$oWkC->{Format}->{BdrStyle}->[3].qq~px solid #000;
~.($oWkC->{Format}->{Hidden} == 1 ? "display: none;\n": '').qq~}\n~;
     $text .= "".(defined($oWkC->Value)? $oWkC->Value: '')."\n"; # Formatted Value
     $text .= qq~</td>\n~;
     }
     else {
     $text .= qq~<td>\n</td>\n~;
     }
    }
    undef($nou);
    undef($colspan);
    undef($rowspan);
   }
   $text .= qq~</tr>\n~;
  }
  $text .= qq~</table>\n~;

 }
open (my $OUT,">big.thml");
print $OUT qq~<style media="screen" type="text/css">\n~.$css."</style>\n";
print $OUT $text;
close($OUT);


получается но конечные файлы получаются большие

может ктонить подскажет в какой формат перегнать файлы чтобы можнобыло выкладывать на сайт
просто выкладывать на сайт сами excel файлы немогу

Автор: Grig 7.11.2006, 01:48
Попробуй в формат CSV. Там разделитель - точка с запятой.
А потом перегоняй файл в массив..

Автор: ежик 7.11.2006, 06:47
а как по поводу Русских букв

Автор: Grig 9.11.2006, 09:30
А с русскими буквами - порядок.
У тебя какой оффис стоит?

Автор: ежик 9.11.2006, 09:37
где делают 2000 exel
а у меня 2003

Автор: Usya 9.11.2006, 22:20
Цитата

Попробуй в формат CSV. Там разделитель - точка с запятой.

Не все так просто. Grig, а как ты поступишь с объединенными ячейками?
Цитата

может ктонить подскажет в какой формат перегнать файлы чтобы можнобыло выкладывать на сайт

Формат можешь сам придумать на базе CSV (идея, которую предложил, Grig неплохая), но ты сам реши, что стоит и как оставлять данные в файлах, а что можно и не учитывать при конвертировании...
Цитата

а как по поводу Русских букв 

ежик, с русскими буквами при конвертировании, если установлены соответствующие модули (в твоем коде они учтены), я проблем не встречал (по крайней мере сейчас не помню). Может быть другая проблема - с форматированными данными...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)