<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>j2ee.pl - związani z javą &#187; xpath</title>
	<atom:link href="http://j2ee.pl/tag/xpath/feed/" rel="self" type="application/rss+xml" />
	<link>http://j2ee.pl</link>
	<description>związani z Javą</description>
	<lastBuildDate>Mon, 24 Aug 2009 11:45:27 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Dodatkowe dwa słowa o Apache XMLBeans i HSSF POI</title>
		<link>http://j2ee.pl/2007/12/17/dodatkowe-dwa-slowa-o-apache-xmlbeans-i-hssf-poi/</link>
		<comments>http://j2ee.pl/2007/12/17/dodatkowe-dwa-slowa-o-apache-xmlbeans-i-hssf-poi/#comments</comments>
		<pubDate>Mon, 17 Dec 2007 09:01:12 +0000</pubDate>
		<dc:creator>Michał Porzożyński</dc:creator>
				<category><![CDATA[Inne biblioteki]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[excel]]></category>
		<category><![CDATA[xml]]></category>
		<category><![CDATA[xpath]]></category>

		<guid isPermaLink="false">http://j2ee.pl/2007/12/17/dodatkowe-dwa-slowa-o-apache-xmlbeans-i-hssf-poi/</guid>
		<description><![CDATA[Na naszym blogu możesz znaleźć dwa artykuły mojego autorstwa o Apache XMLBeans oraz Apache POI. Ostatnio miałem okazję ponownie pracować  z tymi bibliotekami, napotykając przy tym na dwa problemy, których rozwiązanie nie okazało się dla mnie jakoś specjalnie proste (mimo, że być powinno ;)). Dzisiaj będzie o wykorzystaniu wyrażeń XPath w XMLBeans oraz o [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://j2ee.pl/wp-content/uploads/2007/12/apache.png" alt="ASF" align="left" />Na naszym blogu możesz znaleźć dwa artykuły mojego autorstwa o <a href="http://j2ee.pl/2007/10/20/apache-xmlbeans-bindowanie-danych-xml-do-typow-java/">Apache XMLBeans</a> oraz <a href="http://j2ee.pl/2007/06/28/wstep-do-apache-poi-hssf-dostep-do-plikow-ms-excel-w-javie/">Apache POI</a>. Ostatnio miałem okazję ponownie pracować  z tymi bibliotekami, napotykając przy tym na dwa problemy, których rozwiązanie nie okazało się dla mnie jakoś specjalnie proste (mimo, że być powinno ;)). Dzisiaj będzie o wykorzystaniu wyrażeń XPath w XMLBeans oraz o przeliczaniu formuł zaszytych w arkuszach Excel. Tematy trochę jakby nie mają nic ze sobą wspólnego, ale przecież to tylko dodatkowe dwa słowa ;)<br />
<span id="more-110"></span></p>
<h3>XMLBeans i XPath</h3>
<p>XMLBeans posiada fajną funkcjonalność, pozwalająca na użycie języka <a href="http://en.wikipedia.org/wiki/XPath">XPath</a> do wyciągania z obiektu klasy XmlObject (klasy do której &#8220;wparsowany&#8221; jest nasz xml) potrzebnych nam danych.  Z tak zwanego <em>out of the box,</em> nasza biblioteka pozwala na tworzenie jedynie prostych zapytań XPath (np: //book). Jeżeli chcemy wykorzystać trochę bardziej złożoną semantykę (powiedzmy: //book[@title='EJB3 in Action'])  powinniśmy spiąć XMLBeans z biblioteką <a href="http://saxon.sourceforge.net/">Saxon</a> (procesor XSLT i XQuery). Takie spięcie polega jedynie na dodaniu do naszej aplikacji bibliotek saxon.jar, saxon-dom.jar (znajdują się w jednym archiwum ściąganym ze strony saxona) oraz xbean_xpath.jar (dostępnego razem z dystrybucją XMLBeans). Jeśli środowisko jest już przygotowane, wystarczy wywołać na obiekcie XmlObject metodę selectPath podając w jej parametrze wyrażenie XPath. W odpowiedzi powinniśmy dostać tablicę obiektów XmlObject z interesującymi nas danymi.</p>
<pre class="prettyprint">XmlObject[] data = BookDocument.selectPath("//book[@title='EJB3 in Action']");</pre>
<p>W moim przypadku coś poszło jednak nie tak. Mimo, że sprawdziłem poprawność wyrażenia XPath, zmienna <em>data </em>była nullem. Zajęło mi trochę czasu aby problem rozwiązać. Okazuje się że Apache XMLBeans w wersji 2.3.0 współpracuje tylko z bardzo konkretną wersją biblioteki Saxon: wersją 8.8. Ja posiadałem najnowszego Saxon&#8217;a oznaczonego numerem 9.0. W taki oto sposób straciłem 45 minut i przed tą stratą postanowiłem ostrzec Was :)</p>
<h3>Apache HSSF POI i przeliczanie formuł w Excelu</h3>
<p>O problemie przeliczania formuł w arkuszach MS Excel pisałem już wcześniej. Wtedy była to tylko wzmianka o tym, że istnieje specjalna klasa służąca właśnie do tego (<strong>HSSFFormulaEvaluator</strong>) i że nie udało mi się jej użyć ;) Od wersji 3.0.1 klasa ta już jest niedostępna, a problem pozostał. No właśnie&#8230; może przybliżę problem: powiedzmy, że istnieje arkusz Excela, który posiada tylko trzy pola: A1 &#8211; liczba, A2 &#8211; liczba, A3 = A2 &#8211; A1. Z jakiegoś tylko tobie znanego powodu, za pomocą Apache POI chcesz zmienić liczbę w polu A2 na jakąś inną.. lepszą ;) Robisz wszystko co potrzeba, zapisujesz arkusz na dysku, otwierasz go w Excelu i zauważasz, że formuła w polu A3 ciągle pokazuje wyliczenia z poprzednimi wartościami.  Co należy zrobić aby formuła została przeliczona ? Należy zapamiętać formułę w stringu, nadać komórce typ: HSSFCell.CELL_TYPE_FORMULA oraz zapisać ponownie do komórki zapamiętaną wcześniej formułę. Rozwiązanie proste jak budowa cepa, tym bardziej więc dziwi, że działa tak, jakbyśmy tego chcieli ;)</p>
<pre class="prettyprint">String formula = cell.getCellFormula();
cell.setCellType(HSSFCell.CELL_TYPE_FORMULA);
cell.setCellFormula(formula);</pre>
<p>To by było na tyle. Obiecuję, że już nie będę Was męczył zagadnieniami związanymi z POI i XMLBeans :)</p>
]]></content:encoded>
			<wfw:commentRss>http://j2ee.pl/2007/12/17/dodatkowe-dwa-slowa-o-apache-xmlbeans-i-hssf-poi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
