--- 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('<pre>'.$csvdata."\n</pre>");
+    # 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("<pre>\n".$csvdata."</pre>\n");
+        return 0;
+    }
+    print $file $csvdata;
+    close($file);
+    $r->print('<br /><br />'.
+              '<a href="'.$filename.'">Your CSV spreadsheet.</a>'."\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('<br /><br />'.
+              '<a href="'.$filename.'">Your Excel spreadsheet.</a>'."\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/<br>/ /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: <input type="checkbox" '.
-              'name="showcsv" onClick="submit()"');
-    $r->print(' checked') if ($ENV{'form.showcsv'});
-    $r->print('>');
+    $r->print(' Output as <select name="output" size="1" onClick="submit()">'.
+              "\n");
+    foreach my $mode (qw/HTML CSV EXCEL/) {
+        $r->print('<option value="'.$mode.'"');
+        if ($ENV{'form.output'} eq $mode) {
+            $r->print(' selected ');
+        } 
+        $r->print('>'.$mode.'</option>'."\n");
+    }
+    $r->print("</select>\n");
+    #
     if ($sheet->{'sheettype'} eq 'classcalc') {
         $r->print('&nbsp;Student Status: '.
                   &Apache::lonhtmlcommon::StatusOptions
@@ -2764,13 +2856,13 @@ ENDSCRIPT
     }
     #
     # Buttons to insert rows
-    $r->print(<<ENDINSERTBUTTONS);
-<br>
-<input type='button' onClick='insertrow("top");' 
-value='Insert Row Top'>
-<input type='button' onClick='insertrow("bottom");' 
-value='Insert Row Bottom'><br>
-ENDINSERTBUTTONS
+#    $r->print(<<ENDINSERTBUTTONS);
+#<br>
+#<input type='button' onClick='insertrow("top");' 
+#value='Insert Row Top'>
+#<input type='button' onClick='insertrow("bottom");' 
+#value='Insert Row Bottom'><br>
+#ENDINSERTBUTTONS
     # Print out sheet
     &outsheet($r,$sheet);
     $r->print('</form></body></html>');