--- loncom/interface/Attic/lonspreadsheet.pm 2002/11/21 18:56:36 1.145 +++ loncom/interface/Attic/lonspreadsheet.pm 2002/12/02 16:39:30 1.151 @@ -1,5 +1,5 @@ # -# $Id: lonspreadsheet.pm,v 1.145 2002/11/21 18:56:36 matthew Exp $ +# $Id: lonspreadsheet.pm,v 1.151 2002/12/02 16:39:30 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -965,11 +965,9 @@ sub templaterow { 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z', 'a','b','c','d','e','f','g','h','i','j','k','l','m', 'n','o','p','q','r','s','t','u','v','w','x','y','z') { - my $fm=$sheet->{'f'}->{'template_'.$_}; - $fm=~s/[\'\"]/\&\#34;/g; push(@cols,{ name => 'template_'.$_, - formula => $fm, - value => $fm }); + formula => $sheet->{'f'}->{'template_'.$_}, + value => $sheet->{'f'}->{'template_'.$_} }); } return ($rowlabel,@cols); } @@ -993,10 +991,8 @@ sub outrowassess { 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z', 'a','b','c','d','e','f','g','h','i','j','k','l','m', 'n','o','p','q','r','s','t','u','v','w','x','y','z') { - my $fm=$sheet->{'f'}->{$_.$n}; - $fm=~s/[\'\"]/\&\#34;/g; push(@cols,{ name => $_.$n, - formula => $fm, + formula => $sheet->{'f'}->{$_.$n}, value => $sheet->{'values'}->{$_.$n}}); } return ($rowlabel,@cols); @@ -1019,10 +1015,8 @@ sub outrow { 'N','O','P','Q','R','S','T','U','V','W','X','Y','Z', 'a','b','c','d','e','f','g','h','i','j','k','l','m', 'n','o','p','q','r','s','t','u','v','w','x','y','z') { - my $fm=$sheet->{'f'}->{$_.$n}; - $fm=~s/[\'\"]/\&\#34;/g; push(@cols,{ name => $_.$n, - formula => $fm, + formula => $sheet->{'f'}->{$_.$n}, value => $sheet->{'values'}->{$_.$n}}); } return ($rowlabel,@cols); @@ -1257,9 +1251,17 @@ sub html_editable_cell { if ($value =~ /^\s*$/ ) { $value = '#'; } + &Apache::lonnet::logthis($name.' formula = '.$formula) if ($formula); + $formula =~ s//\>/g; + $formula =~ s/\&/\&/g; + $formula =~ s/\"/\"/g; + $formula =~ s/\'/\"/g; $formula =~ s/\n/\\n/gs; - $result .= ''.$value.''; + &Apache::lonnet::logthis($name.' formula = '.$formula) if ($formula); + $result .= "".$value.""; + &Apache::lonnet::logthis('result = '.$result) if ($formula); return $result; } @@ -1317,7 +1319,7 @@ END # Print out template row #################################### my ($rowlabel,@rowdata) = &get_row($sheet,'-'); - my $row_html = ''.&format_html_rowlabel($rowlabel).''; + my $row_html = ''.&format_html_rowlabel($sheet,$rowlabel).''; my $num_cols_output = 0; foreach my $cell (@rowdata) { if ($num_cols_output++ < $num_uneditable) { @@ -1335,7 +1337,7 @@ END # Print out summary/export row #################################### my ($rowlabel,@rowdata) = &get_row($sheet,'0'); - $row_html = ''.&format_html_rowlabel($rowlabel).''; + $row_html = ''.&format_html_rowlabel($sheet,$rowlabel).''; $num_cols_output = 0; foreach my $cell (@rowdata) { if ($num_cols_output++ < 26) { @@ -1381,11 +1383,11 @@ END ''; # if ($sheet->{'sheettype'} eq 'classcalc') { - $row_html.=''.&format_html_rowlabel($rowlabel).''; + $row_html.=''.&format_html_rowlabel($sheet,$rowlabel).''; # Output links for each student? # Nope, that is already done for us in format_html_rowlabel (for now) } elsif ($sheet->{'sheettype'} eq 'studentcalc') { - $row_html.=''.&format_html_rowlabel($rowlabel); + $row_html.=''.&format_html_rowlabel($sheet,$rowlabel); $row_html.= '
'. ''; } elsif ($sheet->{'sheettype'} eq 'assesscalc') { - $row_html.=''.&format_html_rowlabel($rowlabel).''; + $row_html.=''.&format_html_rowlabel($sheet,$rowlabel).''; } # my $shown_cells = 0; @@ -1469,7 +1471,7 @@ sub outsheet_csv { foreach my $rownum (@Rows) { my ($rowlabel,@rowdata) = &get_row($sheet,$rownum); next if ($rowlabel =~ /^\s*$/); - push (@Values,&format_csv_rowlabel($rowlabel)); + push (@Values,&format_csv_rowlabel($sheet,$rowlabel)); foreach my $cell (@rowdata) { push (@Values,'"'.$cell->{'value'}.'"'); } @@ -1530,10 +1532,9 @@ A link to the spreadsheet will be availa END $r->rflush(); my $starttime = time; - foreach (keys(%f)) { - next if ($_!~/^A(\d+)/ || $1 == 0 || ($f{$_}=~/^[!~-]/)); + foreach my $rownum (&sort_indicies($sheet)) { $count++; - my ($sname,$sdom) = split(':',$f{$_}); + my ($sname,$sdom) = split(':',$f{'A'.$rownum}); my $student_excel_worksheet=$workbook->addworksheet($sname.'@'.$sdom); # Create a new spreadsheet my $studentsheet = &makenewsheet($sname,$sdom,'studentcalc',undef); @@ -1639,7 +1640,7 @@ sub export_sheet_as_excel { # Write the summary/export row # #################################### my ($rowlabel,@rowdata) = &get_row($sheet,'0'); - my $label = &format_excel_rowlabel($rowlabel); + my $label = &format_excel_rowlabel($sheet,$rowlabel); $cols_output = 0; $worksheet->write($rows_output,$cols_output++,$label); foreach my $cell (@rowdata) { @@ -1656,7 +1657,7 @@ sub export_sheet_as_excel { my ($rowlabel,@rowdata) = &get_row($sheet,$rownum); next if ($rowlabel =~ /^[\s]*$/); $cols_output = 0; - my $label = &format_excel_rowlabel($rowlabel); + my $label = &format_excel_rowlabel($sheet,$rowlabel); if ( ! $ENV{'form.showall'} && $sheet->{'sheettype'} =~ /^(studentcalc|classcalc)$/) { my $row_is_empty = 1; @@ -2053,18 +2054,22 @@ sub parmval { ## Row label formatting routines ## ################################################################## sub format_html_rowlabel { + my $sheet = shift; my $rowlabel = shift; return '' if ($rowlabel eq ''); my ($type,$labeldata) = split(':',$rowlabel,2); my $result = ''; if ($type eq 'symb') { - my ($symb,$uname,$udom,$mapid,$resid,$title) = split(':',$labeldata); + my ($symb,$mapid,$resid,$title) = split(':',$labeldata); $symb = &Apache::lonnet::unescape($symb); $result = ''.$title.''; } elsif ($type eq 'student') { my ($sname,$sdom,$fullname,$section,$id) = split(':',$labeldata); + if ($fullname =~ /^\s*$/) { + $fullname = $sname.'@'.$sdom; + } $result =''; $result.=$section.' '.$id." ".$fullname.''; @@ -2077,12 +2082,13 @@ sub format_html_rowlabel { } sub format_csv_rowlabel { + my $sheet = shift; my $rowlabel = shift; return '' if ($rowlabel eq ''); my ($type,$labeldata) = split(':',$rowlabel,2); my $result = ''; if ($type eq 'symb') { - my ($symb,$uname,$udom,$mapid,$resid,$title) = split(':',$labeldata); + my ($symb,$mapid,$resid,$title) = split(':',$labeldata); $symb = &Apache::lonnet::unescape($symb); $result = $title; } elsif ($type eq 'student') { @@ -2098,12 +2104,13 @@ sub format_csv_rowlabel { } sub format_excel_rowlabel { + my $sheet = shift; my $rowlabel = shift; return '' if ($rowlabel eq ''); my ($type,$labeldata) = split(':',$rowlabel,2); my $result = ''; if ($type eq 'symb') { - my ($symb,$uname,$udom,$mapid,$resid,$title) = split(':',$labeldata); + my ($symb,$mapid,$resid,$title) = split(':',$labeldata); $symb = &Apache::lonnet::unescape($symb); $result = $title; } elsif ($type eq 'student') { @@ -2215,7 +2222,7 @@ sub get_student_rowlabels { my %assesslist; foreach ('Feedback','Evaluation','Tutoring','Discussion') { my $symb = '_'.lc($_); - $assesslist{$symb} = join(':',('symb',$symb,$uname,$udom,0,0,$_)); + $assesslist{$symb} = join(':',('symb',$symb,0,0,$_)); } # while (my ($key,$srcf) = each(%course_db)) { @@ -2228,8 +2235,7 @@ sub get_student_rowlabels { &Apache::lonnet::declutter($course_db{'map_id_'.$mapid}). '___'.$resid.'___'.&Apache::lonnet::declutter($srcf); $assesslist{$symb}='symb:'.&Apache::lonnet::escape($symb).':' - .$uname.':'.$udom.':'.$mapid.':'.$resid.':'. - $course_db{'title_'.$id}; + .$mapid.':'.$resid.':'.$course_db{'title_'.$id}; } } untie(%course_db); @@ -2317,7 +2323,8 @@ sub updatestudentassesssheet { $sheet->{'maxrow'} = 0; my %existing=(); # Now obsolete rows - while (my ($cell, $formula) = each (%f)) { + foreach my $cell (keys(%f)) { + my $formula = $f{$cell}; next if ($cell !~ /^A(\d+)/); $sheet->{'maxrow'} = $1 if ($1 > $sheet->{'maxrow'}); my ($usy,$ufn)=split(/__&&&\__/,$formula); @@ -2983,6 +2990,8 @@ sub handler { function celledit(cellname,cellformula) { var edit_text = ''; + // cellformula may contain less-than and greater-than symbols, so + // we need to escape them? edit_text +='Cell Edit Window'; edit_text += '
'; edit_text += '

Cell '+cellname+'

'; @@ -3216,13 +3225,18 @@ ENDSCRIPT } $r->print('>'.$mode.''."\n"); } - if ($sheet->{'sheettype'} eq 'classcalc') { - $r->print('\n"); - } +# +# Mulit-sheet excel takes too long and does not work at all for large +# classes. Future inclusion of this option may be possible with the +# Spreadsheet::WriteExcel::Big and speed improvements. +# +# if ($sheet->{'sheettype'} eq 'classcalc') { +# $r->print('\n"); +# } $r->print("\n"); # if ($sheet->{'sheettype'} eq 'classcalc') {