<?xml version="1.0" encoding="ISO-8859-1"?>

<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
	<channel>
		<title>Forum du club des développeurs et IT Pro - Blogs - joel.drigo</title>
		<link>https://www.developpez.net/forums/blogs/327969-joel-drigo/</link>
		<description>Developpez.com, le Club des Développeurs et IT Pro</description>
		<language>fr</language>
		<lastBuildDate>Sat, 25 Apr 2026 15:40:19 GMT</lastBuildDate>
		<generator>vBulletin</generator>
		<ttl>15</ttl>
		<image>
			<url>https://forum.developpez.be/images/misc/rss.jpg</url>
			<title>Forum du club des développeurs et IT Pro - Blogs - joel.drigo</title>
			<link>https://www.developpez.net/forums/blogs/327969-joel-drigo/</link>
		</image>
		<item>
			<title>Tiens un autre tip Apache POI...</title>
			<link>https://www.developpez.net/forums/blogs/327969-joel-drigo/b1800/tiens-tip-apache-poi/</link>
			<pubDate>Tue, 13 Dec 2016 00:05:12 GMT</pubDate>
			<description><![CDATA[C'est une feature ce coup-ci,...]]></description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">C'est une feature ce coup-ci, mais pas documentée, au sujet des Hyperlink de type fichier (HyperlinkType.FILE). On trouve bien un exemple, mais le lien est un nom simple. J'ai dû chercher pendant un moment avant de comprendre comment faire pour indiquer un chemin relatif (au fichier Excel) obtenu à partir d'une variable de type Path (ou File, éventuellement) ?<br />
<br />
On serait tenté d'écrire, avec une variable path de type Path, contenant un chemin relatif :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">hyperlink.setAdresse(path.toString());</pre>
</div>Et ça ne fonctionnerait pas sur Windows... on obtiendrait une exception d'URI malformée. Parce que s'il y a des antislashes dans l'adresse, POI considère le chemin comme étant celui d'une URI, et utilise la classe URI pour le vérifier, d'où l'exception.<br />
<br />
Pour un chemi absolu, on peut écrire :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">hyperlink.setAdress(path.toUri().toString());</pre>
</div>Mais évidemment, pour un chemin relatif, cela ne fonctionne pas (enfin si, mais ça fait la résolution du chemin absolu par rapport au chemin par défaut, et donc pas forcément avec le chemin du fichier Excel), et on obtient donc un lien absolu. Il suffit de remplacer les antislashes par des slashes :<br />
<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code  :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:36px;">hyperlink.setAdress(path.toString().replace('\\','/');</pre>
</div>et hop, un chemin relatif...</blockquote>

]]></content:encoded>
			<dc:creator>joel.drigo</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/327969-joel-drigo/b1800/tiens-tip-apache-poi/</guid>
		</item>
		<item>
			<title><![CDATA[Tip Apache POI Excel XLSX : avoir plusieurs lignes dans le prompt d'un DataValidation]]></title>
			<link>https://www.developpez.net/forums/blogs/327969-joel-drigo/b1733/tip-apache-poi-excel-xlsx-plusieurs-lignes-prompt-d-datavalidation/</link>
			<pubDate>Mon, 14 Nov 2016 16:55:31 GMT</pubDate>
			<description><![CDATA[Comme j'ai un peu galéré pour...]]></description>
			<content:encoded><![CDATA[<blockquote class="blogcontent restore">Comme j'ai un peu galéré pour trouver comment mettre plusieurs lignes dans le prompt d'un validateur Excel en xlsx, l'API ne le gérant pas directement (ça sent le bogue), je vous partage le truc que j'ai trouvé en décortiquant un xlsx pour le faire : il suffit de remplacer le caractère \n dans la chaîne par _x000a_.<br />
<br />
J'ai analysé les différents whitespaces (du moins les classiques sauf l'espace (\n, \n, \t, \b, \f)) et fait une petite méthode de conversion :<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code java :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br /></div></td><td valign="top"><pre style="margin: 0"><span style="color: #0000ff;">public</span> <span style="color: #0000ff;">class</span> Utils <span class="br0">&#123;</span>
&nbsp;
	<span style="color: #0000ff;">public</span> <span style="color: #0000ff;">static</span> String escapeWhitespaces<span class="br0">&#40;</span>String string<span class="br0">&#41;</span> <span class="br0">&#123;</span> 
&nbsp;
		<span style="color: #0000ff;">final</span> StringBuilder sb = <span style="color: #0000ff;">new</span> StringBuilder<span class="br0">&#40;</span>string.length<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>;
		<span style="color: #0000ff;">for</span><span class="br0">&#40;</span><span style="color: #0000ff;">int</span> i=<span style="color: #cc66cc;">0</span>; i&lt;string.length<span class="br0">&#40;</span><span class="br0">&#41;</span>; i++<span class="br0">&#41;</span> <span class="br0">&#123;</span>
			<span style="color: #0000ff;">char</span> c = string.charAt<span class="br0">&#40;</span>i<span class="br0">&#41;</span>;
			<span style="color: #0000ff;">if</span><span class="br0">&#40;</span> c!=<span style="color: #FF0000;">' '</span> &amp;&amp; Character.isWhitespace<span class="br0">&#40;</span>c<span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
				<span style="color: #0000ff;">switch</span><span class="br0">&#40;</span>c<span class="br0">&#41;</span> <span class="br0">&#123;</span> 
				<span style="color: #0000ff;">case</span> <span style="color: #FF0000;">'<span style="color: #800000;">\f</span>'</span>: <span style="color: #808080;">// ff render a female sign if escaped or make doc corrupted if not</span>
				<span style="color: #0000ff;">case</span> <span style="color: #FF0000;">'<span style="color: #800000;">\b</span>'</span>: <span style="color: #808080;">// backspace make doc corrupted (escaped or not)</span>
					<span style="color: #0000ff;">break</span>;
				<span style="color: #0000ff;">case</span> <span style="color: #FF0000;">'<span style="color: #800000;">\t</span>'</span>: <span style="color: #808080;">// render a single space (not escaped) or nothing (escaped) </span>
					sb.append<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;    &quot;</span><span class="br0">&#41;</span>;
					<span style="color: #0000ff;">break</span>; 
				<span style="color: #0000ff;">case</span> <span style="color: #FF0000;">'<span style="color: #800000;">\r</span>'</span>: <span style="color: #808080;">// cr render nothing if escaped or space if escaped </span>
					<span style="color: #0000ff;">if</span> <span class="br0">&#40;</span> !equals<span class="br0">&#40;</span>string,i+<span style="color: #cc66cc;">1</span>,<span style="color: #FF0000;">'<span style="color: #800000;">\n</span>'</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span> <span style="color: #808080;">// (except if followed with \n)</span>
						sb.append<span class="br0">&#40;</span><span style="color: #FF0000;">' '</span><span class="br0">&#41;</span>; <span style="color: #808080;">// replace with a char</span>
					<span class="br0">&#125;</span>
					<span style="color: #0000ff;">break</span>;
				<span style="color: #0000ff;">case</span> <span style="color: #FF0000;">'<span style="color: #800000;">\n</span>'</span>: <span style="color: #808080;">// lf</span>
					sb.append<span class="br0">&#40;</span>String.format<span class="br0">&#40;</span><span style="color: #FF0000;">&quot;_x%04x_&quot;</span>,<span class="br0">&#40;</span><span style="color: #0000ff;">int</span><span class="br0">&#41;</span>c<span class="br0">&#41;</span><span class="br0">&#41;</span>;
					<span style="color: #0000ff;">break</span>;
				<span style="color: #0000ff;">default</span>:
					<span style="color: #808080;">// ignore others</span>
				<span class="br0">&#125;</span>
			<span class="br0">&#125;</span>
			<span style="color: #0000ff;">else</span> <span class="br0">&#123;</span>
				sb.append<span class="br0">&#40;</span>c<span class="br0">&#41;</span>;
			<span class="br0">&#125;</span>
		<span class="br0">&#125;</span> 
		<span style="color: #0000ff;">return</span> sb.toString<span class="br0">&#40;</span><span class="br0">&#41;</span>;
	<span class="br0">&#125;</span>
&nbsp;
	<span style="color: #0000ff;">private</span> <span style="color: #0000ff;">static</span> <span style="color: #0000ff;">boolean</span> equals<span class="br0">&#40;</span>String string, <span style="color: #0000ff;">int</span> i, <span style="color: #0000ff;">char</span> c<span class="br0">&#41;</span> <span class="br0">&#123;</span>
		<span style="color: #0000ff;">if</span> <span class="br0">&#40;</span> i&lt;string.length<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
			<span style="color: #0000ff;">return</span> c==string.charAt<span class="br0">&#40;</span>i<span class="br0">&#41;</span>;
		<span class="br0">&#125;</span>
		<span style="color: #0000ff;">return</span> <span style="color: #0000ff;">false</span>;
	<span class="br0">&#125;</span>
&nbsp;
<span class="br0">&#125;</span></pre></td></tr></table></pre>
</div><br />
Exemple d'appel (une validation avec combo de choix):<br />
<div class="bbcode_container">
	<table width="100%" border="0" cellspacing="0" cellpadding="0"><tr>
	<td style="border: 0; padding: 0; text-align: left">Code java :</td>
	<td style="border: 0; padding: 0; text-align: right"><a href="#" onclick="return ano_selectionnerCode(this);">Sélectionner tout</a> -
	<a href="#" onclick="return ano_etendreCode(this);">Visualiser dans une fenêtre à part</a></td></tr></table>
	<pre class="bbcode_code" style="height:204px;"><table cellspacing="0" cellpadding="0"><tr><td valign="top" width="33"><div style="border: 1px dashed gray; padding-left: 5px; padding-right: 5px; margin-right: 5px; text-align: right; font-family: monospace">1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br /></div></td><td valign="top"><pre style="margin: 0">&nbsp;
<span style="color: #0000ff;">final</span> CellRangeAddressList regions = <span style="color: #0000ff;">new</span> CellRangeAddressList<span class="br0">&#40;</span>firstRowNum, lastRowNum, colNum, colNum<span class="br0">&#41;</span>;
<span style="color: #0000ff;">final</span> DataValidation dataValidation;
<span style="color: #0000ff;">if</span><span class="br0">&#40;</span> sheet <span style="color: #0000ff;">instanceof</span> HSSFSheet <span class="br0">&#41;</span> <span class="br0">&#123;</span>
	<span style="color: #0000ff;">final</span> DVConstraint constraint = DVConstraint.createExplicitListConstraint<span class="br0">&#40;</span>values<span class="br0">&#41;</span>;
	dataValidation = <span style="color: #0000ff;">new</span> HSSFDataValidation<span class="br0">&#40;</span>regions, constraint<span class="br0">&#41;</span>;
<span class="br0">&#125;</span>
<span style="color: #0000ff;">else</span> <span style="color: #0000ff;">if</span> <span class="br0">&#40;</span> sheet <span style="color: #0000ff;">instanceof</span> XSSFSheet <span class="br0">&#41;</span> <span class="br0">&#123;</span>
	<span style="color: #0000ff;">final</span> XSSFDataValidationHelper dvHelper = <span style="color: #0000ff;">new</span> XSSFDataValidationHelper<span class="br0">&#40;</span><span class="br0">&#40;</span>XSSFSheet<span class="br0">&#41;</span> sheet<span class="br0">&#41;</span>;
	<span style="color: #0000ff;">final</span> XSSFDataValidationConstraint constraint = <span class="br0">&#40;</span>XSSFDataValidationConstraint<span class="br0">&#41;</span> dvHelper.createExplicitListConstraint<span class="br0">&#40;</span>values<span class="br0">&#41;</span>;
	dataValidation = <span class="br0">&#40;</span>XSSFDataValidation<span class="br0">&#41;</span>dvHelper.createValidation<span class="br0">&#40;</span>constraint, regions<span class="br0">&#41;</span>;
<span class="br0">&#125;</span>
<span style="color: #0000ff;">else</span> <span class="br0">&#123;</span>
	<span style="color: #0000ff;">throw</span> <span style="color: #0000ff;">new</span> IllegalStateException<span class="br0">&#40;</span><span class="br0">&#41;</span>;
<span class="br0">&#125;</span>
<span style="color: #0000ff;">if</span> <span class="br0">&#40;</span> prompt!=<span style="color: #0000ff;">null</span> <span class="br0">&#41;</span> <span class="br0">&#123;</span>
&nbsp;
	<span style="color: #0000ff;">final</span> String message;
	<span style="color: #0000ff;">if</span> <span class="br0">&#40;</span> sheet <span style="color: #0000ff;">instanceof</span> XSSFSheet <span class="br0">&#41;</span> <span class="br0">&#123;</span>
		message = Utils.escapeWhitespaces<span class="br0">&#40;</span>prompt.message<span class="br0">&#41;</span>;
	<span class="br0">&#125;</span>
	<span style="color: #0000ff;">else</span> <span class="br0">&#123;</span>
		message = prompt.message;
	<span class="br0">&#125;</span>
	dataValidation.createPromptBox<span class="br0">&#40;</span>prompt.title, message<span class="br0">&#41;</span>;
	dataValidation.setShowPromptBox<span class="br0">&#40;</span><span style="color: #0000ff;">true</span><span class="br0">&#41;</span>; 
&nbsp;
<span class="br0">&#125;</span>
sheet.addValidationData<span class="br0">&#40;</span>dataValidation<span class="br0">&#41;</span>;</pre></td></tr></table></pre>
</div></blockquote>

]]></content:encoded>
			<dc:creator>joel.drigo</dc:creator>
			<guid isPermaLink="true">https://www.developpez.net/forums/blogs/327969-joel-drigo/b1733/tip-apache-poi-excel-xlsx-plusieurs-lignes-prompt-d-datavalidation/</guid>
		</item>
	</channel>
</rss>
