2025-07-08 03:31:03 +01:00

6196 lines
242 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>Busy Developers' Guide to HSSF and XSSF Features</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/group-logo.png" 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 class="current">
<a class="selected" 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_selected_1.1', '../../skin/')" id="menu_selected_1.1Title" class="menutitle" style="background-image: url('../../skin/images/chapter_open.gif');">Component APIs</div>
<div id="menu_selected_1.1" class="selectedmenuitemgroup" style="display: block;">
<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_selected_1.1.3', '../../skin/')" id="menu_selected_1.1.3Title" class="menutitle" style="background-image: url('../../skin/images/chapter_open.gif');">Excel (HSSF/XSSF)</div>
<div id="menu_selected_1.1.3" class="selectedmenuitemgroup" style="display: block;">
<div class="menuitem">
<a href="../../components/spreadsheet/index.html">Overview</a>
</div>
<div class="menupage">
<div class="menupagetitle">Quick Guide</div>
</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.1.4', '../../skin/')" id="menu_1.1.4Title" class="menutitle">PowerPoint (HSLF/XSLF)</div>
<div id="menu_1.1.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.1.5', '../../skin/')" id="menu_1.1.5Title" class="menutitle">Word (HWPF/XWPF)</div>
<div id="menu_1.1.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.1.8', '../../skin/')" id="menu_1.1.8Title" class="menutitle">Publisher (HPBF)</div>
<div id="menu_1.1.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.1.9', '../../skin/')" id="menu_1.1.9Title" class="menutitle">OLE2 Filesystem (POIFS)</div>
<div id="menu_1.1.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.1.10', '../../skin/')" id="menu_1.1.10Title" class="menutitle">OLE2 Document Props (HPSF)</div>
<div id="menu_1.1.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 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>Busy Developers' Guide to HSSF and XSSF Features</h1>
<div id="front-matter"></div>
<a name="Busy+Developers%27+Guide+to+Features"></a>
<h2 class="boxed">Busy Developers' Guide to Features</h2>
<div class="section">
<p>
Want to use HSSF and XSSF read and write spreadsheets in a hurry? This
guide is for you. If you're after more in-depth coverage of the HSSF and
XSSF user-APIs, please consult the <a href="how-to.html">HOWTO</a>
guide as it contains actual descriptions of how to use this stuff.
</p>
<a name="Index+of+Features"></a>
<h3 class="boxed">Index of Features</h3>
<ul>
<li>
<a href="#NewWorkbook">How to create a new workbook</a>
</li>
<li>
<a href="#NewSheet">How to create a sheet</a>
</li>
<li>
<a href="#CreateCells">How to create cells</a>
</li>
<li>
<a href="#CreateDateCells">How to create date cells</a>
</li>
<li>
<a href="#CellTypes">Working with different types of cells</a>
</li>
<li>
<a href="#Iterator">Iterate over rows and cells</a>
</li>
<li>
<a href="#CellContents">Getting the cell contents</a>
</li>
<li>
<a href="#TextExtraction">Text Extraction</a>
</li>
<li>
<a href="#FileInputStream">Files vs InputStreams</a>
</li>
<li>
<a href="#Alignment">Aligning cells</a>
</li>
<li>
<a href="#Borders">Working with borders</a>
</li>
<li>
<a href="#FillsAndFrills">Fills and color</a>
</li>
<li>
<a href="#MergedCells">Merging cells</a>
</li>
<li>
<a href="#WorkingWithFonts">Working with fonts</a>
</li>
<li>
<a href="#CustomColors">Custom colors</a>
</li>
<li>
<a href="#ReadWriteWorkbook">Reading and writing</a>
</li>
<li>
<a href="#NewLinesInCells">Use newlines in cells.</a>
</li>
<li>
<a href="#DataFormats">Create user defined data formats</a>
</li>
<li>
<a href="#FitTo">Fit Sheet to One Page</a>
</li>
<li>
<a href="#PrintArea2">Set print area for a sheet</a>
</li>
<li>
<a href="#FooterPageNumbers">Set page numbers on the footer of a sheet</a>
</li>
<li>
<a href="#ShiftRows">Shift rows</a>
</li>
<li>
<a href="#SelectSheet">Set a sheet as selected</a>
</li>
<li>
<a href="#Zoom">Set the zoom magnification for a sheet</a>
</li>
<li>
<a href="#Splits">Create split and freeze panes</a>
</li>
<li>
<a href="#Repeating">Repeating rows and columns</a>
</li>
<li>
<a href="#HeaderFooter">Headers and Footers</a>
</li>
<li>
<a href="#XSSFHeaderFooter">XSSF enhancement for Headers and Footers</a>
</li>
<li>
<a href="#DrawingShapes">Drawing Shapes</a>
</li>
<li>
<a href="#StylingShapes">Styling Shapes</a>
</li>
<li>
<a href="#Graphics2d">Shapes and Graphics2d</a>
</li>
<li>
<a href="#Outlining">Outlining</a>
</li>
<li>
<a href="#Images">Images</a>
</li>
<li>
<a href="#NamedRanges">Named Ranges and Named Cells</a>
</li>
<li>
<a href="#CellComments">How to set cell comments</a>
</li>
<li>
<a href="#Autofit">How to adjust column width to fit the contents</a>
</li>
<li>
<a href="#Hyperlinks">Hyperlinks</a>
</li>
<li>
<a href="#Validation">Data Validations</a>
</li>
<li>
<a href="#Embedded">Embedded Objects</a>
</li>
<li>
<a href="#Autofilter">Autofilters</a>
</li>
<li>
<a href="#ConditionalFormatting">Conditional Formatting</a>
</li>
<li>
<a href="#Hiding">Hiding and Un-Hiding Rows</a>
</li>
<li>
<a href="#CellProperties">Setting Cell Properties</a>
</li>
<li>
<a href="#DrawingBorders">Drawing Borders</a>
</li>
<li>
<a href="#PivotTable">Create a Pivot Table</a>
</li>
<li>
<a href="#RichText">Cells with multiple styles</a>
</li>
</ul>
<a name="Features"></a>
<h3 class="boxed">Features</h3>
<a name="NewWorkbook" id="NewWorkbook"></a><a name="New+Workbook"></a>
<h4>New Workbook</h4>
<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">Workbook wb = new HSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">...</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">try (OutputStream fileOut = new FileOutputStream("workbook.xls")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> wb.write(fileOut);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Workbook wb = new XSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">...</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">try (OutputStream fileOut = new FileOutputStream("workbook.xlsx")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> wb.write(fileOut);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<a name="NewSheet" id="NewSheet"></a><a name="New+Sheet"></a>
<h4>New Sheet</h4>
<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">Workbook wb = new HSSFWorkbook(); // or new XSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet1 = wb.createSheet("new sheet");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet2 = wb.createSheet("second sheet");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Note that sheet name is Excel must not exceed 31 characters</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// and must not contain any of the any of the following characters:</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// 0x0000</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// 0x0003</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// colon (:)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// backslash (\)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// asterisk (*)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// question mark (?)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// forward slash (/)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// opening square bracket ([)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// closing square bracket (])</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// You can use org.apache.poi.ss.util.WorkbookUtil#createSafeSheetName(String nameProposal)}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// for a safe way to create valid names, this utility replaces invalid characters with a space (' ')</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">String safeName = WorkbookUtil.createSafeSheetName("[O'Brien's sales*?]"); // returns " O'Brien's sales "</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet3 = wb.createSheet(safeName);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">try (OutputStream fileOut = new FileOutputStream("workbook.xls")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> wb.write(fileOut);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<a name="CreateCells" id="CreateCells"></a><a name="Creating+Cells"></a>
<h4>Creating Cells</h4>
<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">Workbook wb = new HSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//Workbook wb = new XSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">CreationHelper createHelper = wb.getCreationHelper();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet = wb.createSheet("new sheet");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Create a row and put some cells in it. Rows are 0 based.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Row row = sheet.createRow(0);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Create a cell and put a value in it.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Cell cell = row.createCell(0);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellValue(1);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Or do it on one line.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">row.createCell(1).setCellValue(1.2);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">row.createCell(2).setCellValue(</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> createHelper.createRichTextString("This is a string"));</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">row.createCell(3).setCellValue(true);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Write the output to a file</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">try (OutputStream fileOut = new FileOutputStream("workbook.xls")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> wb.write(fileOut);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<a name="CreateDateCells" id="CreateDateCells"></a><a name="Creating+Date+Cells"></a>
<h4>Creating Date Cells</h4>
<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">Workbook wb = new HSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//Workbook wb = new XSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">CreationHelper createHelper = wb.getCreationHelper();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet = wb.createSheet("new sheet");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Create a row and put some cells in it. Rows are 0 based.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Row row = sheet.createRow(0);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Create a cell and put a date value in it. The first cell is not styled</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// as a date.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Cell cell = row.createCell(0);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellValue(new Date());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// we style the second cell as a date (and time). It is important to</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// create a new cell style from the workbook otherwise you can end up</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// modifying the built in style and effecting not only this cell but other cells.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">CellStyle cellStyle = wb.createCellStyle();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cellStyle.setDataFormat(</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> createHelper.createDataFormat().getFormat("m/d/yy h:mm"));</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell = row.createCell(1);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellValue(new Date());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellStyle(cellStyle);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//you can also set date as java.util.Calendar</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell = row.createCell(2);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellValue(Calendar.getInstance());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellStyle(cellStyle);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Write the output to a file</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">try (OutputStream fileOut = new FileOutputStream("workbook.xls")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> wb.write(fileOut);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<a name="CellTypes" id="CellTypes"></a><a name="Working+with+different+types+of+cells"></a>
<h4>Working with different types of cells</h4>
<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">Workbook wb = new HSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet = wb.createSheet("new sheet");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Row row = sheet.createRow(2);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">row.createCell(0).setCellValue(1.1);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">row.createCell(1).setCellValue(new Date());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">row.createCell(2).setCellValue(Calendar.getInstance());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">row.createCell(3).setCellValue("a string");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">row.createCell(4).setCellValue(true);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">row.createCell(5).setCellType(CellType.ERROR);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Write the output to a file</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">try (OutputStream fileOut = new FileOutputStream("workbook.xls")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> wb.write(fileOut);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<a name="FileInputStream" id="FileInputStream"></a><a name="Files+vs+InputStreams"></a>
<h4>Files vs InputStreams</h4>
<p>When opening a workbook, either a .xls HSSFWorkbook, or a .xlsx
XSSFWorkbook, the Workbook can be loaded from either a <em>File</em>
or an <em>InputStream</em>. Using a <em>File</em> object allows for
lower memory consumption, while an <em>InputStream</em> requires more
memory as it has to buffer the whole file.</p>
<p>If using <em>WorkbookFactory</em>, it's very easy to use one or
the other:</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">// Use a file</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Workbook wb = WorkbookFactory.create(new File("MyExcel.xls"));</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Use an InputStream, needs more memory</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Workbook wb = WorkbookFactory.create(new FileInputStream("MyExcel.xlsx"));</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p>If using <em>HSSFWorkbook</em> or <em>XSSFWorkbook</em> directly,
you should generally go through <em>POIFSFileSystem</em> or
<em>OPCPackage</em>, to have full control of the lifecycle (including
closing the file when done):</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">// HSSFWorkbook, File</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">POIFSFileSystem fs = new POIFSFileSystem(new File("file.xls"));</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">HSSFWorkbook wb = new HSSFWorkbook(fs.getRoot(), true);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">....</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">fs.close();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// HSSFWorkbook, InputStream, needs more memory</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">POIFSFileSystem fs = new POIFSFileSystem(myInputStream);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">HSSFWorkbook wb = new HSSFWorkbook(fs.getRoot(), true);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// XSSFWorkbook, File</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">OPCPackage pkg = OPCPackage.open(new File("file.xlsx"));</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">XSSFWorkbook wb = new XSSFWorkbook(pkg);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">....</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">pkg.close();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// XSSFWorkbook, InputStream, needs more memory</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">OPCPackage pkg = OPCPackage.open(myInputStream);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">XSSFWorkbook wb = new XSSFWorkbook(pkg);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">....</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">pkg.close();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<a name="Alignment" id="Alignment"></a><a name="Demonstrates+various+alignment+options"></a>
<h4>Demonstrates various alignment options</h4>
<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">public static void main(String[] args) throws Exception {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> Workbook wb = new XSSFWorkbook(); //or new HSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> Sheet sheet = wb.createSheet();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> Row row = sheet.createRow(2);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> row.setHeightInPoints(30);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> createCell(wb, row, 0, HorizontalAlignment.CENTER, VerticalAlignment.BOTTOM);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> createCell(wb, row, 1, HorizontalAlignment.CENTER_SELECTION, VerticalAlignment.BOTTOM);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> createCell(wb, row, 2, HorizontalAlignment.FILL, VerticalAlignment.CENTER);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> createCell(wb, row, 3, HorizontalAlignment.GENERAL, VerticalAlignment.CENTER);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> createCell(wb, row, 4, HorizontalAlignment.JUSTIFY, VerticalAlignment.JUSTIFY);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> createCell(wb, row, 5, HorizontalAlignment.LEFT, VerticalAlignment.TOP);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> createCell(wb, row, 6, HorizontalAlignment.RIGHT, VerticalAlignment.TOP);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // Write the output to a file</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> try (OutputStream fileOut = new FileOutputStream("xssf-align.xlsx")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> wb.write(fileOut);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> }</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> wb.close();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">/**</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> * Creates a cell and aligns it a certain way.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> *</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> * @param wb the workbook</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> * @param row the row to create the cell in</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> * @param column the column number to create the cell in</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> * @param halign the horizontal alignment for the cell.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> * @param valign the vertical alignment for the cell.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> */</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">private static void createCell(Workbook wb, Row row, int column, HorizontalAlignment halign, VerticalAlignment valign) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> Cell cell = row.createCell(column);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> cell.setCellValue("Align It");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> CellStyle cellStyle = wb.createCellStyle();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> cellStyle.setAlignment(halign);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> cellStyle.setVerticalAlignment(valign);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> cell.setCellStyle(cellStyle);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<a name="Borders" id="Borders"></a><a name="Working+with+borders"></a>
<h4>Working with borders</h4>
<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">Workbook wb = new HSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet = wb.createSheet("new sheet");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Create a row and put some cells in it. Rows are 0 based.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Row row = sheet.createRow(1);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Create a cell and put a value in it.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Cell cell = row.createCell(1);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellValue(4);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Style the cell with borders all around.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">CellStyle style = wb.createCellStyle();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">style.setBorderBottom(BorderStyle.THIN);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">style.setBottomBorderColor(IndexedColors.BLACK.getIndex());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">style.setBorderLeft(BorderStyle.THIN);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">style.setLeftBorderColor(IndexedColors.GREEN.getIndex());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">style.setBorderRight(BorderStyle.THIN);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">style.setRightBorderColor(IndexedColors.BLUE.getIndex());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">style.setBorderTop(BorderStyle.MEDIUM_DASHED);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">style.setTopBorderColor(IndexedColors.BLACK.getIndex());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellStyle(style);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Write the output to a file</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">try (OutputStream fileOut = new FileOutputStream("workbook.xls")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> wb.write(fileOut);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">wb.close();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<a name="Iterator" id="Iterator"></a><a name="Iterate+over+rows+and+cells"></a>
<h4>Iterate over rows and cells</h4>
<p>Sometimes, you'd like to just iterate over all the sheets in
a workbook, all the rows in a sheet, or all the cells in a row.
This is possible with a simple for loop.</p>
<p>These iterators are available by calling <em>workbook.sheetIterator()</em>,
<em>sheet.rowIterator()</em>, and <em>row.cellIterator()</em>, or
implicitly using a for-each loop.
Note that a rowIterator and cellIterator iterate over rows or
cells that have been created, skipping empty rows and cells.</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">for (Sheet sheet : wb ) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> for (Row row : sheet) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> for (Cell cell : row) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // Do something here</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> }</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> }</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
</div>
<a name="Iterate+over+cells%2C+with+control+of+missing+%2F+blank+cells"></a>
<h4>Iterate over cells, with control of missing / blank cells</h4>
<p>In some cases, when iterating, you need full control over how
missing or blank rows and cells are treated, and you need to ensure
you visit every cell and not just those defined in the file. (The
CellIterator will only return the cells defined in the file, which
is largely those with values or stylings, but it depends on Excel).</p>
<p>In cases such as these, you should fetch the first and last column
information for a row, then call <em>getCell(int, MissingCellPolicy)</em>
to fetch the cell. Use a
<a href="../../apidocs/dev/org/apache/poi/ss/usermodel/Row.MissingCellPolicy.html">MissingCellPolicy</a>
to control how blank or null cells are handled.</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">// Decide which rows to process</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">int rowStart = Math.min(15, sheet.getFirstRowNum());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">int rowEnd = Math.max(1400, sheet.getLastRowNum());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">for (int rowNum = rowStart; rowNum &lt; rowEnd; rowNum++) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> Row r = sheet.getRow(rowNum);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> if (r == null) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // This whole row is empty</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // Handle it as needed</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> continue;</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> }</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> int lastColumn = Math.max(r.getLastCellNum(), MY_MINIMUM_COLUMN_COUNT);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> for (int cn = 0; cn &lt; lastColumn; cn++) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> Cell c = r.getCell(cn, Row.RETURN_BLANK_AS_NULL);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> if (c == null) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // The spreadsheet is empty in this cell</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> } else {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // Do something useful with the cell's contents</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> }</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> }</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
</div>
<a name="CellContents" id="CellContents"></a><a name="Getting+the+cell+contents"></a>
<h4>Getting the cell contents</h4>
<p>To get the contents of a cell, you first need to
know what kind of cell it is (asking a string cell
for its numeric contents will get you a
NumberFormatException for example). So, you will
want to switch on the cell's type, and then call
the appropriate getter for that cell.</p>
<p>In the code below, we loop over every cell
in one sheet, print out the cell's reference
(eg A3), and then the cell's contents.</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">// import org.apache.poi.ss.usermodel.*;</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">DataFormatter formatter = new DataFormatter();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet1 = wb.getSheetAt(0);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">for (Row row : sheet1) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> for (Cell cell : row) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> CellReference cellRef = new CellReference(row.getRowNum(), cell.getColumnIndex());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> System.out.print(cellRef.formatAsString());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> System.out.print(" - ");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // get the text that appears in the cell by getting the cell value and applying any data formats (Date, 0.00, 1.23e9, $1.23, etc)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> String text = formatter.formatCellValue(cell);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> System.out.println(text);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // Alternatively, get the value and format it yourself</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> switch (cell.getCellType()) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> case CellType.STRING:</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> System.out.println(cell.getRichStringCellValue().getString());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> break;</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> case CellType.NUMERIC:</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> if (DateUtil.isCellDateFormatted(cell)) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> System.out.println(cell.getDateCellValue());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> } else {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> System.out.println(cell.getNumericCellValue());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> }</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> break;</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> case CellType.BOOLEAN:</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> System.out.println(cell.getBooleanCellValue());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> break;</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> case CellType.FORMULA:</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> System.out.println(cell.getCellFormula());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> break;</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> case CellType.BLANK:</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> System.out.println();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> break;</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> default:</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> System.out.println();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> }</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> }</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
</div>
<a name="TextExtraction" id="TextExtraction"></a><a name="Text+Extraction"></a>
<h4>Text Extraction</h4>
<p>For most text extraction requirements, the standard
ExcelExtractor class should provide all you need.</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">try (InputStream inp = new FileInputStream("workbook.xls")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> HSSFWorkbook wb = new HSSFWorkbook(new POIFSFileSystem(inp));</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> ExcelExtractor extractor = new ExcelExtractor(wb);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> extractor.setFormulasNotResults(true);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> extractor.setIncludeSheetNames(false);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> String text = extractor.getText();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> wb.close();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p>For very fancy text extraction, XLS to CSV etc,
take a look at
<em>/poi-examples/src/main/java/org/apache/poi/examples/hssf/eventusermodel/XLS2CSVmra.java</em>
</p>
<a name="FillsAndFrills" id="FillsAndFrills"></a><a name="Fills+and+colors"></a>
<h4>Fills and colors</h4>
<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">Workbook wb = new XSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet = wb.createSheet("new sheet");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Create a row and put some cells in it. Rows are 0 based.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Row row = sheet.createRow(1);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Aqua background</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">CellStyle style = wb.createCellStyle();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">style.setFillBackgroundColor(IndexedColors.AQUA.getIndex());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">style.setFillPattern(FillPatternType.BIG_SPOTS);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Cell cell = row.createCell(1);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellValue("X");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellStyle(style);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Orange "foreground", foreground being the fill foreground not the font color.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">style = wb.createCellStyle();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">style.setFillForegroundColor(IndexedColors.ORANGE.getIndex());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">style.setFillPattern(FillPatternType.SOLID_FOREGROUND);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell = row.createCell(2);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellValue("X");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellStyle(style);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Write the output to a file</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">try (OutputStream fileOut = new FileOutputStream("workbook.xls")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> wb.write(fileOut);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">wb.close();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<a name="MergedCells" id="MergedCells"></a><a name="Merging+cells"></a>
<h4>Merging cells</h4>
<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">Workbook wb = new HSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet = wb.createSheet("new sheet");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Row row = sheet.createRow(1);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Cell cell = row.createCell(1);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellValue("This is a test of merging");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet.addMergedRegion(new CellRangeAddress(</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> 1, //first row (0-based)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> 1, //last row (0-based)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> 1, //first column (0-based)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> 2 //last column (0-based)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">));</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Write the output to a file</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">try (OutputStream fileOut = new FileOutputStream("workbook.xls")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> wb.write(fileOut);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">wb.close();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<a name="WorkingWithFonts" id="WorkingWithFonts"></a><a name="Working+with+fonts"></a>
<h4>Working with fonts</h4>
<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">Workbook wb = new HSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet = wb.createSheet("new sheet");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Create a row and put some cells in it. Rows are 0 based.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Row row = sheet.createRow(1);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Create a new font and alter it.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Font font = wb.createFont();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">font.setFontHeightInPoints((short)24);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">font.setFontName("Courier New");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">font.setItalic(true);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">font.setStrikeout(true);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Fonts are set into a style so create a new one to use.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">CellStyle style = wb.createCellStyle();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">style.setFont(font);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Create a cell and put a value in it.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Cell cell = row.createCell(1);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellValue("This is a test of fonts");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellStyle(style);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Write the output to a file</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">try (OutputStream fileOut = new FileOutputStream("workbook.xls")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> wb.write(fileOut);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">wb.close();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
</div>
<p>
Note, the maximum number of unique fonts in a workbook is limited to 32767. You should re-use fonts in your applications instead of
creating a font for each cell.
Examples:
</p>
<p>
<strong>Wrong:</strong>
</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">for (int i = 0; i &lt; 10000; i++) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> Row row = sheet.createRow(i);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> Cell cell = row.createCell(0);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> CellStyle style = workbook.createCellStyle();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> Font font = workbook.createFont();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> font.setBoldweight(Font.BOLDWEIGHT_BOLD);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> style.setFont(font);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> cell.setCellStyle(style);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
</div>
<p>
<strong>Correct:</strong>
</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">CellStyle style = workbook.createCellStyle();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Font font = workbook.createFont();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">font.setBoldweight(Font.BOLDWEIGHT_BOLD);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">style.setFont(font);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">for (int i = 0; i &lt; 10000; i++) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> Row row = sheet.createRow(i);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> Cell cell = row.createCell(0);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> cell.setCellStyle(style);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
</div>
<a name="CustomColors" id="CustomColors"></a><a name="Custom+colors"></a>
<h4>Custom colors</h4>
<p>
<strong>HSSF:</strong>
</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">HSSFWorkbook wb = new HSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">HSSFSheet sheet = wb.createSheet();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">HSSFRow row = sheet.createRow(0);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">HSSFCell cell = row.createCell(0);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellValue("Default Palette");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//apply some colors from the standard palette,</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// as in the previous examples.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//we'll use red text on a lime background</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">HSSFCellStyle style = wb.createCellStyle();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">style.setFillForegroundColor(HSSFColor.LIME.index);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">style.setFillPattern(FillPatternType.SOLID_FOREGROUND);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">HSSFFont font = wb.createFont();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">font.setColor(HSSFColor.RED.index);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">style.setFont(font);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellStyle(style);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//save with the default palette</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">try (OutputStream out = new FileOutputStream("default_palette.xls")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> wb.write(out);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//now, let's replace RED and LIME in the palette</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// with a more attractive combination</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// (lovingly borrowed from freebsd.org)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellValue("Modified Palette");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//creating a custom palette for the workbook</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">HSSFPalette palette = wb.getCustomPalette();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//replacing the standard red with freebsd.org red</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">palette.setColorAtIndex(HSSFColor.RED.index,</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> (byte) 153, //RGB red (0-255)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> (byte) 0, //RGB green</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> (byte) 0 //RGB blue</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//replacing lime with freebsd.org gold</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">palette.setColorAtIndex(HSSFColor.LIME.index, (byte) 255, (byte) 204, (byte) 102);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//save with the modified palette</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// note that wherever we have previously used RED or LIME, the</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// new colors magically appear</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">try (out = new FileOutputStream("modified_palette.xls")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> wb.write(out);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p>
<strong>XSSF:</strong>
</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">XSSFWorkbook wb = new XSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">XSSFSheet sheet = wb.createSheet();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">XSSFRow row = sheet.createRow(0);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">XSSFCell cell = row.createCell( 0);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellValue("custom XSSF colors");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">XSSFCellStyle style1 = wb.createCellStyle();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">style1.setFillForegroundColor(new XSSFColor(new java.awt.Color(128, 0, 128), new DefaultIndexedColorMap()));</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">style1.setFillPattern(FillPatternType.SOLID_FOREGROUND);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<a name="ReadWriteWorkbook" id="ReadWriteWorkbook"></a><a name="Reading+and+Rewriting+Workbooks"></a>
<h4>Reading and Rewriting Workbooks</h4>
<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">try (InputStream inp = new FileInputStream("workbook.xls")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//InputStream inp = new FileInputStream("workbook.xlsx");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> Workbook wb = WorkbookFactory.create(inp);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> Sheet sheet = wb.getSheetAt(0);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> Row row = sheet.getRow(2);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> Cell cell = row.getCell(3);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> if (cell == null)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> cell = row.createCell(3);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> cell.setCellType(CellType.STRING);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> cell.setCellValue("a test");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // Write the output to a file</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> try (OutputStream fileOut = new FileOutputStream("workbook.xls")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> wb.write(fileOut);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> }</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<a name="NewLinesInCells" id="NewLinesInCells"></a><a name="Using+newlines+in+cells"></a>
<h4>Using newlines in cells</h4>
<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">Workbook wb = new XSSFWorkbook(); //or new HSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet = wb.createSheet();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Row row = sheet.createRow(2);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Cell cell = row.createCell(2);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellValue("Use \n with word wrap on to create a new line");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//to enable newlines you need set a cell styles with wrap=true</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">CellStyle cs = wb.createCellStyle();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cs.setWrapText(true);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellStyle(cs);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//increase row height to accommodate two lines of text</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">row.setHeightInPoints((2*sheet.getDefaultRowHeightInPoints()));</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//adjust column width to fit the content</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet.autoSizeColumn(2);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">try (OutputStream fileOut = new FileOutputStream("ooxml-newlines.xlsx")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> wb.write(fileOut);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">wb.close();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<a name="DataFormats" id="DataFormats"></a><a name="Data+Formats"></a>
<h4>Data Formats</h4>
<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">Workbook wb = new HSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet = wb.createSheet("format sheet");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">CellStyle style;</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">DataFormat format = wb.createDataFormat();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Row row;</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Cell cell;</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">int rowNum = 0;</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">int colNum = 0;</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">row = sheet.createRow(rowNum++);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell = row.createCell(colNum);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellValue(11111.25);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">style = wb.createCellStyle();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">style.setDataFormat(format.getFormat("0.0"));</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellStyle(style);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">row = sheet.createRow(rowNum++);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell = row.createCell(colNum);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellValue(11111.25);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">style = wb.createCellStyle();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">style.setDataFormat(format.getFormat("#,##0.0000"));</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellStyle(style);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">try (OutputStream fileOut = new FileOutputStream("workbook.xls")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> wb.write(fileOut);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">wb.close();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<a name="FitTo" id="FitTo"></a><a name="Fit+Sheet+to+One+Page"></a>
<h4>Fit Sheet to One Page</h4>
<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">Workbook wb = new HSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet = wb.createSheet("format sheet");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">PrintSetup ps = sheet.getPrintSetup();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet.setAutobreaks(true);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">ps.setFitHeight((short)1);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">ps.setFitWidth((short)1);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Create various cells and rows for spreadsheet.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">try (OutputStream fileOut = new FileOutputStream("workbook.xls")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> wb.write(fileOut);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">wb.close();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<a name="PrintArea2" id="PrintArea2"></a><a name="Set+Print+Area"></a>
<h4>Set Print Area</h4>
<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">Workbook wb = new HSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet = wb.createSheet("Sheet1");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//sets the print area for the first sheet</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">wb.setPrintArea(0, "$A$1:$C$2");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//Alternatively:</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">wb.setPrintArea(</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> 0, //sheet index</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> 0, //start column</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> 1, //end column</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> 0, //start row</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> 0 //end row</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">try (OutputStream fileOut = new FileOutputStream("workbook.xls")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> wb.write(fileOut);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">wb.close();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<a name="FooterPageNumbers" id="FooterPageNumbers"></a><a name="Set+Page+Numbers+on+Footer"></a>
<h4>Set Page Numbers on Footer</h4>
<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">Workbook wb = new HSSFWorkbook(); // or new XSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet = wb.createSheet("format sheet");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Footer footer = sheet.getFooter();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">footer.setRight( "Page " + HeaderFooter.page() + " of " + HeaderFooter.numPages() );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Create various cells and rows for spreadsheet.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">try (OutputStream fileOut = new FileOutputStream("workbook.xls")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> wb.write(fileOut);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">wb.close();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<a name="ConvenienceFunctions" id="ConvenienceFunctions"></a><a name="Using+the+Convenience+Functions"></a>
<h4>Using the Convenience Functions</h4>
<p>
The convenience functions provide
utility features such as setting borders around merged
regions and changing style attributes without explicitly
creating new styles.
</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">Workbook wb = new HSSFWorkbook(); // or new XSSFWorkbook()</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet1 = wb.createSheet( "new sheet" );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Create a merged region</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Row row = sheet1.createRow( 1 );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Row row2 = sheet1.createRow( 2 );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Cell cell = row.createCell( 1 );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellValue( "This is a test of merging" );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">CellRangeAddress region = CellRangeAddress.valueOf("B2:E5");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet1.addMergedRegion( region );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Set the border and border colors.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">RegionUtil.setBorderBottom( BorderStyle.MEDIUM_DASHED, region, sheet1, wb );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">RegionUtil.setBorderTop( BorderStyle.MEDIUM_DASHED, region, sheet1, wb );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">RegionUtil.setBorderLeft( BorderStyle.MEDIUM_DASHED, region, sheet1, wb );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">RegionUtil.setBorderRight( BorderStyle.MEDIUM_DASHED, region, sheet1, wb );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">RegionUtil.setBottomBorderColor(IndexedColors.AQUA.getIndex(), region, sheet1, wb);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">RegionUtil.setTopBorderColor( IndexedColors.AQUA.getIndex(), region, sheet1, wb);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">RegionUtil.setLeftBorderColor( IndexedColors.AQUA.getIndex(), region, sheet1, wb);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">RegionUtil.setRightBorderColor( IndexedColors.AQUA.getIndex(), region, sheet1, wb);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Shows some usages of HSSFCellUtil</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">CellStyle style = wb.createCellStyle();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">style.setIndention((short)4);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">CellUtil.createCell(row, 8, "This is the value of the cell", style);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Cell cell2 = CellUtil.createCell( row2, 8, "This is the value of the cell");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">CellUtil.setAlignment(cell2, HorizontalAlignment.CENTER);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Write out the workbook</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">try (OutputStream fileOut = new FileOutputStream( "workbook.xls" )) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> wb.write( fileOut );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">wb.close();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<a name="ShiftRows" id="ShiftRows"></a><a name="Shift+rows+up+or+down+on+a+sheet"></a>
<h4>Shift rows up or down on a sheet</h4>
<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">Workbook wb = new HSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet = wb.createSheet("row sheet");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Create various cells and rows for spreadsheet.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Shift rows 6 - 11 on the spreadsheet to the top (rows 0 - 5)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet.shiftRows(5, 10, -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"> </span>
</div>
</div>
<a name="SelectSheet" id="SelectSheet"></a><a name="Set+a+sheet+as+selected"></a>
<h4>Set a sheet as selected</h4>
<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">Workbook wb = new HSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet = wb.createSheet("row sheet");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet.setSelected(true);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<a name="Zoom" id="Zoom"></a><a name="Set+the+zoom+magnification"></a>
<h4>Set the zoom magnification</h4>
<p>
The zoom is expressed as a fraction. For example to
express a zoom of 75% use 3 for the numerator and
4 for the denominator.
</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">Workbook wb = new HSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet1 = wb.createSheet("new sheet");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet1.setZoom(75); // 75 percent magnification</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<a name="Splits" id="Splits"></a><a name="Splits+and+freeze+panes"></a>
<h4>Splits and freeze panes</h4>
<p>
There are two types of panes you can create; freeze panes and split panes.
</p>
<p>
A freeze pane is split by columns and rows. You create
a freeze pane using the following mechanism:
</p>
<p>
sheet1.createFreezePane( 3, 2, 3, 2 );
</p>
<p>
The first two parameters are the columns and rows you
wish to split by. The second two parameters indicate
the cells that are visible in the bottom right quadrant.
</p>
<p>
Split panes appear differently. The split area is
divided into four separate work area's. The split
occurs at the pixel level and the user is able to
adjust the split by dragging it to a new position.
</p>
<p>
Split panes are created with the following call:
</p>
<p>
sheet2.createSplitPane( 2000, 2000, 0, 0, Sheet.PANE_LOWER_LEFT );
</p>
<p>
The first parameter is the x position of the split.
This is in 1/20th of a point. A point in this case
seems to equate to a pixel. The second parameter is
the y position of the split. Again in 1/20th of a point.
</p>
<p>
The last parameter indicates which pane currently has
the focus. This will be one of Sheet.PANE_LOWER_LEFT,
PANE_LOWER_RIGHT, PANE_UPPER_RIGHT or PANE_UPPER_LEFT.
</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">Workbook wb = new HSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet1 = wb.createSheet("new sheet");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet2 = wb.createSheet("second sheet");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet3 = wb.createSheet("third sheet");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet4 = wb.createSheet("fourth sheet");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Freeze just one row</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet1.createFreezePane( 0, 1, 0, 1 );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Freeze just one column</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet2.createFreezePane( 1, 0, 1, 0 );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Freeze the columns and rows (forget about scrolling position of the lower right quadrant).</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet3.createFreezePane( 2, 2 );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Create a split with the lower left side being the active quadrant</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet4.createSplitPane( 2000, 2000, 0, 0, Sheet.PANE_LOWER_LEFT );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">try (OutputStream fileOut = new FileOutputStream("workbook.xls")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> wb.write(fileOut);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<a name="Repeating" id="Repeating"></a><a name="Repeating+rows+and+columns"></a>
<h4>Repeating rows and columns</h4>
<p>
It's possible to set up repeating rows and columns in
your printouts by using the setRepeatingRows() and
setRepeatingColumns() methods in the Sheet class.
</p>
<p>
These methods expect a CellRangeAddress parameter
which specifies the range for the rows or columns to
repeat.
For setRepeatingRows(), it should specify a range of
rows to repeat, with the column part spanning all
columns.
For setRepeatingColumns(), it should specify a range of
columns to repeat, with the row part spanning all
rows.
If the parameter is null, the repeating rows or columns
will be removed.
</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">Workbook wb = new HSSFWorkbook(); // or new XSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet1 = wb.createSheet("Sheet1");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet2 = wb.createSheet("Sheet2");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Set the rows to repeat from row 4 to 5 on the first sheet.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet1.setRepeatingRows(CellRangeAddress.valueOf("4:5"));</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Set the columns to repeat from column A to C on the second sheet</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet2.setRepeatingColumns(CellRangeAddress.valueOf("A:C"));</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">try (OutputStream fileOut = new FileOutputStream("workbook.xls")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> wb.write(fileOut);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<a name="HeaderFooter" id="HeaderFooter"></a><a name="Headers+and+Footers"></a>
<h4>Headers and Footers</h4>
<p>
Example is for headers but applies directly to footers.
</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">Workbook wb = new HSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet = wb.createSheet("new sheet");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Header header = sheet.getHeader();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">header.setCenter("Center Header");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">header.setLeft("Left Header");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">header.setRight(HSSFHeader.font("Stencil-Normal", "Italic") +</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> HSSFHeader.fontSize((short) 16) + "Right w/ Stencil-Normal Italic font and size 16");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">try (OutputStream fileOut = new FileOutputStream("workbook.xls")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> wb.write(fileOut);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<a name="XSSFHeaderFooter" id="XSSFHeaderFooter"></a><a name="XSSF+Enhancement+for+Headers+and+Footers"></a>
<h4>XSSF Enhancement for Headers and Footers</h4>
<p>
Example is for headers but applies directly to footers. Note, the above example for
basic headers and footers applies to XSSF Workbooks as well as HSSF Workbooks. The HSSFHeader
stuff does not work for XSSF Workbooks.
</p>
<p>
XSSF has the ability to handle First page headers and footers, as well as Even/Odd
headers and footers. All Header/Footer Property flags can be handled in XSSF as well.
The odd header and footer is the default header and footer. It is displayed on all
pages that do not display either a first page header or an even page header. That is,
if the Even header/footer does not exist, then the odd header/footer is displayed on
even pages. If the first page header/footer does not exist, then the odd header/footer
is displayed on the first page. If the even/odd property is not set, that is the same as
the even header/footer not existing. If the first page property does not exist, that is
the same as the first page header/footer not existing.
</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">Workbook wb = new XSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">XSSFSheet sheet = (XSSFSheet) wb.createSheet("new sheet");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Create a first page header</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Header header = sheet.getFirstHeader();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">header.setCenter("Center First Page Header");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">header.setLeft("Left First Page Header");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">header.setRight("Right First Page Header");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Create an even page header</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Header header2 = sheet.getEvenHeader();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">der2.setCenter("Center Even Page Header");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">header2.setLeft("Left Even Page Header");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">header2.setRight("Right Even Page Header");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Create an odd page header</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Header header3 = sheet.getOddHeader();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">der3.setCenter("Center Odd Page Header");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">header3.setLeft("Left Odd Page Header");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">header3.setRight("Right Odd Page Header");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Set/Remove Header properties</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">XSSFHeaderProperties prop = sheet.getHeaderFooterProperties();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">prop.setAlignWithMargins();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">prop.scaleWithDoc();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">prop.removeDifferentFirstPage(); // This does not remove first page headers or footers</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">prop.removeDifferentEvenOdd(); // This does not remove even headers or footers</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">try (OutputStream fileOut = new FileOutputStream("workbook.xlsx")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> wb.write(fileOut);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<a name="DrawingShapes" id="DrawingShapes"></a><a name="Drawing+Shapes"></a>
<h4>Drawing Shapes</h4>
<p>
POI supports drawing shapes using the Microsoft Office
drawing tools. Shapes on a sheet are organized in a
hierarchy of groups and and shapes. The top-most shape
is the patriarch. This is not visible on the sheet
at all. To start drawing you need to call <span class="codefrag">createPatriarch</span>
on the <span class="codefrag">HSSFSheet</span> class. This has the
effect erasing any other shape information stored
in that sheet. By default POI will leave shape
records alone in the sheet unless you make a call to
this method.
</p>
<p>
To create a shape you have to go through the following
steps:
</p>
<ol>
<li>Create the patriarch.</li>
<li>Create an anchor to position the shape on the sheet.</li>
<li>Ask the patriarch to create the shape.</li>
<li>Set the shape type (line, oval, rectangle etc...)</li>
<li>Set any other style details concerning the shape. (eg:
line thickness, etc...)</li>
</ol>
<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">HSSFPatriarch patriarch = sheet.createDrawingPatriarch();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">a = new HSSFClientAnchor( 0, 0, 1023, 255, (short) 1, 0, (short) 1, 0 );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">HSSFSimpleShape shape1 = patriarch.createSimpleShape(a1);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">shape1.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p>
Text boxes are created using a different call:
</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">HSSFTextbox textbox1 = patriarch.createTextbox(</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> new HSSFClientAnchor(0,0,0,0,(short)1,1,(short)2,2));</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">textbox1.setString(new HSSFRichTextString("This is a test") );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p>
It's possible to use different fonts to style parts of
the text in the textbox. Here's how:
</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">HSSFFont font = wb.createFont();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">font.setItalic(true);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">font.setUnderline(HSSFFont.U_DOUBLE);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">HSSFRichTextString string = new HSSFRichTextString("Woo!!!");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">string.applyFont(2,5,font);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">textbox.setString(string );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p>
Just as can be done manually using Excel, it is possible
to group shapes together. This is done by calling
<span class="codefrag">createGroup()</span> and then creating the shapes
using those groups.
</p>
<p>
It's also possible to create groups within groups.
</p>
<div class="warning">
<div class="label">Warning</div>
<div class="content">Any group you create should contain at least two
other shapes or subgroups.</div>
</div>
<p>
Here's how to create a shape group:
</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">// Create a shape group.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">HSSFShapeGroup group = patriarch.createGroup(</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> new HSSFClientAnchor(0,0,900,200,(short)2,2,(short)2,2));</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Create a couple of lines in the group.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">HSSFSimpleShape shape1 = group.createShape(new HSSFChildAnchor(3,3,500,500));</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">shape1.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">( (HSSFChildAnchor) shape1.getAnchor() ).setAnchor(3,3,500,500);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">HSSFSimpleShape shape2 = group.createShape(new HSSFChildAnchor(1,200,400,600));</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">shape2.setShapeType(HSSFSimpleShape.OBJECT_TYPE_LINE);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p>
If you're being observant you'll noticed that the shapes
that are added to the group use a new type of anchor:
the <span class="codefrag">HSSFChildAnchor</span>. What happens is that
the created group has its own coordinate space for
shapes that are placed into it. POI defaults this to
(0,0,1023,255) but you are able to change it as desired.
Here's how:
</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">myGroup.setCoordinates(10,10,20,20); // top-left, bottom-right</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p>
If you create a group within a group it's also going
to have its own coordinate space.
</p>
<a name="StylingShapes" id="StylingShapes"></a><a name="Styling+Shapes"></a>
<h4>Styling Shapes</h4>
<p>
By default shapes can look a little plain. It's possible
to apply different styles to the shapes however. The
sorts of things that can currently be done are:
</p>
<ul>
<li>Change the fill color.</li>
<li>Make a shape with no fill color.</li>
<li>Change the thickness of the lines.</li>
<li>Change the style of the lines. Eg: dashed, dotted.</li>
<li>Change the line color.</li>
</ul>
<p>
Here's an examples of how this is done:
</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">HSSFSimpleShape s = patriarch.createSimpleShape(a);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">s.setShapeType(HSSFSimpleShape.OBJECT_TYPE_OVAL);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">s.setLineStyleColor(10,10,10);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">s.setFillColor(90,10,200);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">s.setLineWidth(HSSFShape.LINEWIDTH_ONE_PT * 3);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">s.setLineStyle(HSSFShape.LINESTYLE_DOTSYS);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<a name="Graphics2d" id="Graphics2d"></a><a name="Shapes+and+Graphics2d"></a>
<h4>Shapes and Graphics2d</h4>
<p>
While the native POI shape drawing commands are the
recommended way to draw shapes in a shape it's sometimes
desirable to use a standard API for compatibility with
external libraries. With this in mind we created some
wrappers for <span class="codefrag">Graphics</span> and <span class="codefrag">Graphics2d</span>.
</p>
<div class="warning">
<div class="label">Warning</div>
<div class="content">
It's important to not however before continuing that
<span class="codefrag">Graphics2d</span> is a poor match to the capabilities
of the Microsoft Office drawing commands. The older
<span class="codefrag">Graphics</span> class offers a closer match but is
still a square peg in a round hole.
</div>
</div>
<p>
All Graphics commands are issued into an <span class="codefrag">HSSFShapeGroup</span>.
Here's how it's done:
</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">a = new HSSFClientAnchor( 0, 0, 1023, 255, (short) 1, 0, (short) 1, 0 );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">group = patriarch.createGroup( a );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">group.setCoordinates( 0, 0, 80 * 4 , 12 * 23 );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">float verticalPointsPerPixel = a.getAnchorHeightInPoints(sheet) / (float)Math.abs(group.getY2() - group.getY1());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">g = new EscherGraphics( group, wb, Color.black, verticalPointsPerPixel );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">g2d = new EscherGraphics2d( g );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">drawChemicalStructure( g2d );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p>
The first thing we do is create the group and set its coordinates
to match what we plan to draw. Next we calculate a reasonable
fontSizeMultiplier then create the EscherGraphics object.
Since what we really want is a <span class="codefrag">Graphics2d</span>
object we create an EscherGraphics2d object and pass in
the graphics object we created. Finally we call a routine
that draws into the EscherGraphics2d object.
</p>
<p>
The vertical points per pixel deserves some more explanation.
One of the difficulties in converting Graphics calls
into escher drawing calls is that Excel does not have
the concept of absolute pixel positions. It measures
its cell widths in 'characters' and the cell heights in points.
Unfortunately it's not defined exactly what type of character it's
measuring. Presumably this is due to the fact that the Excel will be
using different fonts on different platforms or even within the same
platform.
</p>
<p>
Because of this constraint we've had to implement the concept of a
verticalPointsPerPixel. This the amount the font should be scaled by when
you issue commands such as drawString(). To calculate this value
use the follow formula:
</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">multipler = groupHeightInPoints / heightOfGroup</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p>
The height of the group is calculated fairly simply by calculating the
difference between the y coordinates of the bounding box of the shape. The
height of the group can be calculated by using a convenience called
<span class="codefrag">HSSFClientAnchor.getAnchorHeightInPoints()</span>.
</p>
<p>
Many of the functions supported by the graphics classes
are not complete. Here's some of the functions that are known
to work.
</p>
<ul>
<li>fillRect()</li>
<li>fillOval()</li>
<li>drawString()</li>
<li>drawOval()</li>
<li>drawLine()</li>
<li>clearRect()</li>
</ul>
<p>
Functions that are not supported will return and log a message
using the POI logging infrastructure (disabled by default).
</p>
<a name="Outlining" id="Outlining"></a><a name="Outlining-N118D8"></a>
<h4>Outlining</h4>
<p>
Outlines are great for grouping sections of information
together and can be added easily to columns and rows
using the POI API. Here's how:
</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">Workbook wb = new HSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet1 = wb.createSheet("new sheet");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet1.groupRow( 5, 14 );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet1.groupRow( 7, 14 );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet1.groupRow( 16, 19 );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet1.groupColumn( 4, 7 );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet1.groupColumn( 9, 12 );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet1.groupColumn( 10, 11 );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">try (OutputStream fileOut = new FileOutputStream(filename)) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> wb.write(fileOut);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p>
To collapse (or expand) an outline use the following calls:
</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">sheet1.setRowGroupCollapsed( 7, true );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet1.setColumnGroupCollapsed( 4, true );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p>
The row/column you choose should contain an already
created group. It can be anywhere within the group.
</p>
</div>
<a name="Images" id="Images"></a>
<a name="Images-N1197A"></a>
<h2 class="boxed">Images</h2>
<div class="section">
<p>
Images are part of the drawing support. To add an image just
call <span class="codefrag">createPicture()</span> on the drawing patriarch.
At the time of writing the following types are supported:
</p>
<ul>
<li>PNG</li>
<li>JPG</li>
<li>DIB</li>
</ul>
<p>
It should be noted that any existing drawings may be erased
once you add an image to a sheet.
</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">//create a new workbook</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Workbook wb = new XSSFWorkbook(); //or new HSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//add picture data to this workbook.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">InputStream is = new FileInputStream("image1.jpeg");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">byte[] bytes = IOUtils.toByteArray(is);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">int pictureIdx = wb.addPicture(bytes, Workbook.PICTURE_TYPE_JPEG);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">is.close();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">CreationHelper helper = wb.getCreationHelper();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//create sheet</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet = wb.createSheet();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Create the drawing patriarch. This is the top level container for all shapes.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Drawing drawing = sheet.createDrawingPatriarch();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//add a picture shape</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">ClientAnchor anchor = helper.createClientAnchor();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//set top-left corner of the picture,</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//subsequent call of Picture#resize() will operate relative to it</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">anchor.setCol1(3);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">anchor.setRow1(2);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Picture pict = drawing.createPicture(anchor, pictureIdx);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//auto-size picture relative to its top-left corner</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">pict.resize();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//save workbook</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">String file = "picture.xls";</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">if(wb instanceof XSSFWorkbook) file += "x";</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">try (OutputStream fileOut = new FileOutputStream(file)) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> wb.write(fileOut);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<div class="warning">
<div class="label">Warning</div>
<div class="content">
Picture.resize() works only for JPEG and PNG. Other formats are not yet supported.
</div>
</div>
<p>Reading images from a workbook:</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"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">ist lst = workbook.getAllPictures();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">or (Iterator it = lst.iterator(); it.hasNext(); ) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> PictureData pict = (PictureData)it.next();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> String ext = pict.suggestFileExtension();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> byte[] data = pict.getData();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> if (ext.equals("jpeg")){</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> try (OutputStream out = new FileOutputStream("pict.jpg")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> out.write(data);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> }</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> }</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
</div>
<a name="NamedRanges" id="NamedRanges"></a>
<a name="Named+Ranges+and+Named+Cells"></a>
<h2 class="boxed">Named Ranges and Named Cells</h2>
<div class="section">
<p>
Named Range is a way to refer to a group of cells by a name. Named Cell is a
degenerate case of Named Range in that the 'group of cells' contains exactly one
cell. You can create as well as refer to cells in a workbook by their named range.
When working with Named Ranges, the classes <span class="codefrag">org.apache.poi.ss.util.CellReference</span>
and <span class="codefrag">org.apache.poi.ss.util.AreaReference</span> are used.
</p>
<p>
Note: Using relative values like 'A1:B1' can lead to unexpected moving of
the cell that the name points to when working with the workbook in Microsoft Excel,
usually using absolute references like '$A$1:$B$1' avoids this, see also
<a href="https://superuser.com/a/1031047/126954">this discussion</a>.
</p>
<p>
Creating Named Range / Named Cell
</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">// setup code</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">String sname = "TestSheet", cname = "TestName", cvalue = "TestVal";</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Workbook wb = new HSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet = wb.createSheet(sname);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet.createRow(0).createCell(0).setCellValue(cvalue);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// 1. create named range for a single cell using areareference</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Name namedCell = wb.createName();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">namedCell.setNameName(cname + "1");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">String reference = sname+"!$A$1:$A$1"; // area reference</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">namedCell.setRefersToFormula(reference);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// 2. create named range for a single cell using cellreference</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Name namedCel2 = wb.createName();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">namedCel2.setNameName(cname + "2");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">reference = sname+"!$A$1"; // cell reference</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">namedCel2.setRefersToFormula(reference);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// 3. create named range for an area using AreaReference</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Name namedCel3 = wb.createName();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">namedCel3.setNameName(cname + "3");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">reference = sname+"!$A$1:$C$5"; // area reference</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">namedCel3.setRefersToFormula(reference);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// 4. create named formula</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Name namedCel4 = wb.createName();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">namedCel4.setNameName("my_sum");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">namedCel4.setRefersToFormula("SUM(" + sname + "!$I$2:$I$6)");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p>
Reading from Named Range / Named Cell
</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">// setup code</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">String cname = "TestName";</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Workbook wb = getMyWorkbook(); // retrieve workbook</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// retrieve the named range</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">int namedCellIdx = wb.getNameIndex(cellName);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Name aNamedCell = wb.getNameAt(namedCellIdx);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// retrieve the cell at the named range and test its contents</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">AreaReference aref = new AreaReference(aNamedCell.getRefersToFormula());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">CellReference[] crefs = aref.getAllReferencedCells();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">for (int i=0; i&lt;crefs.length; i++) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> Sheet s = wb.getSheet(crefs[i].getSheetName());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> Row r = sheet.getRow(crefs[i].getRow());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> Cell c = r.getCell(crefs[i].getCol());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // extract the cell contents based on cell type etc.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p>
Reading from non-contiguous Named Ranges
</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">// Setup code</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">String cname = "TestName";</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Workbook wb = getMyWorkbook(); // retrieve workbook</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Retrieve the named range</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Will be something like "$C$10,$D$12:$D$14";</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">int namedCellIdx = wb.getNameIndex(cellName);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Name aNamedCell = wb.getNameAt(namedCellIdx);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Retrieve the cell at the named range and test its contents</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Will get back one AreaReference for C10, and</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// another for D12 to D14</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">AreaReference[] arefs = AreaReference.generateContiguous(aNamedCell.getRefersToFormula());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">for (int i=0; i&lt;arefs.length; i++) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // Only get the corners of the Area</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // (use arefs[i].getAllReferencedCells() to get all cells)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> CellReference[] crefs = arefs[i].getCells();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> for (int j=0; j&lt;crefs.length; j++) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // Check it turns into real stuff</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> Sheet s = wb.getSheet(crefs[j].getSheetName());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> Row r = s.getRow(crefs[j].getRow());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> Cell c = r.getCell(crefs[j].getCol());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // Do something with this corner cell</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> }</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p>
Note, when a cell is deleted, Excel does not delete the
attached named range. As result, workbook can contain
named ranges that point to cells that no longer exist.
You should check the validity of a reference before
constructing AreaReference
</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">if(name.isDeleted()){</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> //named range points to a deleted cell.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">} else {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> AreaReference ref = new AreaReference(name.getRefersToFormula());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
</div>
<a name="CellComments" id="CellComments"></a>
<a name="Cell+Comments+-+HSSF+and+XSSF"></a>
<h2 class="boxed">Cell Comments - HSSF and XSSF</h2>
<div class="section">
<p>
A comment is a rich text note that is attached to &amp;
associated with a cell, separate from other cell content.
Comment content is stored separate from the cell, and is displayed in a drawing object (like a text box)
that is separate from, but associated with, a cell
</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">Workbook wb = new XSSFWorkbook(); //or new HSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">CreationHelper factory = wb.getCreationHelper();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet = wb.createSheet();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Row row = sheet.createRow(3);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Cell cell = row.createCell(5);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellValue("F4");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Drawing drawing = sheet.createDrawingPatriarch();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// When the comment box is visible, have it show in a 1x3 space</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">ClientAnchor anchor = factory.createClientAnchor();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">anchor.setCol1(cell.getColumnIndex());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">anchor.setCol2(cell.getColumnIndex()+1);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">anchor.setRow1(row.getRowNum());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">anchor.setRow2(row.getRowNum()+3);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Create the comment and set the text+author</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Comment comment = drawing.createCellComment(anchor);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">RichTextString str = factory.createRichTextString("Hello, World!");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">comment.setString(str);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">comment.setAuthor("Apache POI");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Assign the comment to the cell</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellComment(comment);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">String fname = "comment-xssf.xls";</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">if(wb instanceof XSSFWorkbook) fname += "x";</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">try (OutputStream out = new FileOutputStream(fname)) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> wb.write(out);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">wb.close();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p>
Reading cell comments
</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">Cell cell = sheet.get(3).getColumn(1);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Comment comment = cell.getCellComment();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">if (comment != null) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> RichTextString str = comment.getString();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> String author = comment.getAuthor();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// alternatively you can retrieve cell comments by (row, column)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">comment = sheet.getCellComment(3, 1);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
</div>
<p>To get all the comments on a sheet:</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">Map&lt;CellAddress, Comment&gt; comments = sheet.getCellComments();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Comment commentA1 = comments.get(new CellAddress(0, 0));</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Comment commentB1 = comments.get(new CellAddress(0, 1));</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">for (Entry&lt;CellAddress, ? extends Comment&gt; e : comments.entrySet()) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> CellAddress loc = e.getKey();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> Comment comment = e.getValue();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> System.out.println("Comment at " + loc + ": " +</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> "[" + comment.getAuthor() + "] " + comment.getString().getString());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
</div>
</div>
<a name="Autofit" id="Autofit"></a>
<a name="Adjust+column+width+to+fit+the+contents"></a>
<h2 class="boxed">Adjust column width to fit the contents</h2>
<div class="section">
<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">Sheet sheet = workbook.getSheetAt(0);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet.autoSizeColumn(0); //adjust width of the first column</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet.autoSizeColumn(1); //adjust width of the second column</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p>
For SXSSFWorkbooks only, because the random access window is likely to exclude most of the rows
in the worksheet, which are needed for computing the best-fit width of a column, the columns must
be tracked for auto-sizing prior to flushing any rows.
</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">SXSSFWorkbook workbook = new SXSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">SXSSFSheet sheet = workbook.createSheet();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet.trackColumnForAutoSizing(0);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet.trackColumnForAutoSizing(1);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// If you have a Collection of column indices, see SXSSFSheet#trackColumnForAutoSizing(Collection&lt;Integer&gt;)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// or roll your own for-loop.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Alternatively, use SXSSFSheet#trackAllColumnsForAutoSizing() if the columns that will be auto-sized aren't</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// known in advance or you are upgrading existing code and are trying to minimize changes. Keep in mind</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// that tracking all columns will require more memory and CPU cycles, as the best-fit width is calculated</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// on all tracked columns on every row that is flushed.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// create some cells</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">for (int r=0; r &lt; 10; r++) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> Row row = sheet.createRow(r);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> for (int c; c &lt; 10; c++) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> Cell cell = row.createCell(c);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> cell.setCellValue("Cell " + c.getAddress().formatAsString());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> }</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Auto-size the columns.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet.autoSizeColumn(0);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet.autoSizeColumn(1);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
</div>
<p>
Note, that Sheet#autoSizeColumn() does not evaluate formula cells,
the width of formula cells is calculated based on the cached formula result.
If your workbook has many formulas then it is a good idea to evaluate them before auto-sizing.
</p>
<div class="warning">
<div class="label">Warning</div>
<div class="content">
To calculate column width Sheet.autoSizeColumn uses Java2D classes
that throw exception if graphical environment is not available. In case if graphical environment
is not available, you must tell Java that you are running in headless mode and
set the following system property: <span class="codefrag"> java.awt.headless=true </span>.
You should also ensure that the fonts you use in your workbook are
available to Java.
</div>
</div>
</div>
<a name="Hyperlinks" id="Hyperlinks"></a>
<a name="How+to+read+hyperlinks"></a>
<h2 class="boxed">How to read hyperlinks</h2>
<div class="section">
<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">Sheet sheet = workbook.getSheetAt(0);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Cell cell = sheet.getRow(0).getCell(0);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Hyperlink link = cell.getHyperlink();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">if(link != null){</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> System.out.println(link.getAddress());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
</div>
<a name="How+to+create+hyperlinks"></a>
<h2 class="boxed">How to create hyperlinks</h2>
<div class="section">
<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">Workbook wb = new XSSFWorkbook(); //or new HSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">CreationHelper createHelper = wb.getCreationHelper();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//cell style for hyperlinks</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//by default hyperlinks are blue and underlined</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">CellStyle hlink_style = wb.createCellStyle();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Font hlink_font = wb.createFont();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">hlink_font.setUnderline(Font.U_SINGLE);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">hlink_font.setColor(IndexedColors.BLUE.getIndex());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">hlink_style.setFont(hlink_font);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Cell cell;</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet = wb.createSheet("Hyperlinks");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//URL</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell = sheet.createRow(0).createCell(0);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellValue("URL Link");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Hyperlink link = createHelper.createHyperlink(HyperlinkType.URL);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">link.setAddress("https://poi.apache.org/");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setHyperlink(link);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellStyle(hlink_style);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//link to a file in the current directory</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell = sheet.createRow(1).createCell(0);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellValue("File Link");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">link = createHelper.createHyperlink(HyperlinkType.FILE);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">link.setAddress("link1.xls");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setHyperlink(link);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellStyle(hlink_style);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//e-mail link</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell = sheet.createRow(2).createCell(0);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellValue("Email Link");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">link = createHelper.createHyperlink(HyperlinkType.EMAIL);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//note, if subject contains white spaces, make sure they are url-encoded</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">link.setAddress("mailto:poi@apache.org?subject=Hyperlinks");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setHyperlink(link);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellStyle(hlink_style);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//link to a place in this workbook</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//create a target sheet and cell</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet2 = wb.createSheet("Target Sheet");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet2.createRow(0).createCell(0).setCellValue("Target Cell");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell = sheet.createRow(3).createCell(0);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellValue("Worksheet Link");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Hyperlink link2 = createHelper.createHyperlink(HyperlinkType.DOCUMENT);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">link2.setAddress("'Target Sheet'!A1");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setHyperlink(link2);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellStyle(hlink_style);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">try (OutputStream out = new FileOutputStream("hyperinks.xlsx")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> wb.write(out);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">wb.close();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
</div>
<a name="Validation" id="Validation"></a>
<a name="Data+Validations"></a>
<h2 class="boxed">Data Validations</h2>
<div class="section">
<p>
As of version 3.8, POI has slightly different syntax to work with data validations with .xls and .xlsx formats.
</p>
<a name="hssf.usermodel+%28binary+.xls+format%29"></a>
<h3 class="boxed">hssf.usermodel (binary .xls format)</h3>
<p>
<strong>Check the value a user enters into a cell against one or more predefined value(s).</strong>
</p>
<p>The following code will limit the value the user can enter into cell A1 to one of three integer values, 10, 20 or 30.</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">HSSFWorkbook workbook = new HSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">HSSFSheet sheet = workbook.createSheet("Data Validation");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">CellRangeAddressList addressList = new CellRangeAddressList(</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> 0, 0, 0, 0);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">DVConstraint dvConstraint = DVConstraint.createExplicitListConstraint(</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> new String[]{"10", "20", "30"});</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">DataValidation dataValidation = new HSSFDataValidation</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> (addressList, dvConstraint);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">dataValidation.setSuppressDropDownArrow(true);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet.addValidationData(dataValidation);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p>
<strong> Drop Down Lists:</strong>
</p>
<p>This code will do the same but offer the user a drop down list to select a value from.</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">HSSFWorkbook workbook = new HSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">HSSFSheet sheet = workbook.createSheet("Data Validation");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">CellRangeAddressList addressList = new CellRangeAddressList(</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> 0, 0, 0, 0);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">DVConstraint dvConstraint = DVConstraint.createExplicitListConstraint(</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> new String[]{"10", "20", "30"});</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">DataValidation dataValidation = new HSSFDataValidation</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> (addressList, dvConstraint);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">dataValidation.setSuppressDropDownArrow(false);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet.addValidationData(dataValidation);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p>
<strong>Messages On Error:</strong>
</p>
<p>To create a message box that will be shown to the user if the value they enter is invalid.</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">dataValidation.setErrorStyle(DataValidation.ErrorStyle.STOP);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">dataValidation.createErrorBox("Box Title", "Message Text");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p>Replace 'Box Title' with the text you wish to display in the message box's title bar
and 'Message Text' with the text of your error message.</p>
<p>
<strong>Prompts:</strong>
</p>
<p>To create a prompt that the user will see when the cell containing the data validation receives focus</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">dataValidation.createPromptBox("Title", "Message Text");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">dataValidation.setShowPromptBox(true);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p>The text encapsulated in the first parameter passed to the createPromptBox() method will appear emboldened
and as a title to the prompt whilst the second will be displayed as the text of the message.
The createExplicitListConstraint() method can be passed and array of String(s) containing interger, floating point, dates or text values.</p>
<p>
<strong>Further Data Validations:</strong>
</p>
<p>To obtain a validation that would check the value entered was, for example, an integer between 10 and 100,
use the DVConstraint.createNumericConstraint(int, int, String, String) factory method.</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">dvConstraint = DVConstraint.createNumericConstraint(</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> DVConstraint.ValidationType.INTEGER,</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> DVConstraint.OperatorType.BETWEEN, "10", "100");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p>Look at the javadoc for the other validation and operator types; also note that not all validation
types are supported for this method. The values passed to the two String parameters can be formulas; the '=' symbol is used to denote a formula</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">dvConstraint = DVConstraint.createNumericConstraint(</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> DVConstraint.ValidationType.INTEGER,</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> DVConstraint.OperatorType.BETWEEN, "=SUM(A1:A3)", "100");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p>It is not possible to create a drop down list if the createNumericConstraint() method is called,
the setSuppressDropDownArrow(false) method call will simply be ignored.</p>
<p>Date and time constraints can be created by calling the createDateConstraint(int, String, String, String)
or the createTimeConstraint(int, String, String). Both are very similar to the above and are explained in the javadoc. </p>
<p>
<strong>Creating Data Validations From Spreadsheet Cells.</strong>
</p>
<p>The contents of specific cells can be used to provide the values for the data validation
and the DVConstraint.createFormulaListConstraint(String) method supports this.
To specify that the values come from a contiguous range of cells do either of the following:</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">dvConstraint = DVConstraint.createFormulaListConstraint("$A$1:$A$3");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p>or</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">Name namedRange = workbook.createName();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">namedRange.setNameName("list1");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">namedRange.setRefersToFormula("$A$1:$A$3");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">dvConstraint = DVConstraint.createFormulaListConstraint("list1");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p>and in both cases the user will be able to select from a drop down list containing the values from cells A1, A2 and A3.</p>
<p>The data does not have to be as the data validation. To select the data from a different sheet however, the sheet
must be given a name when created and that name should be used in the formula. So assuming the existence of a sheet named 'Data Sheet' this will work:</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">Name namedRange = workbook.createName();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">namedRange.setNameName("list1");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">namedRange.setRefersToFormula("'Data Sheet'!$A$1:$A$3");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">dvConstraint = DVConstraint.createFormulaListConstraint("list1");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p>as will this:</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">dvConstraint = DVConstraint.createFormulaListConstraint("'Data Sheet'!$A$1:$A$3");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p>whilst this will not:</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">Name namedRange = workbook.createName();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">namedRange.setNameName("list1");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">namedRange.setRefersToFormula("'Sheet1'!$A$1:$A$3");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">dvConstraint = DVConstraint.createFormulaListConstraint("list1");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p>and nor will this:</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">dvConstraint = DVConstraint.createFormulaListConstraint("'Sheet1'!$A$1:$A$3");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<a name="xssf.usermodel+%28.xlsx+format%29"></a>
<h3 class="boxed">xssf.usermodel (.xlsx format)</h3>
<p>
Data validations work similarly when you are creating an xml based, SpreadsheetML,
workbook file; but there are differences. Explicit casts are required, for example,
in a few places as much of the support for data validations in the xssf stream was
built into the unifying ss stream, of which more later. Other differences are
noted with comments in the code.
</p>
<p>
<strong>Check the value the user enters into a cell against one or more predefined value(s).</strong>
</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">XSSFWorkbook workbook = new XSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">XSSFSheet sheet = workbook.createSheet("Data Validation");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper(sheet);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> dvHelper.createExplicitListConstraint(new String[]{"11", "21", "31"});</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">CellRangeAddressList addressList = new CellRangeAddressList(0, 0, 0, 0);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">XSSFDataValidation validation =(XSSFDataValidation)dvHelper.createValidation(</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> dvConstraint, addressList);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Here the boolean value false is passed to the setSuppressDropDownArrow()</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// method. In the hssf.usermodel examples above, the value passed to this</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// method is true.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">validation.setSuppressDropDownArrow(false);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Note this extra method call. If this method call is omitted, or if the</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// boolean value false is passed, then Excel will not validate the value the</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// user enters into the cell.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">validation.setShowErrorBox(true);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet.addValidationData(validation);</span>
</div>
</div>
<p>
<strong>Drop Down Lists:</strong>
</p>
<p>This code will do the same but offer the user a drop down list to select a value from.</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">XSSFWorkbook workbook = new XSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">XSSFSheet sheet = workbook.createSheet("Data Validation");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper(sheet);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> dvHelper.createExplicitListConstraint(new String[]{"11", "21", "31"});</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">CellRangeAddressList addressList = new CellRangeAddressList(0, 0, 0, 0);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">XSSFDataValidation validation = (XSSFDataValidation)dvHelper.createValidation(</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> dvConstraint, addressList);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">validation.setShowErrorBox(true);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet.addValidationData(validation);</span>
</div>
</div>
<p>Note that the call to the setSuppressDropDowmArrow() method can either be simply excluded or replaced with:</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">validation.setSuppressDropDownArrow(true);</span>
</div>
</div>
<p>
<strong>Prompts and Error Messages:</strong>
</p>
<p>
These both exactly mirror the hssf.usermodel so please refer to the 'Messages On Error:' and 'Prompts:' sections above.
</p>
<p>
<strong>Further Data Validations:</strong>
</p>
<p>
To obtain a validation that would check the value entered was, for example,
an integer between 10 and 100, use the XSSFDataValidationHelper(s) createNumericConstraint(int, int, String, String) factory method.
</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"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">SSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> dvHelper.createNumericConstraint(</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> XSSFDataValidationConstraint.ValidationType.INTEGER,</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> XSSFDataValidationConstraint.OperatorType.BETWEEN,</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> "10", "100");</span>
</div>
</div>
<p>
The values passed to the final two String parameters can be formulas; the '=' symbol is used to denote a formula.
Thus, the following would create a validation the allows values only if they fall between the results of summing two cell ranges
</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">XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> dvHelper.createNumericConstraint(</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> XSSFDataValidationConstraint.ValidationType.INTEGER,</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> XSSFDataValidationConstraint.OperatorType.BETWEEN,</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> "=SUM(A1:A10)", "=SUM(B24:B27)");</span>
</div>
</div>
<p>
It is not possible to create a drop down list if the createNumericConstraint() method is called,
the setSuppressDropDownArrow(true) method call will simply be ignored.
</p>
<p>
Please check the javadoc for other constraint types as examples for those will not be included here.
There are, for example, methods defined on the XSSFDataValidationHelper class allowing you to create
the following types of constraint; date, time, decimal, integer, numeric, formula, text length and custom constraints.
</p>
<p>
<strong>Creating Data Validations From Spread Sheet Cells:</strong>
</p>
<p>
One other type of constraint not mentioned above is the formula list constraint.
It allows you to create a validation that takes it value(s) from a range of cells. This code
</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">XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> dvHelper.createFormulaListConstraint("$A$1:$F$1");</span>
</div>
</div>
<p>
would create a validation that took it's values from cells in the range A1 to F1.
</p>
<p>
The usefulness of this technique can be extended if you use named ranges like this;
</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">XSSFName name = workbook.createName();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">name.setNameName("data");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">name.setRefersToFormula("$B$1:$F$1");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">XSSFDataValidationHelper dvHelper = new XSSFDataValidationHelper(sheet);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">XSSFDataValidationConstraint dvConstraint = (XSSFDataValidationConstraint)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> dvHelper.createFormulaListConstraint("data");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">CellRangeAddressList addressList = new CellRangeAddressList(</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> 0, 0, 0, 0);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">XSSFDataValidation validation = (XSSFDataValidation)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> dvHelper.createValidation(dvConstraint, addressList);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">validation.setSuppressDropDownArrow(true);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">validation.setShowErrorBox(true);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet.addValidationData(validation);</span>
</div>
</div>
<p>
OpenOffice Calc has slightly different rules with regard to the scope of names.
Excel supports both Workbook and Sheet scope for a name but Calc does not, it seems only to support Sheet scope for a name.
Thus it is often best to fully qualify the name for the region or area something like this;
</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">XSSFName name = workbook.createName();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">name.setNameName("data");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">name.setRefersToFormula("'Data Validation'!$B$1:$F$1");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">....</span>
</div>
</div>
<p>
This does open a further, interesting opportunity however and that is to place all of the data for the validation(s) into named ranges of cells on a hidden sheet within the workbook. These ranges can then be explicitly identified in the setRefersToFormula() method argument.
</p>
<a name="ss.usermodel"></a>
<h3 class="boxed">ss.usermodel</h3>
<p>
The classes within the ss.usermodel package allow developers to create code that can be used
to generate both binary (.xls) and SpreadsheetML (.xlsx) workbooks.
</p>
<p>
The techniques used to create data validations share much in common with the xssf.usermodel examples above.
As a result just one or two examples will be presented here.
</p>
<p>
<strong>Check the value the user enters into a cell against one or more predefined value(s).</strong>
</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">Workbook workbook = new XSSFWorkbook(); // or new HSSFWorkbook</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet = workbook.createSheet("Data Validation");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">DataValidationHelper dvHelper = sheet.getDataValidationHelper();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">DataValidationConstraint dvConstraint = dvHelper.createExplicitListConstraint(</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> new String[]{"13", "23", "33"});</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">CellRangeAddressList addressList = new CellRangeAddressList(0, 0, 0, 0);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">DataValidation validation = dvHelper.createValidation(</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> dvConstraint, addressList);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Note the check on the actual type of the DataValidation object.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// If it is an instance of the XSSFDataValidation class then the</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// boolean value 'false' must be passed to the setSuppressDropDownArrow()</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// method and an explicit call made to the setShowErrorBox() method.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">if(validation instanceof XSSFDataValidation) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> validation.setSuppressDropDownArrow(false);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> validation.setShowErrorBox(true);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">else {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // If the Datavalidation contains an instance of the HSSFDataValidation</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // class then 'true' should be passed to the setSuppressDropDownArrow()</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // method and the call to setShowErrorBox() is not necessary.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> validation.setSuppressDropDownArrow(true);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet.addValidationData(validation);</span>
</div>
</div>
<p>
<strong>Drop Down Lists:</strong>
</p>
<p>This code will do the same but offer the user a drop down list to select a value from.</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">Workbook workbook = new XSSFWorkbook(); // or new HSSFWorkbook</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet = workbook.createSheet("Data Validation");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">DataValidationHelper dvHelper = sheet.getDataValidationHelper();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">DataValidationConstraint dvConstraint = dvHelper.createExplicitListConstraint(</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> new String[]{"13", "23", "33"});</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">CellRangeAddressList addressList = new CellRangeAddressList(0, 0, 0, 0);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">DataValidation validation = dvHelper.createValidation(</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> dvConstraint, addressList);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Note the check on the actual type of the DataValidation object.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// If it is an instance of the XSSFDataValidation class then the</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// boolean value 'false' must be passed to the setSuppressDropDownArrow()</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// method and an explicit call made to the setShowErrorBox() method.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">if(validation instanceof XSSFDataValidation) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> validation.setSuppressDropDownArrow(true);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> validation.setShowErrorBox(true);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">else {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // If the Datavalidation contains an instance of the HSSFDataValidation</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // class then 'true' should be passed to the setSuppressDropDownArrow()</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // method and the call to setShowErrorBox() is not necessary.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> validation.setSuppressDropDownArrow(false);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet.addValidationData(validation);</span>
</div>
</div>
<p>
<strong>Prompts and Error Messages:</strong>
</p>
<p>
These both exactly mirror the hssf.usermodel so please refer to the 'Messages On Error:' and 'Prompts:' sections above.
</p>
<p>
As the differences between the ss.usermodel and xssf.usermodel examples are small -
restricted largely to the way the DataValidationHelper is obtained, the lack of any
need to explicitly cast data types and the small difference in behaviour between
the hssf and xssf interpretation of the setSuppressDropDowmArrow() method,
no further examples will be included in this section.
</p>
<p>
<strong>Advanced Data Validations.</strong>
</p>
<p>
<strong>Dependent Drop Down Lists.</strong>
</p>
<p>
In some cases, it may be necessary to present to the user a sheet which contains more than one drop down list.
Further, the choice the user makes in one drop down list may affect the options that are presented to them in
the second or subsequent drop down lists. One technique that may be used to implement this behaviour will now be explained.
</p>
<p>
There are two keys to the technique; one is to use named areas or regions of cells to hold the data for the drop down lists,
the second is to use the INDIRECT() function to convert between the name and the actual addresses of the cells.
In the example section there is a complete working example- called LinkedDropDownLists.java -
that demonstrates how to create linked or dependent drop down lists. Only the more relevant points are explained here.
</p>
<p>
To create two drop down lists where the options shown in the second depend upon the selection made in the first,
begin by creating a named region of cells to hold all of the data for populating the first drop down list.
Next, create a data validation that will look to this named area for its data, something like this;
</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">CellRangeAddressList addressList = new CellRangeAddressList(0, 0, 0, 0);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">DataValidationHelper dvHelper = sheet.getDataValidationHelper();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">DataValidationConstraint dvConstraint = dvHelper.createFormulaListConstraint(</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> "CHOICES");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">DataValidation validation = dvHelper.createValidation(</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> dvConstraint, addressList);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet.addValidationData(validation);</span>
</div>
</div>
<p>
Note that the name of the area - in the example above it is 'CHOICES' -
is simply passed to the createFormulaListConstraint() method. This is sufficient
to cause Excel to populate the drop down list with data from that named region.
</p>
<p>
Next, for each of the options the user could select in the first drop down list,
create a matching named region of cells. The name of that region should match the
text the user could select in the first drop down list. Note, in the example,
all upper case letters are used in the names of the regions of cells.
</p>
<p>
Now, very similar code can be used to create a second, linked, drop down list;
</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">CellRangeAddressList addressList = new CellRangeAddressList(0, 0, 1, 1);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">DataValidationConstraint dvConstraint = dvHelper.createFormulaListConstraint(</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> "INDIRECT(UPPER($A$1))");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">DataValidation validation = dvHelper.createValidation(</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> dvConstraint, addressList);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet.addValidationData(validation);</span>
</div>
</div>
<p>
The key here is in the following Excel function - INDIRECT(UPPER($A$1)) - which is used to populate the second,
linked, drop down list. Working from the inner-most pair of brackets, it instructs Excel to look
at the contents of cell A1, to convert what it reads there into upper case &ndash; as upper case letters are used
in the names of each region - and then convert this name into the addresses of those cells that contain
the data to populate another drop down list.
</p>
</div>
<a name="Embedded" id="Embedded"></a>
<a name="Embedded+Objects"></a>
<h2 class="boxed">Embedded Objects</h2>
<div class="section">
<p>It is possible to perform more detailed processing of an embedded Excel, Word or PowerPoint document,
or to work with any other type of embedded object.</p>
<p>
<strong>HSSF:</strong>
</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">POIFSFileSystem fs = new POIFSFileSystem(new File("excel_with_embedded.xls"));</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">HSSFWorkbook workbook = new HSSFWorkbook(fs);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">for (HSSFObjectData obj : workbook.getAllEmbeddedObjects()) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> //the OLE2 Class Name of the object</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> String oleName = obj.getOLE2ClassName();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> if (oleName.equals("Worksheet")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> DirectoryNode dn = (DirectoryNode) obj.getDirectory();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> HSSFWorkbook embeddedWorkbook = new HSSFWorkbook(dn, false);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> //System.out.println(entry.getName() + ": " + embeddedWorkbook.getNumberOfSheets());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> } else if (oleName.equals("Document")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> DirectoryNode dn = (DirectoryNode) obj.getDirectory();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> HWPFDocument embeddedWordDocument = new HWPFDocument(dn);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> //System.out.println(entry.getName() + ": " + embeddedWordDocument.getRange().text());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> } else if (oleName.equals("Presentation")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> DirectoryNode dn = (DirectoryNode) obj.getDirectory();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> SlideShow&lt;?,?&gt; embeddedPowerPointDocument = new HSLFSlideShow(dn);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> //System.out.println(entry.getName() + ": " + embeddedPowerPointDocument.getSlides().length);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> } else {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> if(obj.hasDirectoryEntry()){</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // The DirectoryEntry is a DocumentNode. Examine its entries to find out what it is</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> DirectoryNode dn = (DirectoryNode) obj.getDirectory();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> for (Entry entry : dn) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> //System.out.println(oleName + "." + entry.getName());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> }</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> } else {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // There is no DirectoryEntry</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // Recover the object's data from the HSSFObjectData instance.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> byte[] objectData = obj.getObjectData();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> }</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> }</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p>
<strong>XSSF:</strong>
</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">XSSFWorkbook workbook = new XSSFWorkbook("excel_with_embeded.xlsx");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">for (PackagePart pPart : workbook.getAllEmbeddedParts()) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> String contentType = pPart.getContentType();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // Excel Workbook - either binary or OpenXML</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> if (contentType.equals("application/vnd.ms-excel")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> HSSFWorkbook embeddedWorkbook = new HSSFWorkbook(pPart.getInputStream());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> }</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // Excel Workbook - OpenXML file format</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> else if (contentType.equals("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> OPCPackage docPackage = OPCPackage.open(pPart.getInputStream());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> XSSFWorkbook embeddedWorkbook = new XSSFWorkbook(docPackage);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> }</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // Word Document - binary (OLE2CDF) file format</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> else if (contentType.equals("application/msword")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> HWPFDocument document = new HWPFDocument(pPart.getInputStream());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> }</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // Word Document - OpenXML file format</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> else if (contentType.equals("application/vnd.openxmlformats-officedocument.wordprocessingml.document")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> OPCPackage docPackage = OPCPackage.open(pPart.getInputStream());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> XWPFDocument document = new XWPFDocument(docPackage);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> }</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // PowerPoint Document - binary file format</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> else if (contentType.equals("application/vnd.ms-powerpoint")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> HSLFSlideShow slideShow = new HSLFSlideShow(pPart.getInputStream());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> }</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // PowerPoint Document - OpenXML file format</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> else if (contentType.equals("application/vnd.openxmlformats-officedocument.presentationml.presentation")) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> OPCPackage docPackage = OPCPackage.open(pPart.getInputStream());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> XSLFSlideShow slideShow = new XSLFSlideShow(docPackage);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> }</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> // Any other type of embedded object.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> else {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> System.out.println("Unknown Embedded Document: " + contentType);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> InputStream inputStream = pPart.getInputStream();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> }</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
</div>
<a name="Autofilter" id="Autofilter"></a>
<p>(Since POI-3.7)</p>
<a name="Autofilters"></a>
<h2 class="boxed">Autofilters</h2>
<div class="section">
<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">Workbook wb = new HSSFWorkbook(); //or new XSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet = wb.createSheet();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheet.setAutoFilter(CellRangeAddress.valueOf("C5:F200"));</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
</div>
<a name="ConditionalFormatting" id="ConditionalFormatting"></a>
<a name="Conditional+Formatting"></a>
<h2 class="boxed">Conditional Formatting</h2>
<div class="section">
<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">Workbook workbook = new HSSFWorkbook(); // or new XSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet = workbook.createSheet();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">SheetConditionalFormatting sheetCF = sheet.getSheetConditionalFormatting();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">ConditionalFormattingRule rule1 = sheetCF.createConditionalFormattingRule(ComparisonOperator.EQUAL, "0");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">FontFormatting fontFmt = rule1.createFontFormatting();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">fontFmt.setFontStyle(true, false);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">fontFmt.setFontColorIndex(IndexedColors.DARK_RED.index);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">BorderFormatting bordFmt = rule1.createBorderFormatting();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">bordFmt.setBorderBottom(BorderStyle.THIN);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">bordFmt.setBorderTop(BorderStyle.THICK);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">bordFmt.setBorderLeft(BorderStyle.DASHED);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">bordFmt.setBorderRight(BorderStyle.DOTTED);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">PatternFormatting patternFmt = rule1.createPatternFormatting();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">patternFmt.setFillBackgroundColor(IndexedColors.YELLOW.index);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">ConditionalFormattingRule rule2 = sheetCF.createConditionalFormattingRule(ComparisonOperator.BETWEEN, "-10", "10");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">ConditionalFormattingRule [] cfRules =</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">{</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> rule1, rule2</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">};</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">CellRangeAddress[] regions = {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> CellRangeAddress.valueOf("A3:A5")</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">};</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">sheetCF.addConditionalFormatting(regions, cfRules);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p> See more examples on Excel conditional formatting in
<a href="https://github.com/apache/poi/tree/trunk/poi-examples/src/main/java/org/apache/poi/examples/ss/ConditionalFormats.java">ConditionalFormats.java</a>
</p>
</div>
<a name="Hiding" id="Hiding"></a>
<a name="Hiding+and+Un-Hiding+Rows"></a>
<h2 class="boxed">Hiding and Un-Hiding Rows</h2>
<div class="section">
<p>
Using Excel, it is possible to hide a row on a worksheet by selecting that row (or rows),
right clicking once on the right hand mouse button and selecting 'Hide' from the pop-up menu that appears.
</p>
<p>
To emulate this using POI, simply call the setZeroHeight() method on an instance of either
XSSFRow or HSSFRow (the method is defined on the ss.usermodel.Row interface that both classes implement), like this:
</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">Workbook workbook = new XSSFWorkbook(); // OR new HSSFWorkbook()</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet = workbook.createSheet(0);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Row row = workbook.createRow(0);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">row.setZeroHeight();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p>
If the file were saved away to disc now, then the first row on the first sheet would not be visible.
</p>
<p>
Using Excel, it is possible to unhide previously hidden rows by selecting the row above and the row below
the one that is hidden and then pressing and holding down the Ctrl key, the Shift and the pressing
the number 9 before releasing them all.
</p>
<p>
To emulate this behaviour using POI do something like this:
</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">Workbook workbook = WorkbookFactory.create(new File(.......));</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet = workbook.getSheetAt(0);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Iterator&lt;Row&gt; row Iter = sheet.iterator();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">while(rowIter.hasNext()) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> Row row = rowIter.next();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> if(row.getZeroHeight()) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> row.setZeroHeight(false);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> }</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p>
If the file were saved away to disc now, any previously hidden rows on the first sheet of the workbook would now be visible.
</p>
<p>
The example illustrates two features. Firstly, that it is possible to unhide a row simply by calling the setZeroHeight()
method and passing the boolean value 'false'. Secondly, it illustrates how to test whether a row is hidden or not.
Simply call the getZeroHeight() method and it will return 'true' if the row is hidden, 'false' otherwise.
</p>
</div>
<a name="CellProperties" id="CellProperties"></a>
<a name="Setting+Cell+Properties"></a>
<h2 class="boxed">Setting Cell Properties</h2>
<div class="section">
<p>
Sometimes it is easier or more efficient to create a spreadsheet with basic styles and then apply special styles to certain cells
such as drawing borders around a range of cells or setting fills for a region. CellUtil.setCellProperties lets you do that without creating
a bunch of unnecessary intermediate styles in your spreadsheet.
</p>
<p>
Properties are created as a Map and applied to a cell in the following manner.
</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">Workbook workbook = new XSSFWorkbook(); // OR new HSSFWorkbook()</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sheet = workbook.createSheet("Sheet1");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Map&lt;String, Object&gt; properties = new HashMap&lt;String, Object&gt;();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// border around a cell</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">properties.put(CellUtil.BORDER_TOP, BorderStyle.MEDIUM);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">properties.put(CellUtil.BORDER_BOTTOM, BorderStyle.MEDIUM);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">properties.put(CellUtil.BORDER_LEFT, BorderStyle.MEDIUM);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">properties.put(CellUtil.BORDER_RIGHT, BorderStyle.MEDIUM);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Give it a color (RED)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">properties.put(CellUtil.TOP_BORDER_COLOR, IndexedColors.RED.getIndex());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">properties.put(CellUtil.BOTTOM_BORDER_COLOR, IndexedColors.RED.getIndex());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">properties.put(CellUtil.LEFT_BORDER_COLOR, IndexedColors.RED.getIndex());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">properties.put(CellUtil.RIGHT_BORDER_COLOR, IndexedColors.RED.getIndex());</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Apply the borders to the cell at B2</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Row row = sheet.createRow(1);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Cell cell = row.createCell(1);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">CellUtil.setCellStyleProperties(cell, properties);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// Apply the borders to a 3x3 region starting at D4</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">for (int ix=3; ix &lt;= 5; ix++) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> row = sheet.createRow(ix);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> for (int iy = 3; iy &lt;= 5; iy++) {</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> cell = row.createCell(iy);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> CellUtil.setCellStyleProperties(cell, properties);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> }</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">}</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p>
NOTE: This does not replace the properties of the cell, it merges the properties you have put into the Map with the
cell's existing style properties. If a property already exists, it is replaced with the new property. If a property does not
exist, it is added. This method will not remove CellStyle properties.
</p>
</div>
<a name="DrawingBorders" id="DrawingBorders"></a>
<a name="Drawing+Borders"></a>
<h2 class="boxed">Drawing Borders</h2>
<div class="section">
<p>
In Excel, you can apply a set of borders on an entire workbook region at the press of a button. The PropertyTemplate
object simulates this with methods and constants defined to allow drawing top, bottom, left, right, horizontal,
vertical, inside, outside, or all borders around a range of cells. Additional methods allow for applying colors
to the borders.
</p>
<p>
It works like this: you create a PropertyTemplate object which is a container for the borders you wish to apply to a
sheet. Then you add borders and colors to the PropertyTemplate, and finally apply it to whichever sheets you need
that set of borders on. You can create multiple PropertyTemplate objects and apply them to a single sheet, or you can
apply the same PropertyTemplate object to multiple sheets. It is just like a preprinted form.
</p>
<p>
Enums:
</p>
<dl>
<dt>BorderStyle</dt>
<dd>
Defines the look of the border, is it thick or thin, solid or dashed, single or double.
This enum replaces the CellStyle.BORDER_XXXXX constants which have been deprecated. The PropertyTemplate will not
support the older style BORDER_XXXXX constants. A special value of BorderStyle.NONE will remove the border from
a Cell once it is applied.
</dd>
<dt>BorderExtent</dt>
<dd>
Describes the portion of the region that the BorderStyle will apply to. For example, TOP, BOTTOM, INSIDE, or OUTSIDE.
A special value of BorderExtent.NONE will remove the border from the PropertyTemplate. When the template is applied,
no change will be made to a cell border where no border properties exist in the PropertyTemplate.
</dd>
</dl>
<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">// draw borders (three 3x3 grids)</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">PropertyTemplate pt = new PropertyTemplate();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// #1) these borders will all be medium in default color</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">pt.drawBorders(new CellRangeAddress(1, 3, 1, 3),</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> BorderStyle.MEDIUM, BorderExtent.ALL);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// #2) these cells will have medium outside borders and thin inside borders</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">pt.drawBorders(new CellRangeAddress(5, 7, 1, 3),</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> BorderStyle.MEDIUM, BorderExtent.OUTSIDE);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">pt.drawBorders(new CellRangeAddress(5, 7, 1, 3), BorderStyle.THIN,</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> BorderExtent.INSIDE);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// #3) these cells will all be medium weight with different colors for the</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// outside, inside horizontal, and inside vertical borders. The center</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// cell will have no borders.</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">pt.drawBorders(new CellRangeAddress(9, 11, 1, 3),</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> BorderStyle.MEDIUM, IndexedColors.RED.getIndex(),</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> BorderExtent.OUTSIDE);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">pt.drawBorders(new CellRangeAddress(9, 11, 1, 3),</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> BorderStyle.MEDIUM, IndexedColors.BLUE.getIndex(),</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> BorderExtent.INSIDE_VERTICAL);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">pt.drawBorders(new CellRangeAddress(9, 11, 1, 3),</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> BorderStyle.MEDIUM, IndexedColors.GREEN.getIndex(),</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> BorderExtent.INSIDE_HORIZONTAL);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">pt.drawBorders(new CellRangeAddress(10, 10, 2, 2),</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> BorderStyle.NONE,</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> BorderExtent.ALL);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// apply borders to sheet</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Workbook wb = new XSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">Sheet sh = wb.createSheet("Sheet1");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">pt.applyBorders(sh);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p>
NOTE: The last pt.drawBorders() call removes the borders from the range by using BorderStyle.NONE. Like
setCellStyleProperties, the applyBorders method merges the properties of a cell style, so existing borders
are changed only if they are replaced by something else, or removed only if they are replaced by
BorderStyle.NONE. To remove a color from a border, use IndexedColor.AUTOMATIC.getIndex().
</p>
<p>Additionally, to remove a border or color from the PropertyTemplate object, use BorderExtent.NONE.</p>
<p>
This does not work with diagonal borders yet.
</p>
</div>
<a name="PivotTable" id="PivotTable"></a>
<a name="Creating+a+Pivot+Table"></a>
<h2 class="boxed">Creating a Pivot Table</h2>
<div class="section">
<p>
Pivot Tables are a powerful feature of spreadsheet files. You can create a pivot table with the following piece of code.
</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">XSSFWorkbook wb = new XSSFWorkbook();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">XSSFSheet sheet = wb.createSheet();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//Create some data to build the pivot table on</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">setCellData(sheet);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">XSSFPivotTable pivotTable = sheet.createPivotTable(new AreaReference("A1:D4"), new CellReference("H5"));</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//Configure the pivot table</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//Use first column as row label</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">pivotTable.addRowLabel(0);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//Sum up the second column</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">pivotTable.addColumnLabel(DataConsolidateFunction.SUM, 1);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//Set the third column as filter</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">pivotTable.addColumnLabel(DataConsolidateFunction.AVERAGE, 2);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//Add filter on forth column</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">pivotTable.addReportFilter(3);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
</div>
<a name="RichText" id="RichText"></a>
<a name="Cells+with+multiple+styles+%28Rich+Text+Strings%29"></a>
<h2 class="boxed">Cells with multiple styles (Rich Text Strings)</h2>
<div class="section">
<p>
To apply a single set of text formatting (colour, style, font etc)
to a cell, you should create a
<a href="/../apidocs/dev/org/apache/poi/ss/usermodel/CellStyle.html">CellStyle</a>
for the workbook, then apply to the cells.
</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">// HSSF Example</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">HSSFCell hssfCell = row.createCell(idx);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">//rich text consists of two runs</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">HSSFRichTextString richString = new HSSFRichTextString( "Hello, World!" );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">richString.applyFont( 0, 6, font1 );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">richString.applyFont( 6, 13, font2 );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">hssfCell.setCellValue( richString );</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">// XSSF Example</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">XSSFCell cell = row.createCell(1);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">XSSFRichTextString rt = new XSSFRichTextString("The quick brown fox");</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">XSSFFont font1 = wb.createFont();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">font1.setBold(true);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">font1.setColor(new XSSFColor(new java.awt.Color(255, 0, 0)));</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">rt.applyFont(0, 10, font1);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">XSSFFont font2 = wb.createFont();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">font2.setItalic(true);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">font2.setUnderline(XSSFFont.U_DOUBLE);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">font2.setColor(new XSSFColor(new java.awt.Color(0, 255, 0)));</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">rt.applyFont(10, 19, font2);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">XSSFFont font3 = wb.createFont();</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">font3.setColor(new XSSFColor(new java.awt.Color(0, 0, 255)));</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">rt.append(" Jumped over the lazy dog", font3);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"></span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody">cell.setCellValue(rt);</span>
</div>
<div class="codeline">
<span class="lineno"></span><span class="codebody"> </span>
</div>
</div>
<p>
To apply different formatting to different parts of a cell, you
need to use
<a href="../../apidocs/dev/org/apache/poi/ss/usermodel/RichTextString.html">RichTextString</a>,
which permits styling of parts of the text within the cell.
</p>
<p>
There are some slight differences between HSSF and XSSF, especially
around font colours (the two formats store colours quite differently
internally), refer to the
<a href="../../apidocs/dev/org/apache/poi/hssf/usermodel/HSSFRichTextString.html">HSSF Rich Text String</a>
and
<a href="../../apidocs/dev/org/apache/poi/xssf/usermodel/XSSFRichTextString.html">XSSF Rich Text String</a>
javadocs for more details.
</p>
</div>
</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/spreadsheet/quick-guide.html">dev@poi.apache.org</a>
</div>
<!--+
|end bottomstrip
+-->
</div>
</body>
</html>