[LON-CAPA-cvs] cvs: loncom /interface/statistics lonproblemstatistics.pm

matthew lon-capa-cvs@mail.lon-capa.org
Wed, 26 Mar 2003 17:03:41 -0000


matthew		Wed Mar 26 12:03:41 2003 EDT

  Modified files:              
    /loncom/interface/statistics	lonproblemstatistics.pm 
  Log:
  &output_excel which writes the data to an Excel file.
  
  
Index: loncom/interface/statistics/lonproblemstatistics.pm
diff -u loncom/interface/statistics/lonproblemstatistics.pm:1.43 loncom/interface/statistics/lonproblemstatistics.pm:1.44
--- loncom/interface/statistics/lonproblemstatistics.pm:1.43	Wed Mar 26 11:26:35 2003
+++ loncom/interface/statistics/lonproblemstatistics.pm	Wed Mar 26 12:03:41 2003
@@ -1,6 +1,6 @@
 # The LearningOnline Network with CAPA
 #
-# $Id: lonproblemstatistics.pm,v 1.43 2003/03/26 16:26:35 matthew Exp $
+# $Id: lonproblemstatistics.pm,v 1.44 2003/03/26 17:03:41 matthew Exp $
 #
 # Copyright Michigan State University Board of Trustees
 #
@@ -35,6 +35,7 @@
 use Apache::lonhtmlcommon;
 use Apache::loncoursedata;
 use Apache::lonstatistics;
+use Spreadsheet::WriteExcel;
 
 #######################################################
 #######################################################
@@ -229,12 +230,20 @@
         } elsif ($show eq 'ungrouped') {
             &output_html_ungrouped($r);
         }
+    } elsif ($output_mode eq 'excel') {
+        $r->print("<h2>Preparing Excel Spreadsheet</h2>");
+        &output_excel($r);
     } else {
         $r->print("<h1>Not implemented</h1>");
     }
     return;
 }
 
+###############################################
+###############################################
+
+###############################################
+###############################################
 sub output_html_grouped_by_sequence {
     my ($r) = @_;
     #$r->print(&ProblemStatisticsLegend());
@@ -280,7 +289,6 @@
     return;
 }
 
-
 ###############################################
 ###############################################
 
@@ -441,6 +449,124 @@
 
 ###############################################
 ###############################################
+sub output_excel {
+    my ($r) = @_;
+    my $filename = '/prtspool/'.
+        $ENV{'user.name'}.'_'.$ENV{'user.domain'}.'_'.
+            time.'_'.rand(1000000000).'.xls';
+    #
+    my $excel_workbook = undef;
+    my $excel_sheet = undef;
+    #
+    my $rows_output = 0;
+    my $cols_output = 0;
+    #
+    # Create sheet
+    $excel_workbook = Spreadsheet::WriteExcel->new('/home/httpd'.$filename);
+    #
+    # Check for errors
+    if (! defined($excel_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 ;
+    }
+    #
+    # The excel 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.
+    $excel_workbook->set_tempdir($Apache::lonnet::tmpdir);
+    #
+    # Add a worksheet
+    my $sheetname = $ENV{'course.'.$ENV{'request.course.id'}.'.description'};
+    if (length($sheetname) > 31) {
+        $sheetname = substr($sheetname,0,31);
+    }
+    $excel_sheet = $excel_workbook->addworksheet($sheetname);
+    #
+    # Put the course description in the header
+    $excel_sheet->write($rows_output,$cols_output++,
+                   $ENV{'course.'.$ENV{'request.course.id'}.'.description'});
+    $cols_output += 3;
+    #
+    # Put a description of the sections listed
+    my $sectionstring = '';
+    my @Sections = @Apache::lonstatistics::SelectedSections;
+    if (scalar(@Sections) > 1) {
+        if (scalar(@Sections) > 2) {
+            my $last = pop(@Sections);
+            $sectionstring = "Sections ".join(', ',@Sections).', and '.$last;
+        } else {
+            $sectionstring = "Sections ".join(' and ',@Sections);
+        }
+    } else {
+        if ($Sections[0] eq 'all') {
+            $sectionstring = "All sections";
+        } else {
+            $sectionstring = "Section ".$Sections[0];
+        }
+    }
+    $excel_sheet->write($rows_output,$cols_output++,$sectionstring);
+    $cols_output += scalar(@Sections);
+    #
+    # Put the date in there too
+    $excel_sheet->write($rows_output,$cols_output++,
+                        'Compiled on '.localtime(time));
+    #
+    $rows_output++; 
+    $cols_output=0;
+    #
+    # Add the headers
+    my @Header = ("Container","Title","Part","#Stdnts","Tries","Mod",
+                  "Mean","#YES","#yes","%Wrng","DoDiff",
+                  "S.D.","Skew.");#,"D.F.1st","D.F.2nd");
+    foreach (@Header) {
+        $excel_sheet->write($rows_output,$cols_output++,$_);
+    }
+    $rows_output++;
+    #
+    # Write the data
+    foreach my $sequence (&Apache::lonstatistics::Sequences_with_Assess()) {
+        next if ($sequence->{'num_assess'}<1);
+        foreach my $resource (@{$sequence->{'contents'}}) {
+            next if ($resource->{'type'} ne 'assessment');
+            foreach my $part (@{$resource->{'parts'}}) {
+                $cols_output=0;
+                my ($num,$tries,$mod,$mean,$Solved,$solved,$DegOfDiff,$STD,
+                    $SKEW) = &Apache::loncoursedata::get_problem_statistics
+                        (undef,$resource->{'symb'},$part,
+                         $ENV{'request.course.id'});
+                #
+                if (!defined($part) || $part eq '') {
+                    $part = ' ';
+                }
+                my $wrongpercent = 0;
+                if (defined($num) && $num > 0) {
+                    $wrongpercent=int(10*100*($num-$Solved+$solved)/$num)/10;
+                }
+                foreach ($sequence->{'title'},$resource->{'title'},$part,
+                         $num,$tries,$mod,$mean,$Solved,$solved,$wrongpercent,
+                         $DegOfDiff,$STD,$SKEW) {
+                    $excel_sheet->write($rows_output,$cols_output++,$_);
+                }
+                $rows_output++;
+            }
+        }
+    }
+    #
+    # Write the excel file
+    $excel_workbook->close();
+    # Tell the user where to get their excel file
+    $r->print('<br />'.
+              '<a href="'.$filename.'">Your Excel spreadsheet.</a>'."\n");
+    $r->rflush();
+    return;
+}
+
+
+
 sub statistics_html_table_data {
     my ($resource,$part,$num,$tries,$mod,$mean,$Solved,$solved,$wrongpercent,
         $DegOfDiff,$STD,$SKEW,$show_part) = @_;