--- loncom/interface/Attic/lonspreadsheet.pm 2002/11/05 15:00:27 1.133 +++ loncom/interface/Attic/lonspreadsheet.pm 2002/11/06 20:00:13 1.134 @@ -1,5 +1,5 @@ # -# $Id: lonspreadsheet.pm,v 1.133 2002/11/05 15:00:27 matthew Exp $ +# $Id: lonspreadsheet.pm,v 1.134 2002/11/06 20:00:13 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -62,6 +62,8 @@ use GDBM_File; use HTML::TokeParser; use Apache::lonhtmlcommon; use Apache::loncoursedata; +use Apache::File(); +use Spreadsheet::WriteExcel; # # Caches for coursewide information # @@ -1370,13 +1372,86 @@ sub outsheet_csv { @Values = (); } # - $r->print('
'.$csvdata."\n
"); + # Write the CSV data to a file and serve up a link + # + my $filename = '/prtspool/'. + $ENV{'user.name'}.'_'.$ENV{'user.domain'}.'_'. + time.'_'.rand(1000000000).'.csv'; + my $file; + unless ($file = Apache::File->new('>'.'/home/httpd'.$filename)) { + $r->log_error("Couldn't open $filename for output $!"); + $r->print("Problems occured in writing the csv file. ". + "This error has been logged. ". + "Please alert your LON-CAPA administrator."); + $r->print("
\n".$csvdata."
\n"); + return 0; + } + print $file $csvdata; + close($file); + $r->print('

'. + 'Your CSV spreadsheet.'."\n"); # return 1; } sub outsheet_excel { my ($sheet,$r) = @_; + my $filename = '/prtspool/'. + $ENV{'user.name'}.'_'.$ENV{'user.domain'}.'_'. + time.'_'.rand(1000000000).'.xls'; + &Apache::lonnet::logthis("spreadsheet:filename = ".$filename); + my $workbook = Spreadsheet::WriteExcel->new('/home/httpd'.$filename); + if (! defined($workbook)) { + $r->log_error("Error creating excel spreadsheet $filename: $!"); + $r->print("Problems creating new Excel file. ". + "This error has been logged. ". + "Please alert your LON-CAPA administrator"); + return 0; + } + # + # The spreadsheet stores temporary data in files, then put them + # together. If needed we should be able to disable this (memory only). + # The temporary directory must be specified before calling 'addworksheet'. + # File::Temp is used to determine the temporary directory. + $workbook->set_tempdir('/home/httpd/perl/tmp'); + # + # Determine the name to give the worksheet + my $sheetname; + if ($sheet->{'sheettype'} eq 'classcalc') { + $sheetname = 'Main'; + } elsif ($sheet->{'sheettype'} eq 'studentcalc') { + $sheetname = $sheet->{'uname'}.'@'.$sheet->{'udom'}; + } elsif ($sheet->{'sheettype'} eq 'assesscalc') { + $sheetname = $sheet->{'uname'}.'@'.$sheet->{'udom'}.' assessment'; + } + my $worksheet = $workbook->addworksheet($sheetname); + #################################### + # Prepare to output rows + #################################### + my @Rows = &sort_indicies($sheet); + # + # Loop through the rows and output them one at a time + my $rows_output=0; + foreach my $rownum (@Rows) { + my ($rowlabel,@rowdata) = &get_row($sheet,$rownum); + my $cols_output = 0; + my $label = &format_excel_rowlabel($rowlabel); + $worksheet->write($rows_output,$cols_output++,$label); + if (ref($label)) { + $cols_output = (scalar(@$label)); + } + foreach my $cell (@rowdata) { + $worksheet->write($rows_output,$cols_output++, + $cell->{'value'}); + } + $rows_output++; + } + # + $workbook->close(); + # Okay, the spreadsheet is taken care of, so give the user a link. + $r->print('

'. + 'Your Excel spreadsheet.'."\n"); + return 1; } sub outsheet_xml { @@ -1385,11 +1460,14 @@ sub outsheet_xml { sub outsheet { my ($r,$sheet)=@_; - if (exists($ENV{'form.showcsv'})) { + if (! exists($ENV{'form.output'})) { + $ENV{'form.output'} = 'HTML'; + } + if (lc($ENV{'form.output'}) eq 'csv') { &outsheet_csv($sheet,$r); -# } elsif (exists($ENV{'form.excel'})) { -# &outsheet_excel($sheet,$r); -# } elsif (exists($ENV{'form.xml'})) { + } elsif (lc($ENV{'form.output'}) eq 'excel') { + &outsheet_excel($sheet,$r); +# } elsif (lc($ENV{'form.output'}) eq 'xml' ) { # &outsheet_xml($sheet,$r); } else { &outsheet_html($sheet,$r); @@ -1533,6 +1611,8 @@ sub makenewsheet { $sheet->{'cnum'} = $ENV{'course.'.$ENV{'request.course.id'}.'.num'}; $sheet->{'cdom'} = $ENV{'course.'.$ENV{'request.course.id'}.'.domain'}; $sheet->{'chome'} = $ENV{'course.'.$ENV{'request.course.id'}.'.home'}; + $sheet->{'coursedesc'} = $ENV{'course.'.$ENV{'request.course.id'}. + 'description'}; $sheet->{'uhome'} = &Apache::lonnet::homeserver($uname,$udom); # # @@ -1776,7 +1856,7 @@ sub format_csv_rowlabel { return '"'.$result.'"'; } -sub format_plain_rowlabel { +sub format_excel_rowlabel { my $rowlabel = shift; return '' if ($rowlabel eq ''); my ($type,$labeldata) = split(':',$rowlabel,2); @@ -1787,8 +1867,10 @@ sub format_plain_rowlabel { $result = $title; } elsif ($type eq 'student') { my ($sname,$sdom,$fullname,$section,$id) = split(':',$labeldata); - $result = '"'. - join('","',($sname,$sdom,$fullname,$section,$id).'"'); + $section = '' if (! defined($section)); + $id = '' if (! defined($id)); + my @Data = ($sname,$sdom,$fullname,$section,$id); + $result = \@Data; } elsif ($type eq 'parameter') { $labeldata =~ s/
/ /g; $result = $labeldata; @@ -2500,6 +2582,9 @@ sub handler { if (! exists($ENV{'form.Status'})) { $ENV{'form.Status'} = 'Active'; } + if (! exists($ENV{'form.output'})) { + $ENV{'form.output'} = 'HTML'; + } # Check this server my $loaderror=&Apache::lonnet::overloaderror($r); if ($loaderror) { return $loaderror; } @@ -2753,10 +2838,17 @@ ENDSCRIPT $r->print('>'); # # CSV format checkbox (classcalc sheets only) - $r->print(' Output CSV format: print(' checked') if ($ENV{'form.showcsv'}); - $r->print('>'); + $r->print(' Output as \n"); + # if ($sheet->{'sheettype'} eq 'classcalc') { $r->print(' Student Status: '. &Apache::lonhtmlcommon::StatusOptions @@ -2764,13 +2856,13 @@ ENDSCRIPT } # # Buttons to insert rows - $r->print(< - -
-ENDINSERTBUTTONS +# $r->print(< +# +#
+#ENDINSERTBUTTONS # Print out sheet &outsheet($r,$sheet); $r->print('');