X-Git-Url: https://git.creatis.insa-lyon.fr/pubgit/?p=CreaPhase.git;a=blobdiff_plain;f=octave_packages%2Fio-1.0.19%2Fodsfinfo.m;fp=octave_packages%2Fio-1.0.19%2Fodsfinfo.m;h=ed0e0d916e92e2367c9384d84ec9c18cb12d7bd6;hp=0000000000000000000000000000000000000000;hb=c880e8788dfc484bf23ce13fa2787f2c6bca4863;hpb=1705066eceaaea976f010f669ce8e972f3734b05 diff --git a/octave_packages/io-1.0.19/odsfinfo.m b/octave_packages/io-1.0.19/odsfinfo.m new file mode 100644 index 0000000..ed0e0d9 --- /dev/null +++ b/octave_packages/io-1.0.19/odsfinfo.m @@ -0,0 +1,188 @@ +## Copyright (C) 2009,2010,2011,2012 Philip Nienhuis +## +## This program is free software; you can redistribute it and/or modify it under +## the terms of the GNU General Public License as published by the Free Software +## Foundation; either version 3 of the License, or (at your option) any later +## version. +## +## This program is distributed in the hope that it will be useful, but WITHOUT +## ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or +## FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more +## details. +## +## You should have received a copy of the GNU General Public License along with +## this program; if not, see . + +## -*- texinfo -*- +## @deftypefn {Function File} [@var{filetype}] = odsfinfo (@var{filename} [, @var{reqintf}]) +## @deftypefnx {Function File} [@var{filetype}, @var{sh_names}] = odsfinfo (@var{filename} [, @var{reqintf}]) +## Query an OpenOffice_org spreadsheet file @var{filename} (with ods +## suffix) for some info about its contents. +## +## If @var{filename} is a recognizable OpenOffice.org spreadsheet file, +## @var{filetype} returns the string "OpenOffice.org Calc spreadsheet", +## or @'' (empty string) otherwise. +## +## If @var{filename} is a recognizable OpenOffice.org Calc spreadsheet +## file, optional argument @var{sh_names} contains a list (cell array) +## of sheet names contained in @var{filename}, in the order (from left +## to right) in which they occur in the sheet stack. +## +## If you omit return arguments @var{filetype} and @var{sh_names} altogether, +## odsfinfo returns the sheet names and for each sheet the actual occupied +## data ranges to the screen.The occupied cell range will have to be +## determined behind the scenes first; this can take some time. +## +## odsfinfo execution can take its time for large spreadsheets as the entire +## spreadsheet has to be parsed to get the sheet names, let alone exploring +## used data ranges. +## +## By specifying a value of 'jod', 'otk' or 'uno' for @var{reqintf} the automatic +## selection of the java interface is bypassed and the specified interface +## will be used (if at all present). +## +## Examples: +## +## @example +## exist = odsfinfo ('test4.ods'); +## (Just checks if file test4.ods is a readable Calc file) +## @end example +## +## @example +## [exist, names] = odsfinfo ('test4.ods'); +## (Checks if file test4.ods is a readable Calc file and return a +## list of sheet names) +## @end example +## +## @seealso {odsread, odsopen, ods2oct, odsclose} +## +## @end deftypefn + +## Author: Philip Nienhuis +## Created: 2009-12-17 +## Updates: +## 2010-01-03 Added functionality for JOD as well +## 2010-03-03 Fixed echo of proper number of occupied data rows +## 2010-03-18 Fixed proper echo of occupied data range +## (ah those pesky table-row-repeated & table-column-repeated attr.... :-( ) +## 2010-03-18 Separated range exploration (for OTK only yet) in separate function file +## 2010-03-20 "Beautified" output (for OTK ), used range now in more tabular form +## 2010-05-23 Updated jOpenDocument support (can also get occupied data range now) +## 2010-05-31 Added remark about delays when determining occupied data range +## 2011-03-23 Adapted to odfdom 0.8.7 (changed getXPath method call) +## 2011-05-07 Experimental UNO support added +## 2011-09-03 Normal return in case of no ODS support (empty ods struct) +## 2012-01-26 Fixed "seealso" help string +## 2012-02-25 Return occupied sheet ranges in output args +## '' Improve echo of sheet names & ranges if interactive +## 2012-03-01 Fix wrong cell refs in UNO section ("(..)" rather than "{..}" +## 2012-06-08 Support for odfdom-0.8.8-incubator + +function [ filetype, sheetnames ] = odsfinfo (filename, reqintf=[]) + + onscreen = nargout < 1; + + ods = odsopen (filename, 0, reqintf); + # If no ods support was found, odsopen will have complained. Just return here + if (isempty (ods)), return; endif + + filetype = 'OpenOffice.org Calc Document'; + + persistent adj_str; adj_str = ' '; # 30 char filler string + + # To save execution time, only proceed if sheet names are wanted + if ~(nargout == 1) + + if (strcmp (ods.xtype, 'OTK')) + # Get contents and table (= sheet) stuff from the workbook + odfcont = ods.workbook; # Local copy just in case + if (strcmp (ods.odfvsn, '0.8.7') || strfind (ods.odfvsn, "0.8.8")) + xpath = ods.workbook.getXPath; + else + xpath = ods.app.getXPath; + endif + + # Create an instance of type NODESET for use in subsequent statement + NODESET = java_get ('javax.xml.xpath.XPathConstants', 'NODESET'); + # Parse sheets ("tables") from ODS file + sheets = xpath.evaluate ("//table:table", odfcont, NODESET); + nr_of_sheets = sheets.getLength(); + sheetnames = cell (nr_of_sheets, 2); + + # Get sheet names (& optionally date row count estimate) + for ii=1:nr_of_sheets + # Check in first part of the sheet nodeset + sheetnames (ii) = sheets.item(ii-1).getTableNameAttribute (); + [ tr, lr, lc, rc ] = getusedrange (ods, ii); + if (onscreen) + printf (sprintf("%s", sheetnames{ii})); + if (tr) + printf (sprintf("%s (used range = %s:%s)", \ + adj_str(1:(30 - length (sheetnames{ii}))), \ + calccelladdress (tr, lc), calccelladdress (lr, rc))); + else + printf ("%s (empty)", adj_str(1:(30 - length (sheetnames{ii})))); + endif + printf ("\n"); + endif + if (tr) + sheetnames(ii, 2) = sprintf ("%s:%s", calccelladdress (tr, lc), calccelladdress (lr, rc)); + endif + endfor + + elseif (strcmp (ods.xtype, 'JOD')) + nr_of_sheets = ods.workbook.getSheetCount (); + sheetnames = cell (nr_of_sheets, 2); + for ii=1:nr_of_sheets + sheetnames(ii) = ods.workbook.getSheet (ii-1).getName (); + [ tr, lr, lc, rc ] = getusedrange (ods, ii); + if (onscreen) + printf (sprintf("%s", sheetnames{ii})); + if (tr) + printf (sprintf("%s (used range = %s:%s)", \ + adj_str(1:(30 - length (sheetnames{ii}))), \ + calccelladdress (tr, lc), calccelladdress (lr, rc))); + else + printf ("%s (empty)", adj_str(1:(30 - length (sheetnames{ii})))); + endif + printf ("\n"); + endif + if (tr) + sheetnames(ii, 2) = sprintf ("%s:%s", calccelladdress (tr, lc), calccelladdress (lr, rc)); + endif + endfor + + elseif (strcmp (ods.xtype, 'UNO')) + sheets = ods.workbook.getSheets (); + sheetnames = sheets.getElementNames (); # A Java object, NOT a cell array + nr_of_sheets = numel (sheetnames); + sheetnames = char (sheetnames); + for ii=1:nr_of_sheets + [ tr, lr, lc, rc ] = getusedrange (ods, ii); + if (onscreen) + printf (sprintf("%s", sheetnames{ii})); # () as it is a Java object + if (tr) + printf (sprintf ("%s (used range = %s:%s)", \ + adj_str (1:(30 - length (sheetnames{ii}))), \ + calccelladdress (tr, lc), calccelladdress (lr, rc))); + else + printf ("%s (empty)", adj_str(1:(30 - length (sheetnames{ii})))); + endif + printf ("\n"); + endif + if (tr) + sheetnames(ii, 2) = sprintf ("%s:%s", calccelladdress (tr, lc), calccelladdress (lr, rc)); + endif + + endfor + + else +# error (sprintf ("odsfinfo: unknown OpenOffice.org .ods interface - %s.", ods.xtype)); + + endif + endif + + ods = odsclose (ods); + +endfunction +