--- loncom/interface/statistics/lonsurveyreports.pm 2005/03/01 22:04:55 1.3 +++ loncom/interface/statistics/lonsurveyreports.pm 2005/03/10 00:23:15 1.4 @@ -1,6 +1,6 @@ # The LearningOnline Network with CAPA # -# $Id: lonsurveyreports.pm,v 1.3 2005/03/01 22:04:55 matthew Exp $ +# $Id: lonsurveyreports.pm,v 1.4 2005/03/10 00:23:15 matthew Exp $ # # Copyright Michigan State University Board of Trustees # @@ -34,6 +34,7 @@ use Apache::loncoursedata(); use Apache::lonstatistics; use Apache::lonlocal; use Apache::lonstathelpers; +use Spreadsheet::WriteExcel; use HTML::Entities(); use Time::Local(); @@ -125,7 +126,12 @@ sub BuildSurveyReportsPage { $r->rflush(); my %Data = &Apache::lonstathelpers::get_problem_data ($resource->src); - &make_HTML_report($r,$current_problem,\%Data,\@Students); + if ($ENV{'form.output'} eq 'HTML' || + ! defined($ENV{'form.output'})) { + &make_HTML_report($r,$current_problem,\%Data,\@Students); + } elsif ($ENV{'form.output'} eq 'Excel') { + &make_Excel_report($r,$current_problem,\%Data,\@Students); + } } $r->print('
'); } else { @@ -253,6 +259,122 @@ sub Compile_Student_Answers { ######################################################### ######################################################### ## +## make_Excel_report +## +######################################################### +######################################################### +sub make_Excel_report { + my ($r,$problem,$problem_data,$students) = @_; + &Compile_Student_Answers($problem,$problem_data,$students); + my ($workbook,$filename,$format) = &Apache::loncommon::create_workbook($r); + if (! defined($workbook)) { return '';} + $r->print(''); + my $worksheet = $workbook->addworksheet('Survey Reports'); + # + my $rows_output=0; + $worksheet->write($rows_output++,0, + $ENV{'course.'.$ENV{'request.course.id'}.'.description'}, + $format->{'h1'}); + $rows_output++; + # + my $resource = $problem->{'resource'}; + $worksheet->write($rows_output++,0,$resource->compTitle,$format->{'h2'}); + foreach my $partid (@{$resource->parts}) { + my @response_ids = $resource->responseIds($partid); + my @response_types = $resource->responseType($partid); + for (my $i=0;$i<=$#response_ids;$i++) { + my $respid = $response_ids[$i]; + my $resptype = $response_types[$i]; + my $data = $problem->{'responsedata'}->{$partid}->{$respid}; + my $cols_output=0; + $worksheet->write($rows_output,$cols_output++, + $resource->part_display($partid),$format->{'h3'}); + $worksheet->write($rows_output,$cols_output++, + 'Response '.$respid.', '.$resptype, + $format->{'h3'}); + $rows_output++; + if (exists($data->{'responses'}) && + ref($data->{'responses'}) eq 'ARRAY') { + my $warned_about_size = 0; + foreach my $data (@{$data->{'responses'}}) { + if (length($data) > 255 && ! $warned_about_size) { + $r->print('

'. + &mt('[_1]:[_2] responses to [_3] may be too long to fit Excel spreadsheet.', + $resource->compTitle, + $resource->part_display($partid), + $respid). + '

'); + $r->rflush(); + $warned_about_size=1; + } + $worksheet->write($rows_output++,0,$data); + } + } elsif (exists($data->{'foil_count'}) && + exists($data->{'foil_responses'})) { + my $respdata = $problem_data->{$partid.'.'.$respid}; + my @rowdata = ('Foil Name','Foil Text','Option', + 'Frequency'); + $worksheet->write_row($rows_output++,0, + \@rowdata,$format->{'h4'}); + # + my @foils = sort(keys(%{$data->{'foil_responses'}})); + foreach my $foilid (@foils) { + my $foil_count = $data->{'foil_count'}->{$foilid}; + my $foiltext = $respdata->{'_Foils'}->{$foilid}->{'text'}; + my $foilname = $respdata->{'_Foils'}->{$foilid}->{'name'}; + $foiltext = &HTML::Entities::decode($foilname); + my $cols_output=0; + $worksheet->write($rows_output,$cols_output++,$foilname); + $worksheet->write($rows_output,$cols_output++,$foiltext); + my $option_start_col = $cols_output; + # + foreach my $option (sort(@{$respdata->{'_Options'}})){ + $cols_output= $option_start_col; + $worksheet->write($rows_output,$cols_output++, + $option); + my $count= + $data->{'foil_responses'}->{$foilid}->{$option}; + $worksheet->write($rows_output,$cols_output++,$count); + $rows_output++; + } + } + } elsif (exists($data->{'_count'}) && + exists($data->{'foil_values'}) && + exists($data->{'map'})) { + my $respdata = $problem_data->{$partid.'.'.$respid}; + my @rowdata = ('Foil Name','Foil Text','Frequency'); + $worksheet->write_row($rows_output++,0, + \@rowdata,$format->{'h4'}); + foreach my $value (sort(keys(%{$data->{'foil_values'}}))) { + undef(@rowdata); + my $foilid = $data->{'map'}->{$value}; + push(@rowdata,$respdata->{'_Foils'}->{$foilid}->{'name'}); + push(@rowdata,$respdata->{'_Foils'}->{$foilid}->{'text'}); + push(@rowdata,$data->{'foil_values'}->{$value}); + $worksheet->write_row($rows_output++,0,\@rowdata); + } + } + $rows_output++; + } #response ids + } # partids + $workbook->close(); + $r->print('

'. + &mt('Your Excel spreadsheet.'). + '

'."\n"); + $r->print(''); + $r->rflush(); + return; +} + +######################################################### +######################################################### +## ## make_HTML_report ## ######################################################### @@ -344,7 +466,6 @@ sub make_HTML_report { my $foilid = $data->{'map'}->{$value}; my $foiltext = $ProblemData->{$partid.'.'.$respid}->{'_Foils'}->{$foilid}->{'text'}; my $foilname = $ProblemData->{$partid.'.'.$respid}->{'_Foils'}->{$foilid}->{'name'}; - $sum = $value * $data->{'foil_values'}->{$value}; $tmp .= ''. ''.$foilname.''. ''.$foiltext.''. @@ -390,6 +511,19 @@ sub CreateInterface { ## ## Environment variable initialization my $Str = ''; + my $output_selector = ''.$/; $Str .= &Apache::lonhtmlcommon::breadcrumbs (undef,'Student Submission Reports'); $Str .= '

'; @@ -397,6 +531,7 @@ sub CreateInterface { $Str .= ''; $Str .= ''.&mt('Sections').''; $Str .= ''.&mt('Enrollment Status').''; + $Str .= ''.&mt('Output Format').''; $Str .= ''."\n"; # $Str .= ''."\n"; @@ -407,6 +542,8 @@ sub CreateInterface { $Str .= &Apache::lonhtmlcommon::StatusOptions(undef,undef,5); $Str .= ''; # + $Str .= ''.$output_selector.''; + # $Str .= ''."\n"; $Str .= ''."\n"; #