changeset 6890:331a127aedc2 octave-forge

New function for exploring used data range in ODS spreadsheets.
author prnienhuis
date Thu, 18 Mar 2010 23:32:48 +0000
parents 34c40a91d7d1
children 3f4f89ead171
files main/io/inst/getusedrange.m
diffstat 1 files changed, 128 insertions(+), 0 deletions(-) [+]
line wrap: on
line diff
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/main/io/inst/getusedrange.m	Thu Mar 18 23:32:48 2010 +0000
@@ -0,0 +1,128 @@
+## Copyright (C) 2010 Philip Nienhuis, pr.nienhuis@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 2 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 Octave; see the file COPYING.  If not, see
+## <http://www.gnu.org/licenses/>.
+
+## getusedrange - get used range from ODS spreadsheet
+
+## Author: Philip Nienhuis <philip@JVC741>
+## Created: 2010-03-18 (First usable version)
+## Updates:
+## 
+
+function [ trow, lrow, lcol, rcol ] = getusedrange (ods, ii)
+
+	if (strcmp (ods.xtype, 'OTK'))
+		[ trow, lrow, lcol, rcol ] = getusedrange_otk (ods, ii);
+	else
+		error ('Only OTK interface implemented');
+	endif
+
+endfunction
+
+
+## Copyright (C) 2010 Philip Nienhuis, pr.nienhuis@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 2 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 Octave; see the file COPYING.  If not, see
+## <http://www.gnu.org/licenses/>.
+
+## getusedrange_otk - get used range from ODS spreadsheet using ODF Toolkit
+
+## Author: Philip Nienhuis <philip@JVC741>
+## Created: 2010-03-18 (First usable version)
+## Updates:
+
+function [ trow, lrow, lcol, rcol ] = getusedrange_otk (ods, ii)
+
+	odfcont = ods.workbook;		# Local copy just in case
+	xpath = ods.app.getXPath;
+	# Create an instance of type NODESET for use in subsequent statement
+	NODESET = java_get ('javax.xml.xpath.XPathConstants', 'NODESET');
+
+	# Get table-rows in sheet no. wsh. Sheet count = 1-based (!)
+	str = sprintf ("//table:table[%d]/table:table-row", ii);
+	sh = xpath.evaluate (str, odfcont, NODESET);
+	nr_of_trows = sh.getLength();
+
+	jj = 0; 										# Table row counter
+	trow = 0; drows = 0; 							# Top data row, actual data row range
+	nrows = 0; reprows = 0; 						# Scratch counter
+	rcol = 0; lcol = 1024;							# Rightmost and leftmost data column
+	while jj < nr_of_trows
+		row = sh.item(jj);
+		# Check for data rows
+		rw_char = char (row) (1:min(500, length (char (row))));
+		if (findstr ('office:value-type', rw_char))
+			++drows;
+			# Check for uppermost data row
+			if (~trow) 
+				trow = nrows + 1;
+				nrows = 0;
+			else
+				drows = drows + reprows;
+				reprows = 0;
+			endif
+
+			# Get leftmost cell column number
+			lcell = row.getFirstChild ();
+			cl_char = char (lcell);
+			if isempty (findstr ('office:value-type', cl_char))
+				lcol = min (lcol, lcell.getTableNumberColumnsRepeatedAttribute () + 1);
+			else
+				lcol = 1;
+			endif
+			
+			# if rcol is already 1024 no more exploring for rightmost column is needed
+			if ~(rcol == 1024)
+				# Get rightmost cell column number by counting....
+				rc = 0;
+				for kk=1:row.getLength()
+					lcell = row.item(kk - 1);
+					rc = rc + lcell.getTableNumberColumnsRepeatedAttribute ();
+				endfor
+				# Watch out for filler tablecells
+				if isempty (findstr ('office:value-type', char (lcell)))
+					rc = rc - lcell.getTableNumberColumnsRepeatedAttribute ();
+				endif
+				rcol = max (rcol, rc);
+			endif
+		else
+			# Check for repeated tablerows
+			nrows = nrows + row.getTableNumberRowsRepeatedAttribute ();
+			if (trow)
+				reprows = reprows + row.getTableNumberRowsRepeatedAttribute ();
+			endif
+		endif
+		++jj;
+	endwhile
+
+	if (trow)
+		lrow = trow + drows - 1;
+	else
+		# Empty sheet
+		lrow = 0; lcol = 0; rcol = 0;
+	endif
+	
+endfunction