[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) = @_;