function [out] = GTHTMLtable(NAME, MAT, FORMAT, COLS, COLFORMAT, ROWS, ROWFORMAT, bgcolors, cell_align, fontcolors) % GTHTMLtable - Generate an HTML page with a table of a matrix. % % function FName = GTHTMLtable({NAME},MAT,{FORMAT},{COLS,{COLFORMAT}},{ROWS,{ROWFORMAT}},{flag,{...}},'colormap',map); % % This is intended to be a simple way to display 2D or 3D table data % with support for row and column labels. Most arguments are optional, % except for the data to be tabulated. Format specifiers are strings % using the standard printf format style. Data must be a 2D table or % cell array. Cell arrays can mix strings and numbers. % % NAME : Title for table, must be a string {OPTIONAL} % MAT : matrix to be displayed. Can be a list. % FORMAT : sprintf style format for MAT elements {OPTIONAL} % COLS : Column names for table {OPTIONAL}. List of strings or % vector of numbers. Not both. % COLFORMAT : sprintf style format for column elements {OPTIONAL} % ROWS : Row names for table {OPTIONAL}. List of strings or % vector of numbers. Not both. % ROWFORMAT : sprintf style format for row elements {OPTIONAL} % 'show' : Show output {OPTIONAL} will prevent saving of file % unless 'save' is specified. % 'save' : Save output to HTML file {OPTIONAL} if show is not % specified the save is default. % 'new' : Open a new window {DEFAULT} % 'old' : Do not open a new window {OPTIONAL} % 'colormap': define colormap to color contents, must be followed % by a colormap such as generated by hsv(10) % % Note: Labels can be either strings or numbers, not both, mixing % will cause strange behavior. % Specifying more row labels than rows will cause the row % labels to be truncated. % Specifying more column labels than columns will result in % empty columns. % Imaginary numbers are not supported. % The colormap option is only supported for numeric arrays. % % Example: % % The simplest form % [try] GTHTMLtable(rand([3 5 2]),'show'); % % Using a color map to color contents % [try] GTHTMLtable(rand([3 5 2]),'colormap',hsv(10)/2+0.5,'show'); % % with column labels % [try] GTHTMLtable('Table name',[1:4; 10:10:40],{'one' 'two' 'three' 'four'},'show'); % % with row labels and format specifiers % [try] GTHTMLtable('Table name',[1:4; 10:10:40],'%5.3f',[1:4],'%2.2i',{'one' 'two'},'ROW %s','show','old'); % % The output argument is the html code, if the save option is not specified. % [try] html = GTHTMLtable([1:4; 10:10:40],{'first' 'second' 'third' 'fourth'},[1 2],'show') % % The output argument is the html filename, if the save option is specified. % % Nested tables are supported inside cell arrays. % [try] fname = GTHTMLtable('x',{1 [2:3]' 'three' 'four'; 10 20 30 40; 'a' 'e' 'r' 'o'},{'first' 'second' 'third' 'fourth'},{'1' '2' 'three'},'show','save') % % % Author: Gus Brown in http://www.mathworks.com/matlabcentral/fileexchange/18329-display-data-as-an-html-table/content/GTHTMLtable.m % adapted by Mariano Llamedo Soria llamedom@electron.frba.utn.edu.ar % Version: 0.1 beta % Last update: 14/5/2014 % Birthdate : 21/4/2015 % Copyright 2008-2015 HTML = ''; %varargin = {[] [] [] [] [] [] [] []}; %for ii = 1:nargin, % varargin{ii} = varargin{ii}; %end; % data store count = 0; % argument counter SHOW = 0; % Show in web browser NEW = 1; % open new browser COLOR = []; % colormap to use SAVEHTML = 0; % save html to a file MATFOUND = 0; % flag to indicate if data was found COLSFOUND = 0; % flag to indicate if column labels were found ROWSFOUND = 0; % flag to indicate if row labels were found % Search through arguments % while (count1), % % show table in browser % SHOW = 1; % elseif (ischar(varargin{count}) && strcmpi(varargin{count},'save') && count>1), % % save html to a file % SAVEHTML = 1; % elseif (ischar(varargin{count}) && strcmpi(varargin{count},'new') && count>1), % % open new browser window % NEW = 1; % elseif (ischar(varargin{count}) && strcmpi(varargin{count},'old') && count>1), % % use existing browser window % NEW = 0; % elseif (ischar(varargin{count}) && strcmpi(varargin{count},'colormap') && count>1 && count=3 && count<=7 && ROWSFOUND), % % format specifier for row labels % ROWFORMAT = varargin{count}; % elseif (~ischar([varargin{count}]) && count>=2 && count<=6 && COLSFOUND && ~ROWSFOUND), % % labels for rows % ROWS = varargin{count}; % ROWSFOUND = 1; % elseif (ischar([varargin{count}]) && count>=3 && count<=5 && COLSFOUND), % % format specifier for column labels % COLFORMAT = varargin{count}; % elseif (~ischar([varargin{count}]) && count>=2 && count<=4 && MATFOUND && ~COLSFOUND), % % labels for columns % COLS = varargin{count}; % COLSFOUND = 1; % elseif (ischar([varargin{count}]) && count>=2 && count<=3 && MATFOUND), % % format specifier for data % FORMAT = varargin{count}; % elseif (~ischar([varargin{count}]) && count>=1 && count<=2 && ~MATFOUND), % % data % MAT = varargin{count}; % MATname = inputname(count); % if isnumeric(MAT), % MATmax = max(MAT(:)); % MATmin = min(MAT(:)); % MATrange = MATmax - MATmin; % end; % MATFOUND = 1; % elseif (ischar([varargin{count}]) && count ==1), % % title of table also filename % NAME = varargin{count}; % end; % % end; if( nargin < 5 ) COLFORMAT = '%s'; end if( nargin < 6 ) ROWS = []; end if( nargin < 7 ) ROWFORMAT = '%s'; end % colormap if ~isempty(COLOR), if (~isnumeric(COLOR) || size(COLOR,2)~=3) warning('GTHTMLTable:colormap','colormap must be [nx3] array'); COLOR = []; end; end; % resize MAT szmat = size(MAT); MAT = reshape(MAT,szmat(1),szmat(2),prod(szmat(3:end))); % create filename if (exist('NAME','var')), FILENAME = ['TABLE_' NAME '.html']; else FILENAME = 'TABLE.html'; end; % replace unacceptable characters in filename I = find(FILENAME=='\' | FILENAME==' ' | FILENAME=='(' | FILENAME==')' | FILENAME=='[' | FILENAME==']' | FILENAME=='*'); FILENAME(I) = '_'; % set default row format if (~exist('ROWFORMAT','var') && ~isempty(ROWS)), if (iscell(ROWS(1))), if ischar([ROWS{1}]), ROWFORMAT = '%s'; else ROWFORMAT = '%g'; end; else if length(ROWS(1))>1, ROWFORMAT = '%s'; else ROWFORMAT = '%g'; end; end; end; % set default column format if (isempty(COLFORMAT) && ~isempty(COLS)), if (iscell(COLS(1))), if ischar([COLS{1}]), COLFORMAT = '%s'; else COLFORMAT = '%g'; end; else if length(COLS(1))>1, COLFORMAT = '%s'; else COLFORMAT = '%g'; end; end; end; % set default data format if isempty(FORMAT), if ischar(MAT(1)), FORMAT = '%s'; else FORMAT = '%g'; end; end; % number of columns to be displayed if ~isempty(ROWS), % add a blank cell if row labels are present szcols = size(MAT,2)+1; else szcols = size(MAT,2); end; % HTML table HTML = [HTML sprintf('')]; % Table title row if exist('NAME','var'), HTML = [HTML sprintf('',szcols,NAME)]; end; if( nargin < 8 || isempty(bgcolors) ) bgcolors = repmat({'white'}, size(MAT)); end if( nargin < 9 || isempty(cell_align) ) cell_align = repmat({'center'}, size(MAT)); end if( nargin < 10 || isempty(fontcolors) ) fontcolors = repmat({'black'}, size(MAT)); end % cycle through pages for ipage = 1:size(MAT,3), page = MAT(:,:,ipage); if (size(MAT,3) > 1), % display page line HTML = [HTML sprintf('',szcols,MATname,ipage)]; end; % Column labels if ~isempty(COLS), HTML = [HTML sprintf('')]; if (~isempty(ROWS) && length(COLS)<=size(page,2)), HTML = [HTML sprintf('')]; end; if (iscell(COLS)), HTML = [HTML sprintf('')]; for ii = 1:size(COLS,1), omit_cols = 0; for jj = 1:size(COLS,2), if( omit_cols > 0 ) omit_cols = omit_cols -1; continue end if isstruct(COLS{ii,jj}) aux_struct = COLS{ii,jj}; HTML = [HTML sprintf([''], aux_struct.colspan, aux_struct.data )]; omit_cols = aux_struct.colspan - 1; else HTML = [HTML sprintf([''],[COLS{ii,jj}])]; end end HTML = [HTML sprintf('\n')]; end; else HTML = [HTML sprintf([''],COLS)]; end; HTML = [HTML sprintf('\n')]; end; ignore_row = []; ignore_col = []; % format data rows for ii = 1:size(page,1), HTML = [HTML sprintf('\n')]; % new row of data % add row label to line if ~isempty(ROWS), if ii<=length(ROWS), if (iscell(ROWS)), HTML = [HTML sprintf([''],[ROWS{ii}])]; else HTML = [HTML sprintf([''],ROWS(ii))]; end; else HTML = [HTML sprintf('')]; % empty row end; end; % add data if (iscell(page)), % if data is of type cell array for jj = 1:length({page{ii,:}}), % columns of data if( any( jj == ignore_col & ii == ignore_row) ) continue end % Extract data if single element cell array if iscell(page{ii,jj}) && length(page{ii,jj})==1, page{ii,jj} = page{ii,jj}{1}; end; str_col_row_span = ''; if isstruct(page{ii,jj}) aux_struct = page{ii,jj}; if( isfield(aux_struct, 'colspan') ) str_col_row_span = sprintf('COLSPAN="%d" ', aux_struct.colspan ); page{ii,jj} = aux_struct.data; ignore_col = [ignore_col, jj:(jj+aux_struct.colspan)]; ignore_row = [ignore_row, repmat(ii,1,aux_struct.colspan-1)]; elseif( isfield(aux_struct, 'rowspan') ) str_col_row_span = sprintf('ROWSPAN="%d" ', aux_struct.rowspan ); page{ii,jj} = aux_struct.data; ignore_col = [ignore_col, repmat(jj,1,aux_struct.rowspan)]; ignore_row = [ignore_row, ii:(ii+aux_struct.rowspan-1)]; end end % process cell based of content type if iscell(page{ii,jj}) && length(page{ii,jj})>1, % create a sub table tFORMAT = '%s'; % format for sting page{ii,jj} = GTHTMLtable(page{ii,jj}); elseif ischar(page{ii,jj}), tFORMAT = '%s'; % format for sting elseif length(page{ii,jj})>1, % create a sub table tFORMAT = '%s'; % format for sting page{ii,jj} = GTHTMLtable(page{ii,jj}); else if ~exist('FORMAT','var'), tFORMAT = '%g'; else tFORMAT = FORMAT; % use user format end; end; HTML = [HTML sprintf([''], str_col_row_span, bgcolors{ii,jj}, cell_align{ii,jj}, fontcolors{ii,jj}, page{ii,jj})]; % add data cell end; else % if data is no a cell array if (~isempty(COLOR) && isnumeric(MAT)), for icol = 1:size(page,2), % color cells according to value color = dec2hex( floor(255*interp1((0:1/(size(COLOR,1)-1):1),COLOR,(page(ii,icol)-MATmin)/MATrange)) ); HTML = [HTML sprintf([''],color',page(ii,icol))]; end; else HTML = [HTML sprintf([''],page(ii,:))]; end; end; HTML = [HTML sprintf('\n')]; % close data row end; end; HTML = [HTML sprintf('
%s
%s(:,:,%g)
' COLFORMAT '' COLFORMAT '
' COLFORMAT '
' ROWFORMAT '' ROWFORMAT '' tFORMAT '' FORMAT '' FORMAT '
')]; % close table % Save to html file if (SAVEHTML), FID = fopen(FILENAME,'w'); fprintf(FID,'%s',HTML); fclose(FID); disp(sprintf('HTML table saved to file %s',FILENAME,FILENAME)); out = FILENAME; % output filename else out = HTML; % output html code end; % display in browser window if (SHOW), if (NEW), web(['text://' HTML ''],'-new','-notoolbar'); else web(['text://' HTML ''],'-notoolbar'); end; end;