]> Creatis software - CreaPhase.git/blobdiff - octave_packages/io-1.0.19/odsfinfo.m
Add a useful package (from Source forge) for octave
[CreaPhase.git] / octave_packages / io-1.0.19 / odsfinfo.m
diff --git a/octave_packages/io-1.0.19/odsfinfo.m b/octave_packages/io-1.0.19/odsfinfo.m
new file mode 100644 (file)
index 0000000..ed0e0d9
--- /dev/null
@@ -0,0 +1,188 @@
+## Copyright (C) 2009,2010,2011,2012 Philip Nienhuis <prnienhuis at users.sf.net>
+##
+## 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 <http://www.gnu.org/licenses/>.
+
+## -*- 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 <pr.nienhuis at users.sf.net>
+## 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
+