apache-poi/content/components/poi-ruby.html
2025-09-11 22:56:08 +01:00

669 lines
23 KiB
HTML

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<META http-equiv="Content-Type" content="text/html; charset=UTF-8">
<meta content="Apache Forrest" name="Generator">
<meta name="Forrest-version" content="0.9">
<meta name="Forrest-skin-name" content="pelt">
<title>POI Ruby Bindings</title>
<link type="text/css" href="../skin/basic.css" rel="stylesheet">
<link media="screen" type="text/css" href="../skin/screen.css" rel="stylesheet">
<link media="print" type="text/css" href="../skin/print.css" rel="stylesheet">
<link type="text/css" href="../skin/profile.css" rel="stylesheet">
<script src="../skin/getBlank.js" language="javascript" type="text/javascript"></script><script src="../skin/getMenu.js" language="javascript" type="text/javascript"></script><script src="../skin/fontsize.js" language="javascript" type="text/javascript"></script>
<link rel="shortcut icon" href="../images/favicon.ico">
</head>
<body onload="init()">
<script type="text/javascript">ndeSetTextSize();</script>
<div id="top">
<!--+
|breadtrail
+-->
<div class="breadtrail">
<a href="https://www.apache.org">Apache Software Foundation</a> &gt; <a href="https://poi.apache.org">Apache POI</a><script src="../skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script>
</div>
<!--+
|header
+-->
<div class="header">
<!--+
|start group logo
+-->
<div class="grouplogo">
<a href="https://www.apache.org"><img class="logoImage" alt="Apache Software Foundation" src="../images/asflogo_horizontal_color.svg" title="The Apache Software Foundation is a cornerstone of the modern Open Source software ecosystem &ndash; supporting some of the most widely used and important software solutions powering today's Internet economy."></a>
</div>
<!--+
|end group logo
+-->
<!--+
|start Project Logo
+-->
<div class="projectlogo">
<a href="https://poi.apache.org"><img class="logoImage" alt="Apache POI" src="../images/project-header.png" title="Apache POI is well-known in the Java field as a library for reading and writing Microsoft Office file formats, such as Excel, PowerPoint, Word, Visio, Publisher and Outlook. It supports both the older (OLE2) and new (OOXML - Office Open XML) formats."></a>
</div>
<!--+
|end Project Logo
+-->
<!--+
|start Search
+-->
<div class="searchbox">
<form action="https://www.google.com/search" method="get" class="roundtopsmall">
<input value="poi.apache.org" name="sitesearch" type="hidden"><input onFocus="getBlank (this, 'Search the site with google');" size="25" name="q" id="query" type="text" value="Search the site with google">&nbsp;
<input name="Search" value="Search" type="submit">
</form>
</div>
<!--+
|end search
+-->
<!--+
|start Tabs
+-->
<ul id="tabs">
<li>
<a class="unselected" href="../index.html">Home</a>
</li>
<li>
<a class="unselected" href="../help/index.html">Help</a>
</li>
<li>
<a class="unselected" href="../components/index.html">Component APIs</a>
</li>
<li>
<a class="unselected" href="../devel/index.html">Getting Involved</a>
</li>
</ul>
<!--+
|end Tabs
+-->
</div>
</div>
<div id="main">
<div id="publishedStrip">
<!--+
|start Subtabs
+-->
<div id="level2tabs"></div>
<!--+
|end Endtabs
+-->
<script type="text/javascript"><!--
document.write("Last Published: " + document.lastModified);
// --></script>
</div>
<!--+
|breadtrail
+-->
<div class="breadtrail">
&nbsp;
</div>
<!--+
|start Menu, mainarea
+-->
<!--+
|start Menu
+-->
<div id="menu">
<div onclick="SwitchMenu('menu_1.1', '../skin/')" id="menu_1.1Title" class="menutitle">Overview</div>
<div id="menu_1.1" class="menuitemgroup">
<div class="menuitem">
<a href="../index.html">Home</a>
</div>
<div class="menuitem">
<a href="../download.html">Download</a>
</div>
<div class="menuitem">
<a href="../changes.html">Changelog</a>
</div>
<div class="menuitem">
<a href="../apidocs/index.html">Javadocs</a>
</div>
<div class="menuitem">
<a href="../text-extraction.html">Text Extraction</a>
</div>
<div class="menuitem">
<a href="../encryption.html">Encryption support</a>
</div>
<div class="menuitem">
<a href="../security.html">Secure processing</a>
</div>
<div class="menuitem">
<a href="../casestudies.html">Case Studies</a>
</div>
<div class="menuitem">
<a href="../related-projects.html">Related projects</a>
</div>
<div class="menuitem">
<a href="../legal.html">Legal</a>
</div>
</div>
<div onclick="SwitchMenu('menu_1.2', '../skin/')" id="menu_1.2Title" class="menutitle">Apache Wide</div>
<div id="menu_1.2" class="menuitemgroup">
<div class="menuitem">
<a href="https://www.apache.org/">Apache Software Foundation</a>
</div>
<div class="menuitem">
<a href="https://www.apache.org/licenses/">License</a>
</div>
<div class="menuitem">
<a href="https://www.apache.org/foundation/sponsorship.html">Sponsorship</a>
</div>
<div class="menuitem">
<a href="https://www.apache.org/foundation/thanks.html">Thanks</a>
</div>
<div class="menuitem">
<a href="https://www.apache.org/security/">Security</a>
</div>
<div class="menuitem">
<a href="https://privacy.apache.org/policies/privacy-policy-public.html">Privacy</a>
</div>
</div>
<div onclick="SwitchMenu('menu_1.3', '../skin/')" id="menu_1.3Title" class="menutitle">Component APIs</div>
<div id="menu_1.3" class="menuitemgroup">
<div class="menuitem">
<a href="../components/index.html">Overview</a>
</div>
<div class="menuitem">
<a href="../apidocs/index.html">Javadocs</a>
</div>
<div onclick="SwitchMenu('menu_1.3.3', '../skin/')" id="menu_1.3.3Title" class="menutitle">Excel (HSSF/XSSF)</div>
<div id="menu_1.3.3" class="menuitemgroup">
<div class="menuitem">
<a href="../components/spreadsheet/index.html">Overview</a>
</div>
<div class="menuitem">
<a href="../components/spreadsheet/quick-guide.html">Quick Guide</a>
</div>
<div class="menuitem">
<a href="../components/spreadsheet/how-to.html">HOWTO</a>
</div>
<div class="menuitem">
<a href="../components/spreadsheet/converting.html">HSSF to SS Converting</a>
</div>
<div class="menuitem">
<a href="../components/spreadsheet/formula.html">Formula Support</a>
</div>
<div class="menuitem">
<a href="../components/spreadsheet/eval.html">Formula Evaluation</a>
</div>
<div class="menuitem">
<a href="../components/spreadsheet/eval-devguide.html">Eval Dev Guide</a>
</div>
<div class="menuitem">
<a href="../components/spreadsheet/examples.html">Examples</a>
</div>
<div class="menuitem">
<a href="../components/spreadsheet/use-case.html">Use Case</a>
</div>
<div class="menuitem">
<a href="../components/spreadsheet/diagrams.html">Pictorial Docs</a>
</div>
<div class="menuitem">
<a href="../components/spreadsheet/limitations.html">Limitations</a>
</div>
<div class="menuitem">
<a href="../components/spreadsheet/user-defined-functions.html">User Defined Functions</a>
</div>
<div class="menuitem">
<a href="../components/spreadsheet/excelant.html">ExcelAnt Tests</a>
</div>
<div class="menuitem">
<a href="../components/spreadsheet/hacking-hssf.html">Hacking HSSF</a>
</div>
<div class="menuitem">
<a href="../components/spreadsheet/record-generator.html">Record Generator</a>
</div>
<div class="menuitem">
<a href="../components/spreadsheet/chart.html">Charts</a>
</div>
</div>
<div onclick="SwitchMenu('menu_1.3.4', '../skin/')" id="menu_1.3.4Title" class="menutitle">PowerPoint (HSLF/XSLF)</div>
<div id="menu_1.3.4" class="menuitemgroup">
<div class="menuitem">
<a href="../components/slideshow/index.html">Overview</a>
</div>
<div class="menuitem">
<a href="../components/slideshow/quick-guide.html">Quick Guide</a>
</div>
<div class="menuitem">
<a href="../components/slideshow/how-to-shapes.html">HSLF Cookbook</a>
</div>
<div class="menuitem">
<a href="../components/slideshow/xslf-cookbook.html">XSLF Cookbook</a>
</div>
<div class="menuitem">
<a href="../components/slideshow/ppt-wmf-emf-renderer.html">Render SL/WMF/EMF</a>
</div>
<div class="menuitem">
<a href="../components/slideshow/ppt-file-format.html">PPT File Format</a>
</div>
</div>
<div onclick="SwitchMenu('menu_1.3.5', '../skin/')" id="menu_1.3.5Title" class="menutitle">Word (HWPF/XWPF)</div>
<div id="menu_1.3.5" class="menuitemgroup">
<div class="menuitem">
<a href="../components/document/index.html">Overview</a>
</div>
<div class="menuitem">
<a href="../components/document/quick-guide.html">HWPF Quick Guide</a>
</div>
<div class="menuitem">
<a href="../components/document/quick-guide-xwpf.html">XWPF Quick Guide</a>
</div>
<div class="menuitem">
<a href="../components/document/docoverview.html">HWPF Format</a>
</div>
<div class="menuitem">
<a href="../components/document/projectplan.html">HWPF Project plan</a>
</div>
</div>
<div class="menuitem">
<a href="../components/hsmf/index.html">Outlook (HSMF)</a>
</div>
<div class="menuitem">
<a href="../components/diagram/index.html">Visio (HDGF+XDGF)</a>
</div>
<div onclick="SwitchMenu('menu_1.3.8', '../skin/')" id="menu_1.3.8Title" class="menutitle">Publisher (HPBF)</div>
<div id="menu_1.3.8" class="menuitemgroup">
<div class="menuitem">
<a href="../components/hpbf/index.html">Overview</a>
</div>
<div class="menuitem">
<a href="../components/hpbf/file-format.html">File Format</a>
</div>
</div>
<div onclick="SwitchMenu('menu_1.3.9', '../skin/')" id="menu_1.3.9Title" class="menutitle">OLE2 Filesystem (POIFS)</div>
<div id="menu_1.3.9" class="menuitemgroup">
<div class="menuitem">
<a href="../components/poifs/index.html">Overview</a>
</div>
<div class="menuitem">
<a href="../components/poifs/how-to.html">How To</a>
</div>
<div class="menuitem">
<a href="../components/poifs/embeded.html">Embedded Documents</a>
</div>
<div class="menuitem">
<a href="../components/poifs/fileformat.html">File System Documentation</a>
</div>
<div class="menuitem">
<a href="../components/poifs/usecases.html">Use Cases</a>
</div>
<div class="menuitem">
<a href="../components/poifs/design.html">Design</a>
</div>
</div>
<div onclick="SwitchMenu('menu_1.3.10', '../skin/')" id="menu_1.3.10Title" class="menutitle">OLE2 Document Props (HPSF)</div>
<div id="menu_1.3.10" class="menuitemgroup">
<div class="menuitem">
<a href="../components/hpsf/index.html">Overview</a>
</div>
<div class="menuitem">
<a href="../components/hpsf/how-to.html">How To</a>
</div>
<div class="menuitem">
<a href="../components/hpsf/thumbnails.html">Thumbnails</a>
</div>
<div class="menuitem">
<a href="../components/hpsf/internals.html">Internals</a>
</div>
<div class="menuitem">
<a href="../components/hpsf/todo.html">To Do</a>
</div>
</div>
<div class="menuitem">
<a href="../components/hmef/index.html">TNEF (HMEF) for winmail.dat</a>
</div>
<div class="menuitem">
<a href="../components/oxml4j/index.html">OpenXML4J (OOXML)</a>
</div>
<div class="menuitem">
<a href="../components/logging.html">Logging framework</a>
</div>
<div class="menuitem">
<a href="../components/configuration.html">Configuration</a>
</div>
</div>
<div onclick="SwitchMenu('menu_1.4', '../skin/')" id="menu_1.4Title" class="menutitle">Help</div>
<div id="menu_1.4" class="menuitemgroup">
<div class="menuitem">
<a href="../help/index.html">Mailing Lists</a>
</div>
<div class="menuitem">
<a href="../help/faq.html">FAQ</a>
</div>
<div class="menuitem">
<a href="https://bz.apache.org/bugzilla/buglist.cgi?product=POI">Bug Database</a>
</div>
</div>
<div onclick="SwitchMenu('menu_1.5', '../skin/')" id="menu_1.5Title" class="menutitle">Getting Involved</div>
<div id="menu_1.5" class="menuitemgroup">
<div class="menuitem">
<a href="../devel/index.html">How To Build</a>
</div>
<div class="menuitem">
<a href="../devel/nightly.html">Nightly Builds</a>
</div>
<div class="menuitem">
<a href="../devel/git.html">Git Repository</a>
</div>
<div class="menuitem">
<a href="../devel/guidelines.html">Contribution Guidelines</a>
</div>
<div class="menuitem">
<a href="../devel/who.html">Who We Are</a>
</div>
<div onclick="SwitchMenu('menu_1.5.6', '../skin/')" id="menu_1.5.6Title" class="menutitle">Planning Documents</div>
<div id="menu_1.5.6" class="menuitemgroup">
<div class="menuitem">
<a href="../devel/plan/index.html">Overview</a>
</div>
<div class="menuitem">
<a href="../devel/plan/vision10.html">1.0 Vision</a>
</div>
<div class="menuitem">
<a href="../devel/plan/vision20.html">2.0 Vision</a>
</div>
</div>
<div onclick="SwitchMenu('menu_1.5.7', '../skin/')" id="menu_1.5.7Title" class="menutitle">References</div>
<div id="menu_1.5.7" class="menuitemgroup">
<div class="menuitem">
<a href="../devel/references/index.html">Overview</a>
</div>
<div class="menuitem">
<a href="../devel/references/logocontest.html">Logo Submissions</a>
</div>
<div class="menuitem">
<a href="https://sc.openoffice.org/excelfileformat.pdf">XLS spec [PDF]</a>
</div>
<div class="menuitem">
<a href="https://xml.apache.org/cocoon/">Apache Cocoon</a>
</div>
</div>
<div onclick="SwitchMenu('menu_1.5.8', '../skin/')" id="menu_1.5.8Title" class="menutitle">Resolutions</div>
<div id="menu_1.5.8" class="menuitemgroup">
<div class="menuitem">
<a href="../devel/resolutions/index.html">Overview</a>
</div>
<div class="menuitem">
<a href="../devel/resolutions/res001.html">Minimal Coding Standards</a>
</div>
</div>
<div onclick="SwitchMenu('menu_1.5.9', '../skin/')" id="menu_1.5.9Title" class="menutitle">History</div>
<div id="menu_1.5.9" class="menuitemgroup">
<div class="menuitem">
<a href="../devel/history/index.html">The early years</a>
</div>
<div class="menuitem">
<a href="../devel/history/changes-3x.html">Changelog 3.x</a>
</div>
<div class="menuitem">
<a href="../devel/history/changes-pre3x.html">Changelog 0-2.x</a>
</div>
</div>
</div>
<div id="credit"></div>
<div id="roundbottom">
<img style="display: none" class="corner" height="15" width="15" alt="" src="../skin/images/rc-b-l-15-1body-2menu-3menu.png"></div>
<!--+
|alternative credits
+-->
<div id="credit2">
<a href="https://donate.apache.org/"><img border="0" title="Support Apache" alt="Support Apache - logo" src="../images/support-asf.png" style="width: 125px;height: 125px;"></a><a href="https://www.apache.org/foundation/press/kit/#poweredby"><img border="0" title="powered by POI" alt="powered by POI - logo" src="../images/poweredby-poi-logo.png" style="width: 125px;height: 125px;"></a>
</div>
</div>
<!--+
|end Menu
+-->
<!--+
|start content
+-->
<div id="content">
<h1>POI Ruby Bindings</h1>
<div id="front-matter"></div>
<a name="Intro"></a>
<h2 class="boxed">Intro</h2>
<div class="section">
<p>The POI library can now be compiled as a Ruby extension, allowing the API to be called from
Ruby language programs. Ruby users can therefore read and write OLE2 documents, such as Excel files
with ease
</p>
<p>The bindings are generated by compiling POI with <a href="https://gcc.gnu.org/java/">gcj</a>,
and generating the Ruby wrapper using <a href="https://www.swig.org">SWIG</a>. The aim is the keep
the POI api as-is. However, where java standard library objects are used, an effort is made to transform them smoothly
into Ruby objects. Therefore, where the POI API takes an OutputStream, you can pass an IO object. Where the POI works
java.util.Date or java.util.Calendar object, you can work with a Ruby Time object. </p>
</div>
<a name="Getting+Started"></a>
<h2 class="boxed">Getting Started</h2>
<div class="section">
<a name="Pre-Requisites"></a>
<h3 class="boxed">Pre-Requisites</h3>
<p>The bindings have been developed with GCC 3.4.3 and Ruby 1.8.2. You are unlikely to get correct results with
versions of GCC prior to 3.4 or versions of Ruby prior to 1.8. To compile the Ruby extension, you must have
GCC (compiled with java language support), Ruby development headers, and SWIG. To run, you will need Ruby (obviously!) and
<em>libgcj </em>, presumably from the same version of GCC with which you compiled.
</p>
<a name="Source+Repository"></a>
<h3 class="boxed">Source Repository</h3>
<p>
The POI-Ruby module sits under the POI <a href="https://github.com/apache/poi/tree/trunk/src/contrib/poi-ruby/">Git</a>.
Running <em>make</em> inside that directory will create a loadable ruby extension <em>poi4r.so</em> in the release subdirectory. Tests
are in the <em>tests/</em> subdirectory, and should be run from the <em>poi-ruby</em> directory. Please read the tests to figure out the usage.
</p>
<p>Note that the makefile, though designed to work across Linux/OS X/Cygwin, has been tested only on linux.
There are likely to be issues on other platform; fixes gratefully accepted! </p>
<a name="Binary"></a>
<h3 class="boxed">Binary</h3>
<p>A version of poi4r.so is available <a href="https://www.apache.org/~avik/dist/poi4r.so">here</a> (broken link). Its been compiled on a linux box
with GCC 3.4.3 and Ruby 1.8.2. It dynamically links to libgcj. No guarantees about working on any other box. </p>
</div>
<a name="Usage"></a>
<h2 class="boxed">Usage</h2>
<div class="section">
<p>The following ruby code shows some of the things you can do with POI in Ruby</p>
<div class="code">
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">h=Poi4r::HSSFWorkbook.new</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">#Test Sheet Creation</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">s=h.createSheet("Sheet1")</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">#Test setting cell values</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">s=h.getSheetAt(0)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">r=s.createRow(0)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">c=r.createCell(0)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">c.setCellValue(1.5)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">c=r.createCell(1)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">c.setCellValue("Ruby")</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">#Test styles</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">st = h.createCellStyle()</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">c=r.createCell(2)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">st.setAlignment(Poi4r::HSSFCellStyle.ALIGN_CENTER)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">c.setCellStyle(st)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">c.setCellValue("centr'd")</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">#Date handling</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">c=r.createCell(3)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">t1=Time.now</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">c.setCellValue(Time.now)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">t2= c.getDateCellValue().gmtime</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">st=h.createCellStyle();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">st.setDataFormat(Poi4r::HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm"))</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">c.setCellStyle(st)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">#Formulas</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">c=r.createCell(4)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">c.setCellFormula("A1*2")</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">c.getCellFormula()</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">#Writing</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">h.write(File.new("test.xls","w"))</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p> The <em>tc_base_tests.rb</em> file in the <em>tests</em> sub directory of the source distribution
contains examples of simple uses of the API. The <a href="spreadsheet/quick-guide.html">quick guide </a> is the best
place to learn HSSF API use. (Note however that none of the Drawing features are implemented in the Ruby binding.)
See also the <a href="../apidocs/index.html">POI API documentation</a> for more details.
</p>
</div>
<a name="Future+Directions"></a>
<h2 class="boxed">Future Directions</h2>
<div class="section">
<a name="TODO%27s"></a>
<h3 class="boxed">TODO's</h3>
<ul>
<li>Implement support for reading Excel files (easy)</li>
<li>Expose POIFS API to read raw OLE2 files from Ruby</li>
<li>Expose HPSF API to read property streams </li>
<li>Tests... Tests... Tests...</li>
</ul>
<a name="Limitations"></a>
<h3 class="boxed">Limitations</h3>
<ul>
<li>Check operations in 64bit machines - Java primitive types are fixed irrespective of machine type, unlike C/C++ types. The wrapping code
that converts C/C++ primitive types to/from Java types is making assumptions on type sizes that MAY be incorrect on wide architectures. </li>
<li>The current implementation is with the POI 2.0 release. The 2.5 release adds support for Excel drawing primitives, and
thus has a dependency on java AWT. Since AWT is not very mature in gcj, leaving it out seemed to be the safer option.</li>
<li>Packaging - The current make file makes no effort to install the extension into the standard ruby directories. This should probably be
packaged as a <a href="https://www.rubygems.org">gem</a>.</li>
</ul>
</div>
<p align="right">
<font size="-2">by&nbsp;Avik Sengupta</font>
</p>
</div>
<!--+
|end content
+-->
<div class="clearboth">&nbsp;</div>
</div>
<div id="footer">
<!--+
|start bottomstrip
+-->
<div class="lastmodified">
<script type="text/javascript"><!--
document.write("Last Published: " + document.lastModified);
// --></script>
</div>
<div class="copyright">
Copyright &copy;
2001-2025 <a href="https://www.apache.org/">The Apache Software Foundation</a>
<br>
Apache, Apache POI, the Apache feather logo, and the Apache POI
logos are trademarks of The Apache Software Foundation.
</div>
<div id="feedback">
Send feedback about the website to:
<a id="feedbackto" href="mailto:dev@poi.apache.org?subject=Feedback%C2%A0components/poi-ruby.html">dev@poi.apache.org</a>
</div>
<!--+
|end bottomstrip
+-->
</div>
</body>
</html>