diff --git a/lib/Excel/Writer/XLSX.pm b/lib/Excel/Writer/XLSX.pm index 3e67dfea..0176c131 100644 --- a/lib/Excel/Writer/XLSX.pm +++ b/lib/Excel/Writer/XLSX.pm @@ -735,6 +735,7 @@ The following methods are available through a new worksheet: activate() select() hide() + very_hidden() set_first_sheet() protect() unprotect_range() diff --git a/lib/Excel/Writer/XLSX/Package/Packager.pm b/lib/Excel/Writer/XLSX/Package/Packager.pm index 81dd6947..6d43a9ac 100644 --- a/lib/Excel/Writer/XLSX/Package/Packager.pm +++ b/lib/Excel/Writer/XLSX/Package/Packager.pm @@ -396,18 +396,24 @@ sub _write_app_file { _mkdir( $dir . '/docProps' ); - # Add the Worksheet heading pairs. - $app->_add_heading_pair( [ 'Worksheets', $self->{_worksheet_count} ] ); - - # Add the Chartsheet heading pairs. - $app->_add_heading_pair( [ 'Charts', $self->{_chartsheet_count} ] ); - # Add the Worksheet parts. + my $worksheet_count = 0; for my $worksheet ( @{ $self->{_workbook}->{_worksheets} } ) { next if $worksheet->{_is_chartsheet}; + + # Don't write/count veryHidden sheets. + next if $worksheet->{_hidden} == 2; + $app->_add_part_name( $worksheet->get_name() ); + $worksheet_count++; } + # Add the Worksheet heading pairs. + $app->_add_heading_pair( [ 'Worksheets', $worksheet_count ] ); + + # Add the Chartsheet heading pairs. + $app->_add_heading_pair( [ 'Charts', $self->{_chartsheet_count} ] ); + # Add the Chartsheet parts. for my $worksheet ( @{ $self->{_workbook}->{_worksheets} } ) { next unless $worksheet->{_is_chartsheet}; diff --git a/lib/Excel/Writer/XLSX/Workbook.pm b/lib/Excel/Writer/XLSX/Workbook.pm index 09e869dc..bd137cf2 100644 --- a/lib/Excel/Writer/XLSX/Workbook.pm +++ b/lib/Excel/Writer/XLSX/Workbook.pm @@ -2787,10 +2787,16 @@ sub _write_sheet { 'sheetId' => $sheet_id, ); - push @attributes, ( 'state' => 'hidden' ) if $hidden; - push @attributes, ( 'r:id' => $r_id ); + if ( $hidden == 1 ) { + push @attributes, ( 'state' => 'hidden' ); + } + elsif ( $hidden == 2 ) { + push @attributes, ( 'state' => 'veryHidden' ); + } + push @attributes, ( 'r:id' => $r_id ); + $self->xml_empty_tag( 'sheet', @attributes ); } diff --git a/lib/Excel/Writer/XLSX/Worksheet.pm b/lib/Excel/Writer/XLSX/Worksheet.pm index 0bb0d088..58ce3fa7 100644 --- a/lib/Excel/Writer/XLSX/Worksheet.pm +++ b/lib/Excel/Writer/XLSX/Worksheet.pm @@ -472,8 +472,9 @@ sub activate { sub hide { my $self = shift; + my $hidden = shift || 1; - $self->{_hidden} = 1; + $self->{_hidden} = $hidden; # A hidden worksheet shouldn't be active or selected. $self->{_selected} = 0; @@ -482,6 +483,20 @@ sub hide { } +############################################################################### +# +# very_hidden() +# +# Hide this worksheet. This can only be unhidden from VBA. +# +sub very_hidden { + + my $self = shift; + + $self->hide( 2 ); +} + + ############################################################################### # # set_first_sheet() diff --git a/t/regression/hide02.t b/t/regression/hide02.t new file mode 100644 index 00000000..1b9b56ae --- /dev/null +++ b/t/regression/hide02.t @@ -0,0 +1,72 @@ +############################################################################### +# +# Tests the output of Excel::Writer::XLSX against Excel generated files. +# +# Copyright 2000-2023, John McNamara, jmcnamara@cpan.org +# +# SPDX-License-Identifier: Artistic-1.0-Perl OR GPL-1.0-or-later +# + +use lib 't/lib'; +use TestFunctions qw(_compare_xlsx_files _is_deep_diff); +use strict; +use warnings; + +use Test::More tests => 1; + +############################################################################### +# +# Tests setup. +# +my $filename = 'hide02.xlsx'; +my $dir = 't/regression/'; +my $got_filename = $dir . "ewx_$filename"; +my $exp_filename = $dir . 'xlsx_files/' . $filename; + +my $ignore_members = []; +my $ignore_elements = {}; + + +############################################################################### +# +# Test the creation of a simple Excel::Writer::XLSX file. +# +use Excel::Writer::XLSX; + +my $workbook = Excel::Writer::XLSX->new( $got_filename ); + +my $worksheet1 = $workbook->add_worksheet(); +my $worksheet2 = $workbook->add_worksheet(); +my $worksheet3 = $workbook->add_worksheet(); + +$worksheet2->very_hidden(); + +$workbook->close(); + + +############################################################################### +# +# Compare the generated and existing Excel files. +# + +my ( $got, $expected, $caption ) = _compare_xlsx_files( + + $got_filename, + $exp_filename, + $ignore_members, + $ignore_elements, +); + +_is_deep_diff( $got, $expected, $caption ); + + +############################################################################### +# +# Cleanup. +# +unlink $got_filename; + +__END__ + + + diff --git a/t/regression/xlsx_files/hide02.xlsx b/t/regression/xlsx_files/hide02.xlsx new file mode 100644 index 00000000..0abc5cdc Binary files /dev/null and b/t/regression/xlsx_files/hide02.xlsx differ