mirror of
https://github.com/apache/poi.git
synced 2026-02-27 20:40:08 +08:00
6196 lines
242 KiB
HTML
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> > <a href="https://poi.apache.org">Apache POI</a><script src="../../skin/breadcrumbs.js" language="JavaScript" type="text/javascript"></script>
|
|
</div>
|
|
<!--+
|
|
|header
|
|
+-->
|
|
<div class="header">
|
|
<!--+
|
|
|start group logo
|
|
+-->
|
|
<div class="grouplogo">
|
|
<a href="https://www.apache.org"><img class="logoImage" alt="Apache Software Foundation" src="../../images/asflogo_horizontal_color.svg" title="The Apache Software Foundation is a cornerstone of the modern Open Source software ecosystem – 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">
|
|
<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">
|
|
|
|
|
|
</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 < 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 < 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 < 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 < 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<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<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<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 &
|
|
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<CellAddress, Comment> 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<CellAddress, ? extends Comment> 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<Integer>)</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 < 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 < 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 – 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<?,?> 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<Row> 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<String, Object> properties = new HashMap<String, Object>();</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 <= 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 <= 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"> </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 ©
|
|
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>
|