<?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>108.bz &#187; Excel</title>
	<atom:link href="http://www.108.bz/posts/tag/excel/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.108.bz</link>
	<description>Wandering futilities...</description>
	<lastBuildDate>Fri, 27 May 2011 09:08:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.1.1</generator>
		<item>
		<title>From SQL to Excel, with Perl</title>
		<link>http://www.108.bz/posts/it/from-sql-to-excel-with-perl/</link>
		<comments>http://www.108.bz/posts/it/from-sql-to-excel-with-perl/#comments</comments>
		<pubDate>Wed, 20 Jan 2010 12:24:39 +0000</pubDate>
		<dc:creator>Giuliano</dc:creator>
				<category><![CDATA[IT]]></category>
		<category><![CDATA[Database]]></category>
		<category><![CDATA[Excel]]></category>
		<category><![CDATA[Perl]]></category>
		<category><![CDATA[SQL]]></category>
		<category><![CDATA[Swyx]]></category>

		<guid isPermaLink="false">http://www.108.bz/?p=239</guid>
		<description><![CDATA[Quite often I&#8217;m asked to pull out some information from a database, process it and produce an Excel report. Here is a minimal Perl script that carries out the task. Define the column headings and their widths. @columns array. Handle the command line parameters. There are 5 in the example, assigned to the $p_* variables. [...]]]></description>
			<content:encoded><![CDATA[<p>Quite often I&#8217;m asked to pull out some information from a database, process it and produce an Excel report.<br />
Here is a minimal Perl script that carries out the task.</p>
<ul>
<li>Define the column headings and their widths. <span style="font-family: Bitstream Vera Sans Mono,Courier New,monospace;">@columns</span> array.</li>
<li>Handle the command line parameters. There are 5 in the example, assigned to the <span style="font-family: Bitstream Vera Sans Mono,Courier New,monospace;">$p_*</span> variables.</li>
<li>Prepare the Excel worksheet, defining cell formatting, &#8230;</li>
<li>Connect to the database.</li>
<li>Prepare the query, substituting the command line parameters.</li>
<li>Fetch rows, populate the sheet.</li>
</ul>
<div class="codecolorer-container perl blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;height:300px;"><div class="perl codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">#!/usr/bin/perl </span><br />
<span style="color: #666666; font-style: italic;"># Giuliano - http://www.108.bz</span><br />
<span style="color: #000000; font-weight: bold;">use</span> strict<span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">use</span> DBI<span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">use</span> Spreadsheet<span style="color: #339933;">::</span><span style="color: #006600;">WriteExcel</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #000000; font-weight: bold;">use</span> constant C_HEADING <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span><br />
<span style="color: #000000; font-weight: bold;">use</span> constant C_WIDTH &nbsp; <span style="color: #339933;">=&gt;</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">@columns</span> <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><br />
&nbsp; &nbsp; <span style="color: #009900;">&#91;</span><span style="color: #ff0000;">'Date'</span><span style="color: #339933;">,</span> &nbsp; &nbsp; &nbsp;<span style="color: #cc66cc;">22</span> <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <br />
&nbsp; &nbsp; <span style="color: #009900;">&#91;</span><span style="color: #ff0000;">'Caller'</span><span style="color: #339933;">,</span> &nbsp; &nbsp;<span style="color: #cc66cc;">20</span> <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <br />
&nbsp; &nbsp; <span style="color: #009900;">&#91;</span><span style="color: #ff0000;">'Called'</span><span style="color: #339933;">,</span> &nbsp; &nbsp;<span style="color: #cc66cc;">20</span> <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <br />
&nbsp; &nbsp; <span style="color: #009900;">&#91;</span><span style="color: #ff0000;">'Connected'</span><span style="color: #339933;">,</span> <span style="color: #cc66cc;">11</span> <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <br />
&nbsp; &nbsp; <span style="color: #009900;">&#91;</span><span style="color: #ff0000;">'Duration'</span><span style="color: #339933;">,</span> &nbsp;<span style="color: #cc66cc;">11</span> <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <br />
&nbsp; &nbsp; <span style="color: #009900;">&#91;</span><span style="color: #ff0000;">'Reason'</span><span style="color: #339933;">,</span> &nbsp; &nbsp;<span style="color: #cc66cc;">24</span> <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <br />
&nbsp; &nbsp; <span style="color: #009900;">&#91;</span><span style="color: #ff0000;">'XferExt'</span><span style="color: #339933;">,</span> &nbsp; <span style="color: #cc66cc;">11</span> <span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <br />
&nbsp; &nbsp; <span style="color: #009900;">&#91;</span><span style="color: #ff0000;">'XferName'</span><span style="color: #339933;">,</span> &nbsp;<span style="color: #cc66cc;">22</span> <span style="color: #009900;">&#93;</span><br />
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<a href="http://perldoc.perl.org/functions/die.html"><span style="color: #000066;">die</span></a> <span style="color: #339933;">&lt;&lt;</span>EOM <span style="color: #b1b100;">unless</span> <span style="color: #339933;">@</span><span style="color: #000000; font-weight: bold;">ARGV</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">5</span><span style="color: #339933;">;</span><br />
usage<span style="color: #339933;">:</span><br />
<span style="color: #0000ff;">$0</span> year month day phonenumber file<span style="color: #339933;">.</span>xls<br />
EOM<br />
<span style="color: #b1b100;">my</span> <span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$p_year</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$p_month</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$p_day</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$p_phnumber</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$p_filename</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #339933;">@</span><span style="color: #000000; font-weight: bold;">ARGV</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$workbook</span> &nbsp; &nbsp; &nbsp; &nbsp;<span style="color: #339933;">=</span> Spreadsheet<span style="color: #339933;">::</span><span style="color: #006600;">WriteExcel</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">new</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$p_filename</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$sheet</span> &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span style="color: #339933;">=</span> <span style="color: #0000ff;">$workbook</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">add_worksheet</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Data&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$default_format</span> &nbsp;<span style="color: #339933;">=</span> <span style="color: #0000ff;">$workbook</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">add_format</span><span style="color: #009900;">&#40;</span>num_format <span style="color: #339933;">=&gt;</span> <span style="color: #ff0000;">'@'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #0000ff;">$default_format</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">set_font</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'Verdana'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #0000ff;">$default_format</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">set_border</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$bold_format</span> &nbsp; &nbsp; <span style="color: #339933;">=</span> <span style="color: #0000ff;">$workbook</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">add_format</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #0000ff;">$bold_format</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">set_font</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'Verdana'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #0000ff;">$bold_format</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">set_bold</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #0000ff;">$bold_format</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">set_border</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #0000ff;">$sheet</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">write</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">,</span><span style="color: #0000ff;">$_</span><span style="color: #339933;">,</span><span style="color: #0000ff;">$columns</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">$_</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#91;</span>C_HEADING<span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$bold_format</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">..</span><span style="color: #0000ff;">$#columns</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #0000ff;">$sheet</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">set_column</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$_</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$_</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$columns</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">$_</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#91;</span>C_WIDTH<span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">..</span><span style="color: #0000ff;">$#columns</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$dbh</span> <span style="color: #339933;">=</span> DBI<span style="color: #339933;">-&gt;</span><span style="color: #006600;">connect</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">'dbi:Sybase:server=dsnname;database=dnbame'</span><span style="color: #339933;">,</span><span style="color: #ff0000;">'username'</span><span style="color: #339933;">,</span><span style="color: #ff0000;">'password'</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">or</span> <a href="http://perldoc.perl.org/functions/die.html"><span style="color: #000066;">die</span></a><span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$sth</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$dbh</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">prepare</span><span style="color: #009900;">&#40;</span><span style="color: #339933;">&lt;&lt;</span>EOQ<br />
SELECT IpPbxCDR<span style="color: #339933;">.</span>StartTime<span style="color: #339933;">,</span> IpPbxCDR<span style="color: #339933;">.</span>OriginationNumber<span style="color: #339933;">,</span> IpPbxCDR<span style="color: #339933;">.</span>CalledNumber<span style="color: #339933;">,</span> IpPbxCDR<span style="color: #339933;">.</span>DestinationNumber<span style="color: #339933;">,</span> DATEDIFF<span style="color: #009900;">&#40;</span>ss<span style="color: #339933;">,</span> IpPbxCDR<span style="color: #339933;">.</span>StartTime<span style="color: #339933;">,</span> IpPbxCDR<span style="color: #339933;">.</span>EndTime<span style="color: #009900;">&#41;</span> AS Duration<span style="color: #339933;">,</span> IpPbxCDR<span style="color: #339933;">.</span>DisconnectReason<span style="color: #339933;">,</span> IpPbxCDR_1<span style="color: #339933;">.</span>CalledNumber AS XferExt<span style="color: #339933;">,</span> <br />
IpPbxCDR_1<span style="color: #339933;">.</span>CalledName AS XferName<br />
FROM IpPbxCDR LEFT OUTER JOIN<br />
IpPbxCDR AS IpPbxCDR_1 ON IpPbxCDR<span style="color: #339933;">.</span>TransferredToCallId <span style="color: #339933;">=</span> IpPbxCDR_1<span style="color: #339933;">.</span>CallId<br />
WHERE <span style="color: #009900;">&#40;</span>IpPbxCDR<span style="color: #339933;">.</span>CalledNumber LIKE <span style="color: #ff0000;">'$p_phnumber'</span><span style="color: #009900;">&#41;</span> AND<br />
<span style="color: #009900;">&#40;</span>MONTH<span style="color: #009900;">&#40;</span>IpPbxCDR<span style="color: #339933;">.</span>StartTime<span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$p_month</span><span style="color: #009900;">&#41;</span> AND<br />
<span style="color: #009900;">&#40;</span>YEAR<span style="color: #009900;">&#40;</span>IpPbxCDR<span style="color: #339933;">.</span>StartTime<span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$p_year</span><span style="color: #009900;">&#41;</span> AND <br />
<span style="color: #009900;">&#40;</span>DAY<span style="color: #009900;">&#40;</span>IpPbxCDR<span style="color: #339933;">.</span>StartTime<span style="color: #009900;">&#41;</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$p_day</span><span style="color: #009900;">&#41;</span><br />
ORDER BY IpPbxCDR<span style="color: #339933;">.</span>StartTime<br />
EOQ<br />
<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #0000ff;">$sth</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">execute</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">my</span> <span style="color: #0000ff;">$row</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">while</span> <span style="color: #009900;">&#40;</span> <span style="color: #0000ff;">$row</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$sth</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">fetchrow_arrayref</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">$sheet</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">write_string</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$i</span><span style="color: #339933;">,</span><span style="color: #0000ff;">$_</span><span style="color: #339933;">,</span><span style="color: #0000ff;">$row</span><span style="color: #339933;">-&gt;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">$_</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$default_format</span><span style="color: #009900;">&#41;</span> <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">0</span><span style="color: #339933;">..</span><span style="color: #0000ff;">$#</span><span style="color: #0000ff;">$row</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #0000ff;">$i</span><span style="color: #339933;">++;</span><br />
<span style="color: #009900;">&#125;</span><br />
<br />
<span style="color: #0000ff;">$sheet</span><span style="color: #339933;">-&gt;</span><span style="color: #006600;">activate</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<br />
<a href="http://perldoc.perl.org/functions/exit.html"><span style="color: #000066;">exit</span></a><span style="color: #339933;">;</span></div></div>
<p>Actually, the example does something useful. It connects to a Swyx Call Detail Record database, selecting phone calls placed to a given number on a given day. The generated report also contains call duration and transfer status/destination, if any. Here&#8217;s what it looks like (some data has been obfuscated, to protect the innocent &#8211; click to see all the columns):</p>
<p><a href="http://www.108.bz/wp-content/uploads/2010/01/callreport.gif"><img class="alignnone size-medium wp-image-246" title="Call Report" src="http://www.108.bz/wp-content/uploads/2010/01/callreport_cut.gif" alt="" width="579" height="83" /></a></p>
<p>And here&#8217;s the command that produces it:</p>
<div class="codecolorer-container text blackboard" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;width:550px;"><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">./callreport.pl 2010 1 19 '+39%10123123' x.xls</div></div>
 <img src="http://www.108.bz/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=239" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://www.108.bz/posts/it/from-sql-to-excel-with-perl/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

