1. fixed XSSFSheet.groupRow and ungroupRow to operate on 0-based arguments, was 1-based2. repackaged common xssh-hssf examples, created a page in the site for them 3. converted broken non-ascii characters to unicode in TestMetaDataIPI and TestWriteWellKnown

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@713981 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Yegor Kozlov 2008-11-14 11:56:41 +00:00
parent e703a254ed
commit acc1ba4585
23 changed files with 640 additions and 261 deletions

View File

@ -37,11 +37,11 @@
<!-- Don't forget to update status.xml too! --> <!-- Don't forget to update status.xml too! -->
<release version="3.5-beta4" date="2008-??-??"> <release version="3.5-beta4" date="2008-??-??">
<action dev="POI-DEVELOPERS" type="fix">46174 - Fixed HSSFName to handle general formulas (not just area references)</header> <action dev="POI-DEVELOPERS" type="fix">46174 - Fixed HSSFName to handle general formulas (not just area references)</action>
<action dev="POI-DEVELOPERS" type="add">46189 - added chart records: CHARTFRTINFO, STARTBLOCK, ENDBLOCK, STARTOBJECT, ENDOBJECT, and CATLAB</action> <action dev="POI-DEVELOPERS" type="add">46189 - added chart records: CHARTFRTINFO, STARTBLOCK, ENDBLOCK, STARTOBJECT, ENDOBJECT, and CATLAB</action>
<action dev="POI-DEVELOPERS" type="fix">46199 - More tweaks to EmbeddedObjectRefSubRecord</header> <action dev="POI-DEVELOPERS" type="fix">46199 - More tweaks to EmbeddedObjectRefSubRecord</action>
<action dev="POI-DEVELOPERS" type="add">Changes to formula evaluation allowing for reduced memory usage</action> <action dev="POI-DEVELOPERS" type="add">Changes to formula evaluation allowing for reduced memory usage</action>
<action dev="POI-DEVELOPERS" type="fix">45290 - Support odd files where the POIFS header block comes after the data blocks, and is on the data blocks list</header> <action dev="POI-DEVELOPERS" type="fix">45290 - Support odd files where the POIFS header block comes after the data blocks, and is on the data blocks list</action>
<action dev="POI-DEVELOPERS" type="fix">46184 - More odd escaped date formats</action> <action dev="POI-DEVELOPERS" type="fix">46184 - More odd escaped date formats</action>
<action dev="POI-DEVELOPERS" type="add">Include the sheet number in the output of XLS2CSVmra</action> <action dev="POI-DEVELOPERS" type="add">Include the sheet number in the output of XLS2CSVmra</action>
<action dev="POI-DEVELOPERS" type="fix">46043 - correctly write out HPSF properties with HWPF</action> <action dev="POI-DEVELOPERS" type="fix">46043 - correctly write out HPSF properties with HWPF</action>

View File

@ -34,7 +34,8 @@
<menu-item label="HSSF to SS Converting" href="converting.html"/> <menu-item label="HSSF to SS Converting" href="converting.html"/>
<menu-item label="Formula Support" href="formula.html" /> <menu-item label="Formula Support" href="formula.html" />
<menu-item label="Formula Evaluation" href="eval.html" /> <menu-item label="Formula Evaluation" href="eval.html" />
<menu-item label="Eval Dev Guide" href="eval-devguide.html" /> <menu-item label="Eval Dev Guide" href="eval-devguide.html" />
<menu-item label="Examples" href="examples.html"/>
<menu-item label="Use Case" href="use-case.html"/> <menu-item label="Use Case" href="use-case.html"/>
<menu-item label="Pictorial Docs" href="diagrams.html"/> <menu-item label="Pictorial Docs" href="diagrams.html"/>
<menu-item label="Limitations" href="limitations.html"/> <menu-item label="Limitations" href="limitations.html"/>

View File

@ -0,0 +1,75 @@
<?xml version="1.0" encoding="UTF-8"?>
<!--
====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
====================================================================
-->
<!DOCTYPE document PUBLIC "-//APACHE//DTD Documentation V1.1//EN" "../dtd/document-v11.dtd">
<document>
<header>
<title>HSSF and XSSF Examples</title>
<authors>
<person id="YK" name="Yegor Kozlov" email="user@poi.apache.org"/>
</authors>
</header>
<body>
<section><title>HSSF and XSSF examples</title>
<p>POI comes with a number of examples that demonstrate how you can use POI API to create documents from "real life".
The examples are based on common XSSF-HSSF interfaces so that you can generate either *.xls or *.xlsx output just by setting a command-line argument:
</p>
<source>
BusinessPlan -xls
or
BusinessPlan -xlsx
</source>
<p>All sample source is available in <link href="http://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/ss/examples/">SVN</link></p>
</section>
<section><title>BusinessPlan</title>
<p> The <link href="http://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/ss/examples/BusinessPlan.java">BusinessPlan</link>
application creates a sample business plan with three phases, weekly iterations and time highlighting. Demonstrates advanced cell formatting
(number and date formats, alignmnets, fills, borders) and various settings for organizing data in a sheet (freezed panes, groupped rows).
</p>
<p>
<img src="../resources/images/businessplan.jpg" alt="business plan demo"/>
</p>
</section>
<section><title>Calendar</title>
<p> The <link href="http://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/ss/examples/Calendar.java">Calendar</link>
demo creates a multi sheet calendar. Each month is on a separate sheet.
</p>
<p>
<img src="../resources/images/calendar.jpg" alt="calendar demo"/>
</p>
</section>
<section><title>LoanCalculator</title>
<p> The <link href="http://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/ss/examples/LoanCalculator.java">LoanCalculator</link>
demo creates a simple loan calculator. Demonstrates advance usage of cell formulas and named ranges.
</p>
<p>
<img src="../resources/images/loancalc.jpg" alt="loan calculator demo"/>
</p>
</section>
<section><title>TimesheetDemo</title>
<p> The <link href="http://svn.apache.org/repos/asf/poi/trunk/src/examples/src/org/apache/poi/ss/examples/TimesheetDemo.java">TimesheetDemo</link>
demo creates a weekly timesheet with automatic calculation of total hours. Demonstrates advance usage of cell formulas.
</p>
<p>
<img src="../resources/images/timesheet.jpg" alt="timesheet demo"/>
</p>
</section>
</body>
</document>

View File

@ -34,11 +34,11 @@
<!-- Don't forget to update changes.xml too! --> <!-- Don't forget to update changes.xml too! -->
<changes> <changes>
<release version="3.5-beta4" date="2008-??-??"> <release version="3.5-beta4" date="2008-??-??">
<action dev="POI-DEVELOPERS" type="fix">46174 - Fixed HSSFName to handle general formulas (not just area references)</header> <action dev="POI-DEVELOPERS" type="fix">46174 - Fixed HSSFName to handle general formulas (not just area references)</action>
<action dev="POI-DEVELOPERS" type="add">46189 - added chart records: CHARTFRTINFO, STARTBLOCK, ENDBLOCK, STARTOBJECT, ENDOBJECT, and CATLAB</action> <action dev="POI-DEVELOPERS" type="add">46189 - added chart records: CHARTFRTINFO, STARTBLOCK, ENDBLOCK, STARTOBJECT, ENDOBJECT, and CATLAB</action>
<action dev="POI-DEVELOPERS" type="fix">46199 - More tweaks to EmbeddedObjectRefSubRecord</header> <action dev="POI-DEVELOPERS" type="fix">46199 - More tweaks to EmbeddedObjectRefSubRecord</action>
<action dev="POI-DEVELOPERS" type="add">Changes to formula evaluation allowing for reduced memory usage</action> <action dev="POI-DEVELOPERS" type="add">Changes to formula evaluation allowing for reduced memory usage</action>
<action dev="POI-DEVELOPERS" type="fix">45290 - Support odd files where the POIFS header block comes after the data blocks, and is on the data blocks list</header> <action dev="POI-DEVELOPERS" type="fix">45290 - Support odd files where the POIFS header block comes after the data blocks, and is on the data blocks list</action>
<action dev="POI-DEVELOPERS" type="fix">46184 - More odd escaped date formats</action> <action dev="POI-DEVELOPERS" type="fix">46184 - More odd escaped date formats</action>
<action dev="POI-DEVELOPERS" type="add">Include the sheet number in the output of XLS2CSVmra</action> <action dev="POI-DEVELOPERS" type="add">Include the sheet number in the output of XLS2CSVmra</action>
<action dev="POI-DEVELOPERS" type="fix">46043 - correctly write out HPSF properties with HWPF</action> <action dev="POI-DEVELOPERS" type="fix">46043 - correctly write out HPSF properties with HWPF</action>

Binary file not shown.

After

Width:  |  Height:  |  Size: 62 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 38 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 26 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

View File

@ -14,20 +14,22 @@
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
==================================================================== */ ==================================================================== */
package org.apache.poi.xssf.usermodel.examples; package org.apache.poi.ss.examples;
import org.apache.poi.xssf.usermodel.*; import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.usermodel.*;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import java.util.Map; import java.util.Map;
import java.util.HashMap; import java.util.HashMap;
import java.util.Date;
import java.util.Calendar; import java.util.Calendar;
import java.io.FileOutputStream; import java.io.FileOutputStream;
import java.text.SimpleDateFormat; import java.text.SimpleDateFormat;
/** /**
* A business plan demo * A business plan demo
* Usage:
* BusinessPlan -xls|xlsx
* *
* @author Yegor Kozlov * @author Yegor Kozlov
*/ */
@ -35,85 +37,94 @@ public class BusinessPlan {
private static SimpleDateFormat fmt = new SimpleDateFormat("dd-MMM"); private static SimpleDateFormat fmt = new SimpleDateFormat("dd-MMM");
private static final String[] days = { private static final String[] titles = {
"ID", "Project Name", "Owner", "Days", "Start", "End"}; "ID", "Project Name", "Owner", "Days", "Start", "End"};
//sample data to fill the sheet. //sample data to fill the sheet.
private static final String[][] data = { private static final String[][] data = {
{"1.0", "Marketing Research Tactical Plan", "R. Ihrig", "70", "9-Jul", null, {"1.0", "Marketing Research Tactical Plan", "J. Dow", "70", "9-Jul", null,
"x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x"}, "x", "x", "x", "x", "x", "x", "x", "x", "x", "x", "x"},
null, null,
{"1.1", "Scope Definition Phase", "R. Ihrig", "10", "9-Jul", null, {"1.1", "Scope Definition Phase", "J. Dow", "10", "9-Jul", null,
"x", "x", null, null, null, null, null, null, null, null, null}, "x", "x", null, null, null, null, null, null, null, null, null},
{"1.1.1", "Define research objectives", "R. Ihrig", "3", "9-Jul", null, {"1.1.1", "Define research objectives", "J. Dow", "3", "9-Jul", null,
"x", null, null, null, null, null, null, null, null, null, null}, "x", null, null, null, null, null, null, null, null, null, null},
{"1.1.2", "Define research requirements", "S. Abbas", "7", "10-Jul", null, {"1.1.2", "Define research requirements", "S. Jones", "7", "10-Jul", null,
"x", "x", null, null, null, null, null, null, null, null, null}, "x", "x", null, null, null, null, null, null, null, null, null},
{"1.1.3", "Determine in-house resource or hire vendor", "R. Ihrig", "2", "15-Jul", null, {"1.1.3", "Determine in-house resource or hire vendor", "J. Dow", "2", "15-Jul", null,
"x", "x", null, null, null, null, null, null, null, null, null}, "x", "x", null, null, null, null, null, null, null, null, null},
null, null,
{"1.2", "Vendor Selection Phase", "R. Ihrig", "19", "19-Jul", null, {"1.2", "Vendor Selection Phase", "J. Dow", "19", "19-Jul", null,
null, "x", "x", "x", "x", null, null, null, null, null, null}, null, "x", "x", "x", "x", null, null, null, null, null, null},
{"1.2.1", "Define vendor selection criteria", "R. Ihrig", "3", "19-Jul", null, {"1.2.1", "Define vendor selection criteria", "J. Dow", "3", "19-Jul", null,
null, "x", null, null, null, null, null, null, null, null, null}, null, "x", null, null, null, null, null, null, null, null, null},
{"1.2.2", "Develop vendor selection questionnaire", "S. Abbas, T. Wang", "2", "22-Jul", null, {"1.2.2", "Develop vendor selection questionnaire", "S. Jones, T. Wates", "2", "22-Jul", null,
null, "x", "x", null, null, null, null, null, null, null, null}, null, "x", "x", null, null, null, null, null, null, null, null},
{"1.2.3", "Develop Statement of Work", "S. Abbas", "4", "26-Jul", null, {"1.2.3", "Develop Statement of Work", "S. Jones", "4", "26-Jul", null,
null, null, "x", "x", null, null, null, null, null, null, null}, null, null, "x", "x", null, null, null, null, null, null, null},
{"1.2.4", "Evaluate proposal", "R. Ihrig, S. Abbas", "4", "2-Aug", null, {"1.2.4", "Evaluate proposal", "J. Dow, S. Jones", "4", "2-Aug", null,
null, null, null, "x", "x", null, null, null, null, null, null}, null, null, null, "x", "x", null, null, null, null, null, null},
{"1.2.5", "Select vendor", "R. Ihrig", "1", "6-Aug", null, {"1.2.5", "Select vendor", "J. Dow", "1", "6-Aug", null,
null, null, null, null, "x", null, null, null, null, null, null}, null, null, null, null, "x", null, null, null, null, null, null},
null, null,
{"1.3", "Research Phase", "Y. Li", "47", "9-Aug", null, {"1.3", "Research Phase", "G. Lee", "47", "9-Aug", null,
null, null, null, null, "x", "x", "x", "x", "x", "x", "x"}, null, null, null, null, "x", "x", "x", "x", "x", "x", "x"},
{"1.3.1", "Develop market research information needs questionnaire", "Y. Li", "2", "9-Aug", null, {"1.3.1", "Develop market research information needs questionnaire", "G. Lee", "2", "9-Aug", null,
null, null, null, null, "x", null, null, null, null, null, null}, null, null, null, null, "x", null, null, null, null, null, null},
{"1.3.2", "Interview marketing group for market research needs", "Y. Li", "2", "11-Aug", null, {"1.3.2", "Interview marketing group for market research needs", "G. Lee", "2", "11-Aug", null,
null, null, null, null, "x", "x", null, null, null, null, null}, null, null, null, null, "x", "x", null, null, null, null, null},
{"1.3.3", "Document information needs", "Y. Li, S. Abbas", "1", "13-Aug", null, {"1.3.3", "Document information needs", "G. Lee, S. Jones", "1", "13-Aug", null,
null, null, null, null, null, "x", null, null, null, null, null}, null, null, null, null, null, "x", null, null, null, null, null},
}; };
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
Calendar calendar = Calendar.getInstance(); Workbook wb;
int year = calendar.get(Calendar.YEAR);
XSSFWorkbook wb = new XSSFWorkbook(); if(args.length > 0 && args[0].equals("-xls")) wb = new HSSFWorkbook();
Map<String, XSSFCellStyle> styles = createStyles(wb); else wb = new XSSFWorkbook();
XSSFSheet sheet = wb.createSheet("Plan"); Map<String, CellStyle> styles = createStyles(wb);
Sheet sheet = wb.createSheet("Business Plan");
//turn off gridlines //turn off gridlines
sheet.setDisplayGridlines(false); sheet.setDisplayGridlines(false);
sheet.setPrintGridlines(false); sheet.setPrintGridlines(false);
XSSFPrintSetup printSetup = sheet.getPrintSetup();
printSetup.setOrientation(PrintOrientation.LANDSCAPE);
sheet.setFitToPage(true); sheet.setFitToPage(true);
sheet.setHorizontallyCenter(true); sheet.setHorizontallyCenter(true);
PrintSetup printSetup = sheet.getPrintSetup();
printSetup.setLandscape(true);
//the following three statements are required only for HSSF
sheet.setAutobreaks(true);
printSetup.setFitHeight((short)1);
printSetup.setFitWidth((short)1);
//the header row: centered text in 48pt font //the header row: centered text in 48pt font
XSSFRow headerRow = sheet.createRow(0); Row headerRow = sheet.createRow(0);
headerRow.setHeightInPoints(12.75f); headerRow.setHeightInPoints(12.75f);
for (int i = 0; i < days.length; i++) { for (int i = 0; i < titles.length; i++) {
XSSFCell cell = headerRow.createCell(i); Cell cell = headerRow.createCell(i);
cell.setCellValue(days[i]); cell.setCellValue(titles[i]);
cell.setCellStyle(styles.get("header")); cell.setCellStyle(styles.get("header"));
} }
//columns for 11 weeks starting from 9-Jul //columns for 11 weeks starting from 9-Jul
Calendar calendar = Calendar.getInstance();
int year = calendar.get(Calendar.YEAR);
calendar.setTime(fmt.parse("9-Jul")); calendar.setTime(fmt.parse("9-Jul"));
calendar.set(Calendar.YEAR, year); calendar.set(Calendar.YEAR, year);
for (int i = 0; i < 11; i++) { for (int i = 0; i < 11; i++) {
XSSFCell cell = headerRow.createCell(days.length + i); Cell cell = headerRow.createCell(titles.length + i);
cell.setCellValue(calendar); cell.setCellValue(calendar);
cell.setCellStyle(styles.get("header_date")); cell.setCellStyle(styles.get("header_date"));
calendar.roll(Calendar.WEEK_OF_YEAR, true); calendar.roll(Calendar.WEEK_OF_YEAR, true);
} }
//freeze the first row
sheet.createFreezePane(0, 1); sheet.createFreezePane(0, 1);
XSSFRow row;
XSSFCell cell;
Row row;
Cell cell;
int rownum = 1; int rownum = 1;
for (int i = 0; i < data.length; i++, rownum++) { for (int i = 0; i < data.length; i++, rownum++) {
row = sheet.createRow(rownum); row = sheet.createRow(rownum);
@ -171,139 +182,142 @@ public class BusinessPlan {
} }
} }
//group rows for each phase, row numbers are 0-based
sheet.groupRow(4, 6);
sheet.groupRow(9, 13);
sheet.groupRow(16, 18);
sheet.groupRow(5, 7); //set column widths, the width is measured in units of 1/256th of a character width
sheet.groupRow(10, 14);
sheet.groupRow(17, 19);
sheet.setColumnWidth(0, 256*6); sheet.setColumnWidth(0, 256*6);
sheet.setColumnWidth(1, 256*33); sheet.setColumnWidth(1, 256*33);
sheet.setColumnWidth(2, 256*20); sheet.setColumnWidth(2, 256*20);
sheet.setZoom(75); sheet.setZoom(3, 4);
// Write the output to a file // Write the output to a file
FileOutputStream out = new FileOutputStream("xssf-plan.xlsx"); String file = "businessplan.xls";
if(wb instanceof XSSFWorkbook) file += "x";
FileOutputStream out = new FileOutputStream(file);
wb.write(out); wb.write(out);
out.close(); out.close();
} }
/** /**
* cell styles used for formatting calendar sheets * create a library of cell styles
*/ */
private static Map<String, XSSFCellStyle> createStyles(XSSFWorkbook wb){ private static Map<String, CellStyle> createStyles(Workbook wb){
Map<String, XSSFCellStyle> styles = new HashMap<String, XSSFCellStyle>(); Map<String, CellStyle> styles = new HashMap<String, CellStyle>();
XSSFDataFormat df = wb.createDataFormat(); DataFormat df = wb.createDataFormat();
XSSFCellStyle style; CellStyle style;
XSSFFont headerFont = wb.createFont(); Font headerFont = wb.createFont();
headerFont.setBold(true); headerFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
style = createBorderedStyle(wb); style = createBorderedStyle(wb);
style.setAlignment(HorizontalAlignment.CENTER); style.setAlignment(CellStyle.ALIGN_CENTER);
style.setFillForegroundColor(new XSSFColor(new java.awt.Color(204, 204, 255))); style.setFillForegroundColor(IndexedColors.LIGHT_CORNFLOWER_BLUE.getIndex());
style.setFillPattern(FillPatternType.SOLID_FOREGROUND); style.setFillPattern(CellStyle.SOLID_FOREGROUND);
style.setFont(headerFont); style.setFont(headerFont);
styles.put("header", style); styles.put("header", style);
style = createBorderedStyle(wb); style = createBorderedStyle(wb);
style.setAlignment(HorizontalAlignment.CENTER); style.setAlignment(CellStyle.ALIGN_CENTER);
style.setFillForegroundColor(new XSSFColor(new java.awt.Color(204, 204, 255))); style.setFillForegroundColor(IndexedColors.LIGHT_CORNFLOWER_BLUE.getIndex());
style.setFillPattern(FillPatternType.SOLID_FOREGROUND); style.setFillPattern(CellStyle.SOLID_FOREGROUND);
style.setFont(headerFont); style.setFont(headerFont);
style.setDataFormat(df.getFormat("d-mmm")); style.setDataFormat(df.getFormat("d-mmm"));
styles.put("header_date", style); styles.put("header_date", style);
XSSFFont font1 = wb.createFont(); Font font1 = wb.createFont();
font1.setBold(true); font1.setBoldweight(Font.BOLDWEIGHT_BOLD);
style = createBorderedStyle(wb); style = createBorderedStyle(wb);
style.setAlignment(HorizontalAlignment.LEFT); style.setAlignment(CellStyle.ALIGN_LEFT);
style.setFont(font1); style.setFont(font1);
styles.put("cell_b", style); styles.put("cell_b", style);
style = createBorderedStyle(wb); style = createBorderedStyle(wb);
style.setAlignment(HorizontalAlignment.CENTER); style.setAlignment(CellStyle.ALIGN_CENTER);
style.setFont(font1); style.setFont(font1);
styles.put("cell_b_centered", style); styles.put("cell_b_centered", style);
style = createBorderedStyle(wb); style = createBorderedStyle(wb);
style.setAlignment(HorizontalAlignment.RIGHT); style.setAlignment(CellStyle.ALIGN_RIGHT);
style.setFont(font1); style.setFont(font1);
style.setDataFormat(df.getFormat("d-mmm")); style.setDataFormat(df.getFormat("d-mmm"));
styles.put("cell_b_date", style); styles.put("cell_b_date", style);
style = createBorderedStyle(wb); style = createBorderedStyle(wb);
style.setAlignment(HorizontalAlignment.RIGHT); style.setAlignment(CellStyle.ALIGN_RIGHT);
style.setFont(font1); style.setFont(font1);
style.setFillForegroundColor(new XSSFColor(new java.awt.Color(228, 228, 228))); style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
style.setFillPattern(FillPatternType.SOLID_FOREGROUND); style.setFillPattern(CellStyle.SOLID_FOREGROUND);
style.setDataFormat(df.getFormat("d-mmm")); style.setDataFormat(df.getFormat("d-mmm"));
styles.put("cell_g", style); styles.put("cell_g", style);
XSSFFont font2 = wb.createFont(); Font font2 = wb.createFont();
font2.setColor(IndexedColors.BLUE.getIndex()); font2.setColor(IndexedColors.BLUE.getIndex());
font2.setBold(true); font2.setBoldweight(Font.BOLDWEIGHT_BOLD);
style = createBorderedStyle(wb); style = createBorderedStyle(wb);
style.setAlignment(HorizontalAlignment.LEFT); style.setAlignment(CellStyle.ALIGN_LEFT);
style.setFont(font2); style.setFont(font2);
styles.put("cell_bb", style); styles.put("cell_bb", style);
style = createBorderedStyle(wb); style = createBorderedStyle(wb);
style.setAlignment(HorizontalAlignment.RIGHT); style.setAlignment(CellStyle.ALIGN_RIGHT);
style.setFont(font1); style.setFont(font1);
style.setFillForegroundColor(new XSSFColor(new java.awt.Color(228, 228, 228))); style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
style.setFillPattern(FillPatternType.SOLID_FOREGROUND); style.setFillPattern(CellStyle.SOLID_FOREGROUND);
style.setDataFormat(df.getFormat("d-mmm")); style.setDataFormat(df.getFormat("d-mmm"));
styles.put("cell_bg", style); styles.put("cell_bg", style);
XSSFFont font3 = wb.createFont(); Font font3 = wb.createFont();
font3.setFontHeightInPoints((short)14); font3.setFontHeightInPoints((short)14);
font3.setColor(IndexedColors.DARK_BLUE.getIndex()); font3.setColor(IndexedColors.DARK_BLUE.getIndex());
font3.setBold(true); font3.setBoldweight(Font.BOLDWEIGHT_BOLD);
style = createBorderedStyle(wb); style = createBorderedStyle(wb);
style.setAlignment(HorizontalAlignment.LEFT); style.setAlignment(CellStyle.ALIGN_LEFT);
style.setFont(font3); style.setFont(font3);
style.setWrapText(true); style.setWrapText(true);
styles.put("cell_h", style); styles.put("cell_h", style);
style = createBorderedStyle(wb); style = createBorderedStyle(wb);
style.setAlignment(HorizontalAlignment.LEFT); style.setAlignment(CellStyle.ALIGN_LEFT);
style.setWrapText(true); style.setWrapText(true);
styles.put("cell_normal", style); styles.put("cell_normal", style);
style = createBorderedStyle(wb); style = createBorderedStyle(wb);
style.setAlignment(HorizontalAlignment.CENTER); style.setAlignment(CellStyle.ALIGN_CENTER);
style.setWrapText(true); style.setWrapText(true);
styles.put("cell_normal_centered", style); styles.put("cell_normal_centered", style);
style = createBorderedStyle(wb); style = createBorderedStyle(wb);
style.setAlignment(HorizontalAlignment.RIGHT); style.setAlignment(CellStyle.ALIGN_RIGHT);
style.setWrapText(true); style.setWrapText(true);
style.setDataFormat(df.getFormat("d-mmm")); style.setDataFormat(df.getFormat("d-mmm"));
styles.put("cell_normal_date", style); styles.put("cell_normal_date", style);
style = createBorderedStyle(wb); style = createBorderedStyle(wb);
style.setAlignment(HorizontalAlignment.LEFT); style.setAlignment(CellStyle.ALIGN_LEFT);
style.setIndention((short)1); style.setIndention((short)1);
style.setWrapText(true); style.setWrapText(true);
styles.put("cell_indented", style); styles.put("cell_indented", style);
style = createBorderedStyle(wb); style = createBorderedStyle(wb);
style.setFillForegroundColor(IndexedColors.BLUE.getIndex()); style.setFillForegroundColor(IndexedColors.BLUE.getIndex());
style.setFillPattern(FillPatternType.SOLID_FOREGROUND); style.setFillPattern(CellStyle.SOLID_FOREGROUND);
styles.put("cell_blue", style); styles.put("cell_blue", style);
return styles; return styles;
} }
private static XSSFCellStyle createBorderedStyle(XSSFWorkbook wb){ private static CellStyle createBorderedStyle(Workbook wb){
XSSFCellStyle style = wb.createCellStyle(); CellStyle style = wb.createCellStyle();
style.setBorderRight(BorderStyle.THIN); style.setBorderRight(CellStyle.BORDER_THIN);
style.setRightBorderColor(IndexedColors.BLACK.getIndex()); style.setRightBorderColor(IndexedColors.BLACK.getIndex());
style.setBorderBottom(BorderStyle.THIN); style.setBorderBottom(CellStyle.BORDER_THIN);
style.setBottomBorderColor(IndexedColors.BLACK.getIndex()); style.setBottomBorderColor(IndexedColors.BLACK.getIndex());
style.setBorderLeft(BorderStyle.THIN); style.setBorderLeft(CellStyle.BORDER_THIN);
style.setLeftBorderColor(IndexedColors.BLACK.getIndex()); style.setLeftBorderColor(IndexedColors.BLACK.getIndex());
style.setBorderTop(BorderStyle.THIN); style.setBorderTop(CellStyle.BORDER_THIN);
style.setTopBorderColor(IndexedColors.BLACK.getIndex()); style.setTopBorderColor(IndexedColors.BLACK.getIndex());
return style; return style;
} }

View File

@ -0,0 +1,242 @@
/* ====================================================================
Licensed to the Apache Software Foundation (ASF) under one or more
contributor license agreements. See the NOTICE file distributed with
this work for additional information regarding copyright ownership.
The ASF licenses this file to You under the Apache License, Version 2.0
(the "License"); you may not use this file except in compliance with
the License. You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.
==================================================================== */
package org.apache.poi.ss.examples;
import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.usermodel.Font;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import java.io.FileOutputStream;
import java.util.Calendar;
import java.util.Map;
import java.util.HashMap;
/**
* A monthly calendar created using Apache POI. Each month is on a separate sheet.
* <pre>
* Usage:
* CalendarDemo -xls|xlsx <year>
* </pre>
*
* @author Yegor Kozlov
*/
public class CalendarDemo {
private static final String[] days = {
"Sunday", "Monday", "Tuesday",
"Wednesday", "Thursday", "Friday", "Saturday"};
private static final String[] months = {
"January", "February", "March","April", "May", "June","July", "August",
"September","October", "November", "December"};
public static void main(String[] args) throws Exception {
Calendar calendar = Calendar.getInstance();
boolean xlsx = true;
for (int i = 0; i < args.length; i++) {
if(args[i].charAt(0) == '-'){
xlsx = args[i].equals("-xlsx");
} else {
calendar.set(Calendar.YEAR, Integer.parseInt(args[i]));
}
}
int year = calendar.get(Calendar.YEAR);
Workbook wb = xlsx ? new XSSFWorkbook() : new HSSFWorkbook();
Map<String, CellStyle> styles = createStyles(wb);
for (int month = 0; month < 12; month++) {
calendar.set(Calendar.MONTH, month);
calendar.set(Calendar.DAY_OF_MONTH, 1);
//create a sheet for each month
Sheet sheet = wb.createSheet(months[month]);
//turn off gridlines
sheet.setDisplayGridlines(false);
sheet.setPrintGridlines(false);
sheet.setFitToPage(true);
sheet.setHorizontallyCenter(true);
PrintSetup printSetup = sheet.getPrintSetup();
printSetup.setLandscape(true);
//the following three statements are required only for HSSF
sheet.setAutobreaks(true);
printSetup.setFitHeight((short)1);
printSetup.setFitWidth((short)1);
//the header row: centered text in 48pt font
Row headerRow = sheet.createRow(0);
headerRow.setHeightInPoints(80);
Cell titleCell = headerRow.createCell(0);
titleCell.setCellValue(months[month] + " " + year);
titleCell.setCellStyle(styles.get("title"));
sheet.addMergedRegion(CellRangeAddress.valueOf("$A$1:$N$1"));
//header with month titles
Row monthRow = sheet.createRow(1);
for (int i = 0; i < days.length; i++) {
//set column widths, the width is measured in units of 1/256th of a character width
sheet.setColumnWidth(i*2, 5*256); //the column is 5 characters wide
sheet.setColumnWidth(i*2 + 1, 13*256); //the column is 13 characters wide
sheet.addMergedRegion(new CellRangeAddress(1, 1, i*2, i*2+1));
Cell monthCell = monthRow.createCell(i*2);
monthCell.setCellValue(days[i]);
monthCell.setCellStyle(styles.get("month"));
}
int cnt = 1, day=1;
int rownum = 2;
for (int j = 0; j < 6; j++) {
Row row = sheet.createRow(rownum++);
row.setHeightInPoints(100);
for (int i = 0; i < days.length; i++) {
Cell dayCell_1 = row.createCell(i*2);
Cell dayCell_2 = row.createCell(i*2 + 1);
int day_of_week = calendar.get(Calendar.DAY_OF_WEEK);
if(cnt >= day_of_week && calendar.get(Calendar.MONTH) == month) {
dayCell_1.setCellValue(day);
calendar.set(Calendar.DAY_OF_MONTH, ++day);
if(i == 0 || i == days.length-1) {
dayCell_1.setCellStyle(styles.get("weekend_left"));
dayCell_2.setCellStyle(styles.get("weekend_right"));
} else {
dayCell_1.setCellStyle(styles.get("workday_left"));
dayCell_2.setCellStyle(styles.get("workday_right"));
}
} else {
dayCell_1.setCellStyle(styles.get("grey_left"));
dayCell_2.setCellStyle(styles.get("grey_right"));
}
cnt++;
}
if(calendar.get(Calendar.MONTH) > month) break;
}
}
// Write the output to a file
String file = "calendar.xls";
if(wb instanceof XSSFWorkbook) file += "x";
FileOutputStream out = new FileOutputStream(file);
wb.write(out);
out.close();
}
/**
* cell styles used for formatting calendar sheets
*/
private static Map<String, CellStyle> createStyles(Workbook wb){
Map<String, CellStyle> styles = new HashMap<String, CellStyle>();
short borderColor = IndexedColors.GREY_50_PERCENT.getIndex();
CellStyle style;
Font titleFont = wb.createFont();
titleFont.setFontHeightInPoints((short)48);
titleFont.setColor(IndexedColors.DARK_BLUE.getIndex());
style = wb.createCellStyle();
style.setAlignment(CellStyle.ALIGN_CENTER);
style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
style.setFont(titleFont);
styles.put("title", style);
Font monthFont = wb.createFont();
monthFont.setFontHeightInPoints((short)12);
monthFont.setColor(IndexedColors.WHITE.getIndex());
monthFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
style = wb.createCellStyle();
style.setAlignment(CellStyle.ALIGN_CENTER);
style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
style.setFillForegroundColor(IndexedColors.DARK_BLUE.getIndex());
style.setFillPattern(CellStyle.SOLID_FOREGROUND);
style.setFont(monthFont);
styles.put("month", style);
Font dayFont = wb.createFont();
dayFont.setFontHeightInPoints((short)14);
dayFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
style = wb.createCellStyle();
style.setAlignment(CellStyle.ALIGN_LEFT);
style.setVerticalAlignment(CellStyle.VERTICAL_TOP);
style.setFillForegroundColor(IndexedColors.LIGHT_CORNFLOWER_BLUE.getIndex());
style.setFillPattern(CellStyle.SOLID_FOREGROUND);
style.setBorderLeft(CellStyle.BORDER_THIN);
style.setLeftBorderColor(borderColor);
style.setBorderBottom(CellStyle.BORDER_THIN);
style.setBottomBorderColor(borderColor);
style.setFont(dayFont);
styles.put("weekend_left", style);
style = wb.createCellStyle();
style.setAlignment(CellStyle.ALIGN_CENTER);
style.setVerticalAlignment(CellStyle.VERTICAL_TOP);
style.setFillForegroundColor(IndexedColors.LIGHT_CORNFLOWER_BLUE.getIndex());
style.setFillPattern(CellStyle.SOLID_FOREGROUND);
style.setBorderRight(CellStyle.BORDER_THIN);
style.setRightBorderColor(borderColor);
style.setBorderBottom(CellStyle.BORDER_THIN);
style.setBottomBorderColor(borderColor);
styles.put("weekend_right", style);
style = wb.createCellStyle();
style.setAlignment(CellStyle.ALIGN_LEFT);
style.setVerticalAlignment(CellStyle.VERTICAL_TOP);
style.setBorderLeft(CellStyle.BORDER_THIN);
style.setFillForegroundColor(IndexedColors.WHITE.getIndex());
style.setFillPattern(CellStyle.SOLID_FOREGROUND);
style.setLeftBorderColor(borderColor);
style.setBorderBottom(CellStyle.BORDER_THIN);
style.setBottomBorderColor(borderColor);
style.setFont(dayFont);
styles.put("workday_left", style);
style = wb.createCellStyle();
style.setAlignment(CellStyle.ALIGN_CENTER);
style.setVerticalAlignment(CellStyle.VERTICAL_TOP);
style.setFillForegroundColor(IndexedColors.WHITE.getIndex());
style.setFillPattern(CellStyle.SOLID_FOREGROUND);
style.setBorderRight(CellStyle.BORDER_THIN);
style.setRightBorderColor(borderColor);
style.setBorderBottom(CellStyle.BORDER_THIN);
style.setBottomBorderColor(borderColor);
styles.put("workday_right", style);
style = wb.createCellStyle();
style.setBorderLeft(CellStyle.BORDER_THIN);
style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
style.setFillPattern(CellStyle.SOLID_FOREGROUND);
style.setBorderBottom(CellStyle.BORDER_THIN);
style.setBottomBorderColor(borderColor);
styles.put("grey_left", style);
style = wb.createCellStyle();
style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
style.setFillPattern(CellStyle.SOLID_FOREGROUND);
style.setBorderRight(CellStyle.BORDER_THIN);
style.setRightBorderColor(borderColor);
style.setBorderBottom(CellStyle.BORDER_THIN);
style.setBottomBorderColor(borderColor);
styles.put("grey_right", style);
return styles;
}
}

View File

@ -14,32 +14,40 @@
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
==================================================================== */ ==================================================================== */
package org.apache.poi.xssf.usermodel.examples; package org.apache.poi.ss.examples;
import org.apache.poi.xssf.usermodel.*; import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import java.util.Map; import java.util.Map;
import java.util.HashMap; import java.util.HashMap;
import java.io.FileOutputStream; import java.io.FileOutputStream;
/** /**
* Simple Loan Calculator * Simple Loan Calculator. Demonstrates advance usage of cell formulas and named ranges.
*
* Usage:
* LoanCalculator -xls|xlsx
* *
* @author Yegor Kozlov * @author Yegor Kozlov
*/ */
public class LoanCalculator { public class LoanCalculator {
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
XSSFWorkbook wb = new XSSFWorkbook(); Workbook wb;
Map<String, XSSFCellStyle> styles = createStyles(wb);
XSSFSheet sheet = wb.createSheet("Loan Calculator"); if(args.length > 0 && args[0].equals("-xls")) wb = new HSSFWorkbook();
else wb = new XSSFWorkbook();
Map<String, CellStyle> styles = createStyles(wb);
Sheet sheet = wb.createSheet("Loan Calculator");
sheet.setPrintGridlines(false); sheet.setPrintGridlines(false);
sheet.setDisplayGridlines(false); sheet.setDisplayGridlines(false);
XSSFPrintSetup printSetup = sheet.getPrintSetup(); PrintSetup printSetup = sheet.getPrintSetup();
printSetup.setOrientation(PrintOrientation.LANDSCAPE); printSetup.setLandscape(true);
sheet.setFitToPage(true); sheet.setFitToPage(true);
sheet.setHorizontallyCenter(true); sheet.setHorizontallyCenter(true);
@ -53,17 +61,17 @@ public class LoanCalculator {
createNames(wb); createNames(wb);
XSSFRow titleRow = sheet.createRow(0); Row titleRow = sheet.createRow(0);
titleRow.setHeightInPoints(35); titleRow.setHeightInPoints(35);
for (int i = 1; i <= 7; i++) { for (int i = 1; i <= 7; i++) {
titleRow.createCell(i).setCellStyle(styles.get("title")); titleRow.createCell(i).setCellStyle(styles.get("title"));
} }
XSSFCell titleCell = titleRow.getCell(2); Cell titleCell = titleRow.getCell(2);
titleCell.setCellValue("Simple Loan Calculator"); titleCell.setCellValue("Simple Loan Calculator");
sheet.addMergedRegion(CellRangeAddress.valueOf("$C$1:$H$1")); sheet.addMergedRegion(CellRangeAddress.valueOf("$C$1:$H$1"));
XSSFRow row = sheet.createRow(2); Row row = sheet.createRow(2);
XSSFCell cell = row.createCell(4); Cell cell = row.createCell(4);
cell.setCellValue("Enter values"); cell.setCellValue("Enter values");
cell.setCellStyle(styles.get("item_right")); cell.setCellStyle(styles.get("item_right"));
@ -73,6 +81,7 @@ public class LoanCalculator {
cell.setCellStyle(styles.get("item_left")); cell.setCellStyle(styles.get("item_left"));
cell = row.createCell(4); cell = row.createCell(4);
cell.setCellStyle(styles.get("input_$")); cell.setCellStyle(styles.get("input_$"));
cell.setAsActiveCell();
row = sheet.createRow(4); row = sheet.createRow(4);
cell = row.createCell(2); cell = row.createCell(2);
@ -127,10 +136,11 @@ public class LoanCalculator {
cell.setCellFormula("IF(Values_Entered,Monthly_Payment*Number_of_Payments,\"\")"); cell.setCellFormula("IF(Values_Entered,Monthly_Payment*Number_of_Payments,\"\")");
cell.setCellStyle(styles.get("formula_$")); cell.setCellStyle(styles.get("formula_$"));
sheet.setActiveCell("E4");
// Write the output to a file // Write the output to a file
FileOutputStream out = new FileOutputStream("loan-calculator.xlsx"); String file = "loan-calculator.xls";
if(wb instanceof XSSFWorkbook) file += "x";
FileOutputStream out = new FileOutputStream(file);
wb.write(out); wb.write(out);
out.close(); out.close();
} }
@ -138,126 +148,122 @@ public class LoanCalculator {
/** /**
* cell styles used for formatting calendar sheets * cell styles used for formatting calendar sheets
*/ */
private static Map<String, XSSFCellStyle> createStyles(XSSFWorkbook wb){ private static Map<String, CellStyle> createStyles(Workbook wb){
Map<String, XSSFCellStyle> styles = new HashMap<String, XSSFCellStyle>(); Map<String, CellStyle> styles = new HashMap<String, CellStyle>();
XSSFCellStyle style; CellStyle style;
XSSFFont titleFont = wb.createFont(); Font titleFont = wb.createFont();
titleFont.setFontHeightInPoints((short)14); titleFont.setFontHeightInPoints((short)14);
titleFont.setFontName("Trebuchet MS"); titleFont.setFontName("Trebuchet MS");
style = wb.createCellStyle(); style = wb.createCellStyle();
style.setFont(titleFont); style.setFont(titleFont);
style.setBorderBottom(BorderStyle.DOTTED); style.setBorderBottom(CellStyle.BORDER_DOTTED);
style.setBottomBorderColor(IndexedColors.GREY_40_PERCENT.getIndex()); style.setBottomBorderColor(IndexedColors.GREY_40_PERCENT.getIndex());
styles.put("title", style); styles.put("title", style);
XSSFFont itemFont = wb.createFont(); Font itemFont = wb.createFont();
itemFont.setFontHeightInPoints((short)9); itemFont.setFontHeightInPoints((short)9);
itemFont.setFontName("Trebuchet MS"); itemFont.setFontName("Trebuchet MS");
style = wb.createCellStyle(); style = wb.createCellStyle();
style.setAlignment(HorizontalAlignment.LEFT); style.setAlignment(CellStyle.ALIGN_LEFT);
style.setFont(itemFont); style.setFont(itemFont);
styles.put("item_left", style); styles.put("item_left", style);
style = wb.createCellStyle(); style = wb.createCellStyle();
style.setAlignment(HorizontalAlignment.RIGHT); style.setAlignment(CellStyle.ALIGN_RIGHT);
style.setFont(itemFont); style.setFont(itemFont);
styles.put("item_right", style); styles.put("item_right", style);
style = wb.createCellStyle(); style = wb.createCellStyle();
style.setAlignment(HorizontalAlignment.RIGHT); style.setAlignment(CellStyle.ALIGN_RIGHT);
style.setFont(itemFont); style.setFont(itemFont);
style.setBorderRight(BorderStyle.DOTTED); style.setBorderRight(CellStyle.BORDER_DOTTED);
style.setRightBorderColor(IndexedColors.GREY_40_PERCENT.getIndex()); style.setRightBorderColor(IndexedColors.GREY_40_PERCENT.getIndex());
style.setBorderBottom(BorderStyle.DOTTED); style.setBorderBottom(CellStyle.BORDER_DOTTED);
style.setBottomBorderColor(IndexedColors.GREY_40_PERCENT.getIndex()); style.setBottomBorderColor(IndexedColors.GREY_40_PERCENT.getIndex());
style.setBorderLeft(BorderStyle.DOTTED); style.setBorderLeft(CellStyle.BORDER_DOTTED);
style.setLeftBorderColor(IndexedColors.GREY_40_PERCENT.getIndex()); style.setLeftBorderColor(IndexedColors.GREY_40_PERCENT.getIndex());
style.setBorderTop(BorderStyle.DOTTED); style.setBorderTop(CellStyle.BORDER_DOTTED);
style.setTopBorderColor(IndexedColors.GREY_40_PERCENT.getIndex()); style.setTopBorderColor(IndexedColors.GREY_40_PERCENT.getIndex());
style.setDataFormat(wb.createDataFormat().getFormat("_($* #,##0.00_);_($* (#,##0.00);_($* \"-\"??_);_(@_)")); style.setDataFormat(wb.createDataFormat().getFormat("_($* #,##0.00_);_($* (#,##0.00);_($* \"-\"??_);_(@_)"));
styles.put("input_$", style); styles.put("input_$", style);
style = wb.createCellStyle(); style = wb.createCellStyle();
style.setAlignment(HorizontalAlignment.RIGHT); style.setAlignment(CellStyle.ALIGN_RIGHT);
style.setFont(itemFont); style.setFont(itemFont);
style.setBorderRight(BorderStyle.DOTTED); style.setBorderRight(CellStyle.BORDER_DOTTED);
style.setRightBorderColor(IndexedColors.GREY_40_PERCENT.getIndex()); style.setRightBorderColor(IndexedColors.GREY_40_PERCENT.getIndex());
style.setBorderBottom(BorderStyle.DOTTED); style.setBorderBottom(CellStyle.BORDER_DOTTED);
style.setBottomBorderColor(IndexedColors.GREY_40_PERCENT.getIndex()); style.setBottomBorderColor(IndexedColors.GREY_40_PERCENT.getIndex());
style.setBorderLeft(BorderStyle.DOTTED); style.setBorderLeft(CellStyle.BORDER_DOTTED);
style.setLeftBorderColor(IndexedColors.GREY_40_PERCENT.getIndex()); style.setLeftBorderColor(IndexedColors.GREY_40_PERCENT.getIndex());
style.setBorderTop(BorderStyle.DOTTED); style.setBorderTop(CellStyle.BORDER_DOTTED);
style.setTopBorderColor(IndexedColors.GREY_40_PERCENT.getIndex()); style.setTopBorderColor(IndexedColors.GREY_40_PERCENT.getIndex());
style.setDataFormat(wb.createDataFormat().getFormat("0.000%")); style.setDataFormat(wb.createDataFormat().getFormat("0.000%"));
styles.put("input_%", style); styles.put("input_%", style);
style = wb.createCellStyle(); style = wb.createCellStyle();
style.setAlignment(HorizontalAlignment.RIGHT); style.setAlignment(CellStyle.ALIGN_RIGHT);
style.setFont(itemFont); style.setFont(itemFont);
style.setBorderRight(BorderStyle.DOTTED); style.setBorderRight(CellStyle.BORDER_DOTTED);
style.setRightBorderColor(IndexedColors.GREY_40_PERCENT.getIndex()); style.setRightBorderColor(IndexedColors.GREY_40_PERCENT.getIndex());
style.setBorderBottom(BorderStyle.DOTTED); style.setBorderBottom(CellStyle.BORDER_DOTTED);
style.setBottomBorderColor(IndexedColors.GREY_40_PERCENT.getIndex()); style.setBottomBorderColor(IndexedColors.GREY_40_PERCENT.getIndex());
style.setBorderLeft(BorderStyle.DOTTED); style.setBorderLeft(CellStyle.BORDER_DOTTED);
style.setLeftBorderColor(IndexedColors.GREY_40_PERCENT.getIndex()); style.setLeftBorderColor(IndexedColors.GREY_40_PERCENT.getIndex());
style.setBorderTop(BorderStyle.DOTTED); style.setBorderTop(CellStyle.BORDER_DOTTED);
style.setTopBorderColor(IndexedColors.GREY_40_PERCENT.getIndex()); style.setTopBorderColor(IndexedColors.GREY_40_PERCENT.getIndex());
style.setDataFormat(wb.createDataFormat().getFormat("0")); style.setDataFormat(wb.createDataFormat().getFormat("0"));
styles.put("input_i", style); styles.put("input_i", style);
style = wb.createCellStyle(); style = wb.createCellStyle();
style.setAlignment(HorizontalAlignment.CENTER); style.setAlignment(CellStyle.ALIGN_CENTER);
style.setFont(itemFont); style.setFont(itemFont);
style.setDataFormat(wb.createDataFormat().getFormat("m/d/yy")); style.setDataFormat(wb.createDataFormat().getFormat("m/d/yy"));
styles.put("input_d", style); styles.put("input_d", style);
style = wb.createCellStyle(); style = wb.createCellStyle();
style.setAlignment(HorizontalAlignment.RIGHT); style.setAlignment(CellStyle.ALIGN_RIGHT);
style.setFont(itemFont); style.setFont(itemFont);
style.setBorderRight(BorderStyle.DOTTED); style.setBorderRight(CellStyle.BORDER_DOTTED);
style.setRightBorderColor(IndexedColors.GREY_40_PERCENT.getIndex()); style.setRightBorderColor(IndexedColors.GREY_40_PERCENT.getIndex());
style.setBorderBottom(BorderStyle.DOTTED); style.setBorderBottom(CellStyle.BORDER_DOTTED);
style.setBottomBorderColor(IndexedColors.GREY_40_PERCENT.getIndex()); style.setBottomBorderColor(IndexedColors.GREY_40_PERCENT.getIndex());
style.setBorderLeft(BorderStyle.DOTTED); style.setBorderLeft(CellStyle.BORDER_DOTTED);
style.setLeftBorderColor(IndexedColors.GREY_40_PERCENT.getIndex()); style.setLeftBorderColor(IndexedColors.GREY_40_PERCENT.getIndex());
style.setBorderTop(BorderStyle.DOTTED); style.setBorderTop(CellStyle.BORDER_DOTTED);
style.setTopBorderColor(IndexedColors.GREY_40_PERCENT.getIndex()); style.setTopBorderColor(IndexedColors.GREY_40_PERCENT.getIndex());
style.setDataFormat(wb.createDataFormat().getFormat("$##,##0.00")); style.setDataFormat(wb.createDataFormat().getFormat("$##,##0.00"));
style.setBorderBottom(BorderStyle.DOTTED); style.setBorderBottom(CellStyle.BORDER_DOTTED);
style.setBottomBorderColor(IndexedColors.GREY_40_PERCENT.getIndex()); style.setBottomBorderColor(IndexedColors.GREY_40_PERCENT.getIndex());
style.setFillForegroundColor(new XSSFColor(new java.awt.Color(234, 234, 234))); style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
style.setFillPattern(FillPatternType.SOLID_FOREGROUND); style.setFillPattern(CellStyle.SOLID_FOREGROUND);
styles.put("formula_$", style); styles.put("formula_$", style);
style = wb.createCellStyle(); style = wb.createCellStyle();
style.setAlignment(HorizontalAlignment.RIGHT); style.setAlignment(CellStyle.ALIGN_RIGHT);
style.setFont(itemFont); style.setFont(itemFont);
style.setBorderRight(BorderStyle.DOTTED); style.setBorderRight(CellStyle.BORDER_DOTTED);
style.setRightBorderColor(IndexedColors.GREY_40_PERCENT.getIndex()); style.setRightBorderColor(IndexedColors.GREY_40_PERCENT.getIndex());
style.setBorderBottom(BorderStyle.DOTTED); style.setBorderBottom(CellStyle.BORDER_DOTTED);
style.setBottomBorderColor(IndexedColors.GREY_40_PERCENT.getIndex()); style.setBottomBorderColor(IndexedColors.GREY_40_PERCENT.getIndex());
style.setBorderLeft(BorderStyle.DOTTED); style.setBorderLeft(CellStyle.BORDER_DOTTED);
style.setLeftBorderColor(IndexedColors.GREY_40_PERCENT.getIndex()); style.setLeftBorderColor(IndexedColors.GREY_40_PERCENT.getIndex());
style.setBorderTop(BorderStyle.DOTTED); style.setBorderTop(CellStyle.BORDER_DOTTED);
style.setTopBorderColor(IndexedColors.GREY_40_PERCENT.getIndex()); style.setTopBorderColor(IndexedColors.GREY_40_PERCENT.getIndex());
style.setDataFormat(wb.createDataFormat().getFormat("0")); style.setDataFormat(wb.createDataFormat().getFormat("0"));
style.setBorderBottom(BorderStyle.DOTTED); style.setBorderBottom(CellStyle.BORDER_DOTTED);
style.setBottomBorderColor(IndexedColors.GREY_40_PERCENT.getIndex()); style.setBottomBorderColor(IndexedColors.GREY_40_PERCENT.getIndex());
style.setFillForegroundColor(new XSSFColor(new java.awt.Color(234, 234, 234))); style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
style.setFillPattern(FillPatternType.SOLID_FOREGROUND); style.setFillPattern(CellStyle.SOLID_FOREGROUND);
styles.put("formula_i", style); styles.put("formula_i", style);
return styles; return styles;
} }
//define named ranges for the inputs and formulas //define named ranges for the inputs and formulas
public static void createNames(XSSFWorkbook wb){ public static void createNames(Workbook wb){
XSSFName name; Name name;
name = wb.createName();
name.setNameName("Header_Row");
name.setReference("ROW('Loan Calculator'!#REF!)");
name = wb.createName(); name = wb.createName();
name.setNameName("Interest_Rate"); name.setNameName("Interest_Rate");
@ -267,10 +273,6 @@ public class LoanCalculator {
name.setNameName("Loan_Amount"); name.setNameName("Loan_Amount");
name.setReference("'Loan Calculator'!$E$4"); name.setReference("'Loan Calculator'!$E$4");
name = wb.createName();
name.setNameName("Loan_Not_Paid");
name.setReference("F(Payment_Number<=Number_of_Payments,1,0)");
name = wb.createName(); name = wb.createName();
name.setNameName("Loan_Start"); name.setNameName("Loan_Start");
name.setReference("'Loan Calculator'!$E$7"); name.setReference("'Loan Calculator'!$E$7");
@ -279,21 +281,13 @@ public class LoanCalculator {
name.setNameName("Loan_Years"); name.setNameName("Loan_Years");
name.setReference("'Loan Calculator'!$E$6"); name.setReference("'Loan Calculator'!$E$6");
name = wb.createName();
name.setNameName("Monthly_Payment");
name.setReference("-PMT(Interest_Rate/12,Number_of_Payments,Loan_Amount)");
name = wb.createName(); name = wb.createName();
name.setNameName("Number_of_Payments"); name.setNameName("Number_of_Payments");
name.setReference("'Loan Calculator'!$E$10"); name.setReference("'Loan Calculator'!$E$10");
name = wb.createName(); name = wb.createName();
name.setNameName("Payment_Number"); name.setNameName("Monthly_Payment");
name.setReference("ROW()-Header_Row"); name.setReference("-PMT(Interest_Rate/12,Number_of_Payments,Loan_Amount)");
name = wb.createName();
name.setNameName("Principal");
name.setReference("-PPMT(Interest_Rate/12,Payment_Number,Number_of_Payments,Loan_Amount)");
name = wb.createName(); name = wb.createName();
name.setNameName("Total_Cost"); name.setNameName("Total_Cost");
@ -306,7 +300,5 @@ public class LoanCalculator {
name = wb.createName(); name = wb.createName();
name.setNameName("Values_Entered"); name.setNameName("Values_Entered");
name.setReference("IF(Loan_Amount*Interest_Rate*Loan_Years*Loan_Start>0,1,0)"); name.setReference("IF(Loan_Amount*Interest_Rate*Loan_Years*Loan_Start>0,1,0)");
} }
} }

View File

@ -14,11 +14,12 @@
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
==================================================================== */ ==================================================================== */
package org.apache.poi.xssf.usermodel.examples; package org.apache.poi.ss.examples;
import org.apache.poi.xssf.usermodel.*; import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.ss.usermodel.*; import org.apache.poi.ss.usermodel.*;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import java.util.Map; import java.util.Map;
import java.util.HashMap; import java.util.HashMap;
@ -26,6 +27,8 @@ import java.io.FileOutputStream;
/** /**
* A weekly timesheet created using Apache POI. * A weekly timesheet created using Apache POI.
* Usage:
* TimesheetDemo -xls|xlsx
* *
* @author Yegor Kozlov * @author Yegor Kozlov
*/ */
@ -37,32 +40,35 @@ public class TimesheetDemo {
private static Object[][] sample_data = { private static Object[][] sample_data = {
{"Yegor Kozlov", "YK", 5.0, 8.0, 10.0, 5.0, 5.0, 7.0, 6.0}, {"Yegor Kozlov", "YK", 5.0, 8.0, 10.0, 5.0, 5.0, 7.0, 6.0},
{"Gisella Bronsetti", "GB", 4.0, 3.0, 1.0, 3.5, null, null, 4.0}, {"Gisella Bronzetti", "GB", 4.0, 3.0, 1.0, 3.5, null, null, 4.0},
}; };
public static void main(String[] args) throws Exception { public static void main(String[] args) throws Exception {
Workbook wb;
XSSFWorkbook wb = new XSSFWorkbook(); if(args.length > 0 && args[0].equals("-xls")) wb = new HSSFWorkbook();
Map<String, XSSFCellStyle> styles = createStyles(wb); else wb = new XSSFWorkbook();
XSSFSheet sheet = wb.createSheet("Timesheet"); Map<String, CellStyle> styles = createStyles(wb);
XSSFPrintSetup printSetup = sheet.getPrintSetup();
printSetup.setOrientation(PrintOrientation.LANDSCAPE); Sheet sheet = wb.createSheet("Timesheet");
PrintSetup printSetup = sheet.getPrintSetup();
printSetup.setLandscape(true);
sheet.setFitToPage(true); sheet.setFitToPage(true);
sheet.setHorizontallyCenter(true); sheet.setHorizontallyCenter(true);
//title row //title row
XSSFRow titleRow = sheet.createRow(0); Row titleRow = sheet.createRow(0);
titleRow.setHeightInPoints(45); titleRow.setHeightInPoints(45);
XSSFCell titleCell = titleRow.createCell(0); Cell titleCell = titleRow.createCell(0);
titleCell.setCellValue("Weekly Timesheet"); titleCell.setCellValue("Weekly Timesheet");
titleCell.setCellStyle(styles.get("title")); titleCell.setCellStyle(styles.get("title"));
sheet.addMergedRegion(CellRangeAddress.valueOf("$A$1:$L$1")); sheet.addMergedRegion(CellRangeAddress.valueOf("$A$1:$L$1"));
//header row //header row
XSSFRow headerRow = sheet.createRow(1); Row headerRow = sheet.createRow(1);
headerRow.setHeightInPoints(40); headerRow.setHeightInPoints(40);
XSSFCell headerCell; Cell headerCell;
for (int i = 0; i < titles.length; i++) { for (int i = 0; i < titles.length; i++) {
headerCell = headerRow.createCell(i); headerCell = headerRow.createCell(i);
headerCell.setCellValue(titles[i]); headerCell.setCellValue(titles[i]);
@ -71,9 +77,9 @@ public class TimesheetDemo {
int rownum = 2; int rownum = 2;
for (int i = 0; i < 10; i++) { for (int i = 0; i < 10; i++) {
XSSFRow row = sheet.createRow(rownum++); Row row = sheet.createRow(rownum++);
for (int j = 0; j < titles.length; j++) { for (int j = 0; j < titles.length; j++) {
XSSFCell cell = row.createCell(j); Cell cell = row.createCell(j);
if(j == 9){ if(j == 9){
//the 10th cell contains sum over week days, e.g. SUM(C3:I3) //the 10th cell contains sum over week days, e.g. SUM(C3:I3)
String ref = "C" +rownum+ ":I" + rownum; String ref = "C" +rownum+ ":I" + rownum;
@ -89,9 +95,9 @@ public class TimesheetDemo {
} }
//row with totals below //row with totals below
XSSFRow sumRow = sheet.createRow(rownum++); Row sumRow = sheet.createRow(rownum++);
sumRow.setHeightInPoints(35); sumRow.setHeightInPoints(35);
XSSFCell cell; Cell cell;
cell = sumRow.createCell(0); cell = sumRow.createCell(0);
cell.setCellStyle(styles.get("formula")); cell.setCellStyle(styles.get("formula"));
cell = sumRow.createCell(1); cell = sumRow.createCell(1);
@ -125,7 +131,7 @@ public class TimesheetDemo {
//set sample data //set sample data
for (int i = 0; i < sample_data.length; i++) { for (int i = 0; i < sample_data.length; i++) {
XSSFRow row = sheet.getRow(2 + i); Row row = sheet.getRow(2 + i);
for (int j = 0; j < sample_data[i].length; j++) { for (int j = 0; j < sample_data[i].length; j++) {
if(sample_data[i][j] == null) continue; if(sample_data[i][j] == null) continue;
@ -137,70 +143,74 @@ public class TimesheetDemo {
} }
} }
//finally set column widths //finally set column widths, the width is measured in units of 1/256th of a character width
sheet.setColumnWidth(0, 30*256); sheet.setColumnWidth(0, 30*256); //30 characters wide
for (int i = 2; i < 9; i++) { for (int i = 2; i < 9; i++) {
sheet.setColumnWidth(i, 6*256); sheet.setColumnWidth(i, 6*256); //6 characters wide
} }
sheet.setColumnWidth(10, 10*256); //10 characters wide
// Write the output to a file // Write the output to a file
FileOutputStream out = new FileOutputStream("ooxml-timesheet.xlsx"); String file = "timesheet.xls";
if(wb instanceof XSSFWorkbook) file += "x";
FileOutputStream out = new FileOutputStream(file);
wb.write(out); wb.write(out);
out.close(); out.close();
} }
private static Map<String, XSSFCellStyle> createStyles(XSSFWorkbook wb){ /**
Map<String, XSSFCellStyle> styles = new HashMap<String, XSSFCellStyle>(); * Create a library of cell styles
XSSFCellStyle style; */
XSSFFont titleFont = wb.createFont(); private static Map<String, CellStyle> createStyles(Workbook wb){
Map<String, CellStyle> styles = new HashMap<String, CellStyle>();
CellStyle style;
Font titleFont = wb.createFont();
titleFont.setFontHeightInPoints((short)18); titleFont.setFontHeightInPoints((short)18);
titleFont.setBold(true); titleFont.setBoldweight(Font.BOLDWEIGHT_BOLD);
style = wb.createCellStyle(); style = wb.createCellStyle();
style.setAlignment(HorizontalAlignment.CENTER); style.setAlignment(CellStyle.ALIGN_CENTER);
style.setVerticalAlignment(VerticalAlignment.CENTER); style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
style.setFillForegroundColor(new XSSFColor(new java.awt.Color(234, 234, 234)));
style.setFillPattern(FillPatternType.SOLID_FOREGROUND);
style.setFont(titleFont); style.setFont(titleFont);
styles.put("title", style); styles.put("title", style);
XSSFFont monthFont = wb.createFont(); Font monthFont = wb.createFont();
monthFont.setFontHeightInPoints((short)11); monthFont.setFontHeightInPoints((short)11);
monthFont.setColor(new XSSFColor(new java.awt.Color(255, 255, 255))); monthFont.setColor(IndexedColors.WHITE.getIndex());
style = wb.createCellStyle(); style = wb.createCellStyle();
style.setAlignment(HorizontalAlignment.CENTER); style.setAlignment(CellStyle.ALIGN_CENTER);
style.setVerticalAlignment(VerticalAlignment.CENTER); style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
style.setFillForegroundColor(new XSSFColor(new java.awt.Color(102, 102, 102))); style.setFillForegroundColor(IndexedColors.GREY_50_PERCENT.getIndex());
style.setFillPattern(FillPatternType.SOLID_FOREGROUND); style.setFillPattern(CellStyle.SOLID_FOREGROUND);
style.setFont(monthFont); style.setFont(monthFont);
style.setWrapText(true); style.setWrapText(true);
styles.put("header", style); styles.put("header", style);
style = wb.createCellStyle(); style = wb.createCellStyle();
style.setAlignment(HorizontalAlignment.CENTER); style.setAlignment(CellStyle.ALIGN_CENTER);
style.setWrapText(true); style.setWrapText(true);
style.setBorderRight(BorderStyle.THIN); style.setBorderRight(CellStyle.BORDER_THIN);
style.setRightBorderColor(IndexedColors.BLACK.getIndex()); style.setRightBorderColor(IndexedColors.BLACK.getIndex());
style.setBorderLeft(BorderStyle.THIN); style.setBorderLeft(CellStyle.BORDER_THIN);
style.setLeftBorderColor(IndexedColors.BLACK.getIndex()); style.setLeftBorderColor(IndexedColors.BLACK.getIndex());
style.setBorderTop(BorderStyle.THIN); style.setBorderTop(CellStyle.BORDER_THIN);
style.setTopBorderColor(IndexedColors.BLACK.getIndex()); style.setTopBorderColor(IndexedColors.BLACK.getIndex());
style.setBorderBottom(BorderStyle.THIN); style.setBorderBottom(CellStyle.BORDER_THIN);
style.setBottomBorderColor(IndexedColors.BLACK.getIndex()); style.setBottomBorderColor(IndexedColors.BLACK.getIndex());
styles.put("cell", style); styles.put("cell", style);
style = wb.createCellStyle(); style = wb.createCellStyle();
style.setAlignment(HorizontalAlignment.CENTER); style.setAlignment(CellStyle.ALIGN_CENTER);
style.setVerticalAlignment(VerticalAlignment.CENTER); style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
style.setFillForegroundColor(new XSSFColor(new java.awt.Color(234, 234, 234))); style.setFillForegroundColor(IndexedColors.GREY_25_PERCENT.getIndex());
style.setFillPattern(FillPatternType.SOLID_FOREGROUND); style.setFillPattern(CellStyle.SOLID_FOREGROUND);
style.setDataFormat(wb.createDataFormat().getFormat("0.00")); style.setDataFormat(wb.createDataFormat().getFormat("0.00"));
styles.put("formula", style); styles.put("formula", style);
style = wb.createCellStyle(); style = wb.createCellStyle();
style.setAlignment(HorizontalAlignment.CENTER); style.setAlignment(CellStyle.ALIGN_CENTER);
style.setVerticalAlignment(VerticalAlignment.CENTER); style.setVerticalAlignment(CellStyle.VERTICAL_CENTER);
style.setFillForegroundColor(new XSSFColor(new java.awt.Color(192, 192, 192))); style.setFillForegroundColor(IndexedColors.GREY_40_PERCENT.getIndex());
style.setFillPattern(FillPatternType.SOLID_FOREGROUND); style.setFillPattern(CellStyle.SOLID_FOREGROUND);
style.setDataFormat(wb.createDataFormat().getFormat("0.00")); style.setDataFormat(wb.createDataFormat().getFormat("0.00"));
styles.put("formula_2", style); styles.put("formula_2", style);

View File

@ -27,6 +27,9 @@ import java.util.HashMap;
/** /**
* A monthly calendar created using Apache POI. Each month is on a separate sheet. * A monthly calendar created using Apache POI. Each month is on a separate sheet.
* This is a version of org.apache.poi.ss.examples.CalendarDemo that demonstrates
* some XSSF features not avaiable when using common HSSF-XSSF interfaces.
*
* <pre> * <pre>
* Usage: * Usage:
* CalendarDemo <year> * CalendarDemo <year>

View File

@ -509,8 +509,7 @@ public class HSSFCell implements Cell {
} }
/** /**
* set a string value for the cell. Please note that if you are using * Set a string value for the cell.
* full 16 bit unicode you should call <code>setEncoding()</code> first.
* *
* @param value value to set the cell to. For formulas we'll set the formula * @param value value to set the cell to. For formulas we'll set the formula
* string, for String cells we'll set its value. For other types we will * string, for String cells we'll set its value. For other types we will

View File

@ -1626,6 +1626,12 @@ public class HSSFSheet implements org.apache.poi.ss.usermodel.Sheet
sheet.groupColumnRange(fromColumn, toColumn, false); sheet.groupColumnRange(fromColumn, toColumn, false);
} }
/**
* Tie a range of cell together so that they can be collapsed or expanded
*
* @param fromRow start row (0-based)
* @param toRow end row (0-based)
*/
public void groupRow(int fromRow, int toRow) public void groupRow(int fromRow, int toRow)
{ {
sheet.groupRowRange( fromRow, toRow, true ); sheet.groupRowRange( fromRow, toRow, true );

View File

@ -145,21 +145,33 @@ public interface Cell {
void setCellValue(Calendar value); void setCellValue(Calendar value);
/** /**
* set a string value for the cell. Please note that if you are using * Set a rich string value for the cell.
* full 16 bit unicode you should call <code>setEncoding()</code> first.
* *
* @param value value to set the cell to. For formulas we'll set the formula * @param value value to set the cell to. For formulas we'll set the formula
* string, for String cells we'll set its value. For other types we will * string, for String cells we'll set its value. For other types we will
* change the cell to a string cell and set its value. * change the cell to a string cell and set its value.
* If value is null then we will change the cell to a Blank cell. * If value is null then we will change the cell to a Blank cell.
*/ */
void setCellValue(RichTextString value); void setCellValue(RichTextString value);
/**
* Set a string value for the cell.
*
* @param value value to set the cell to. For formulas we'll set the formula
* string, for String cells we'll set its value. For other types we will
* change the cell to a string cell and set its value.
* If value is null then we will change the cell to a Blank cell.
*/
void setCellValue(String value); void setCellValue(String value);
/**
* Set a formula value for the cell.
*/
void setCellFormula(String formula); void setCellFormula(String formula);
/**
* Get the formula value of the cell.
*/
String getCellFormula(); String getCellFormula();
/** /**

View File

@ -409,7 +409,6 @@ public interface Sheet extends Iterable<Row> {
* Additionally shifts merged regions that are completely defined in these * Additionally shifts merged regions that are completely defined in these
* rows (ie. merged 2 cells on a row to be shifted). * rows (ie. merged 2 cells on a row to be shifted).
* <p> * <p>
* TODO Might want to add bounds checking here
* @param startRow the row to start shifting * @param startRow the row to start shifting
* @param endRow the row to end shifting * @param endRow the row to end shifting
* @param n the number of rows to shift * @param n the number of rows to shift
@ -541,14 +540,6 @@ public interface Sheet extends Iterable<Row> {
*/ */
void removeColumnBreak(short column); void removeColumnBreak(short column);
/**
* Creates the toplevel drawing patriarch. This will have the effect of
* removing any existing drawings on this sheet.
*
* @return The new patriarch.
*/
//Patriarch createDrawingPatriarch();
/** /**
* Expands or collapses a column group. * Expands or collapses a column group.
* *
@ -567,10 +558,28 @@ public interface Sheet extends Iterable<Row> {
void ungroupColumn(short fromColumn, short toColumn); void ungroupColumn(short fromColumn, short toColumn);
/**
* Tie a range of rows together so that they can be collapsed or expanded
*
* @param fromRow start row (0-based)
* @param toRow end row (0-based)
*/
void groupRow(int fromRow, int toRow); void groupRow(int fromRow, int toRow);
/**
* Ungroup a range of rows that were previously groupped
*
* @param fromRow start row (0-based)
* @param toRow end row (0-based)
*/
void ungroupRow(int fromRow, int toRow); void ungroupRow(int fromRow, int toRow);
/**
* Set view state of a groupped range of rows
*
* @param row start row of a groupped range of rows (0-based)
* @param collapse whether to expand/collapse the detail rows
*/
void setRowGroupCollapsed(int row, boolean collapse); void setRowGroupCollapsed(int row, boolean collapse);
/** /**
@ -599,6 +608,11 @@ public interface Sheet extends Iterable<Row> {
*/ */
Comment getCellComment(int row, int column); Comment getCellComment(int row, int column);
/**
* Creates the top-level drawing patriarch.
*
* @return The new drawing patriarch.
*/
Drawing createDrawingPatriarch(); Drawing createDrawingPatriarch();
} }

View File

@ -32,7 +32,7 @@ public class XSSFSave {
XSSFWorkbook wb = new XSSFWorkbook(args[i]); XSSFWorkbook wb = new XSSFWorkbook(args[i]);
int sep = args[i].lastIndexOf('.'); int sep = args[i].lastIndexOf('.');
String outfile = args[i].substring(0, sep) + "-save.xlsx"; String outfile = args[i].substring(0, sep) + "-save.xls" + (wb.isMacroEnabled() ? "m" : "x");
FileOutputStream out = new FileOutputStream(outfile); FileOutputStream out = new FileOutputStream(outfile);
wb.write(out); wb.write(out);
out.close(); out.close();

View File

@ -952,20 +952,26 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
setSheetFormatPrOutlineLevelCol(); setSheetFormatPrOutlineLevelCol();
} }
/**
* Tie a range of cell together so that they can be collapsed or expanded
*
* @param fromRow start row (0-based)
* @param toRow end row (0-based)
*/
public void groupRow(int fromRow, int toRow) { public void groupRow(int fromRow, int toRow) {
for(int i=fromRow;i<=toRow;i++){ for (int i = fromRow; i <= toRow; i++) {
XSSFRow xrow = getRow(i-1); XSSFRow xrow = getRow(i);
if(xrow == null){//create a new Row if (xrow == null) {
xrow = createRow(i-1); xrow = createRow(i);
} }
CTRow ctrow=xrow.getCTRow(); CTRow ctrow = xrow.getCTRow();
short outlineLevel=ctrow.getOutlineLevel(); short outlineLevel = ctrow.getOutlineLevel();
ctrow.setOutlineLevel((short)(outlineLevel+1)); ctrow.setOutlineLevel((short) (outlineLevel + 1));
} }
setSheetFormatPrOutlineLevelRow(); setSheetFormatPrOutlineLevelRow();
} }
private short getMaxOutlineLevelRows(){ private short getMaxOutlineLevelRows(){
short outlineLevel=0; short outlineLevel=0;
for(Row r : rows.values()){ for(Row r : rows.values()){
XSSFRow xrow=(XSSFRow)r; XSSFRow xrow=(XSSFRow)r;
@ -1478,9 +1484,15 @@ public class XSSFSheet extends POIXMLDocumentPart implements Sheet {
setSheetFormatPrOutlineLevelCol(); setSheetFormatPrOutlineLevelCol();
} }
/**
* Ungroup a range of rows that were previously groupped
*
* @param fromRow start row (0-based)
* @param toRow end row (0-based)
*/
public void ungroupRow(int fromRow, int toRow) { public void ungroupRow(int fromRow, int toRow) {
for (int i = fromRow; i <= toRow; i++) { for (int i = fromRow; i <= toRow; i++) {
XSSFRow xrow = getRow(i - 1); XSSFRow xrow = getRow(i);
if (xrow != null) { if (xrow != null) {
CTRow ctrow = xrow.getCTRow(); CTRow ctrow = xrow.getCTRow();
short outlinelevel = ctrow.getOutlineLevel(); short outlinelevel = ctrow.getOutlineLevel();

View File

@ -789,19 +789,19 @@ public class TestXSSFSheet extends TestCase {
//one level //one level
sheet.groupRow(9,10); sheet.groupRow(9,10);
assertEquals(2,sheet.getPhysicalNumberOfRows()); assertEquals(2,sheet.getPhysicalNumberOfRows());
CTRow ctrow = sheet.getRow(8).getCTRow(); CTRow ctrow = sheet.getRow(9).getCTRow();
assertNotNull(ctrow); assertNotNull(ctrow);
assertEquals(9,ctrow.getR()); assertEquals(10,ctrow.getR());
assertEquals(1, ctrow.getOutlineLevel()); assertEquals(1, ctrow.getOutlineLevel());
assertEquals(1,sheet.getCTWorksheet().getSheetFormatPr().getOutlineLevelRow()); assertEquals(1,sheet.getCTWorksheet().getSheetFormatPr().getOutlineLevelRow());
//two level //two level
sheet.groupRow(10,13); sheet.groupRow(10,13);
assertEquals(5,sheet.getPhysicalNumberOfRows()); assertEquals(5,sheet.getPhysicalNumberOfRows());
ctrow = sheet.getRow(9).getCTRow(); ctrow = sheet.getRow(10).getCTRow();
assertNotNull(ctrow); assertNotNull(ctrow);
assertEquals(10,ctrow.getR()); assertEquals(11,ctrow.getR());
assertEquals(2, ctrow.getOutlineLevel()); assertEquals(2, ctrow.getOutlineLevel());
assertEquals(2,sheet.getCTWorksheet().getSheetFormatPr().getOutlineLevelRow()); assertEquals(2,sheet.getCTWorksheet().getSheetFormatPr().getOutlineLevelRow());

View File

@ -14,7 +14,7 @@
See the License for the specific language governing permissions and See the License for the specific language governing permissions and
limitations under the License. limitations under the License.
==================================================================== */ ==================================================================== */
package org.apache.poi.hslf.usermodel.examples; package org.apache.poi.hslf.examples;
import org.apache.poi.ddf.*; import org.apache.poi.ddf.*;
import org.apache.poi.hslf.model.*; import org.apache.poi.hslf.model.*;
import org.apache.poi.hslf.record.InteractiveInfo; import org.apache.poi.hslf.record.InteractiveInfo;

View File

@ -286,7 +286,7 @@ public class TestMetaDataIPI extends TestCase{
/* Insert some custom properties into the container. */ /* Insert some custom properties into the container. */
customProperties.put("Key1", "Value1"); customProperties.put("Key1", "Value1");
customProperties.put("Schl<EFBFBD>ssel2", "Wert2"); customProperties.put("Schl\u00fcssel2", "Wert2");
customProperties.put("Sample Integer", new Integer(12345)); customProperties.put("Sample Integer", new Integer(12345));
customProperties.put("Sample Boolean", new Boolean(true)); customProperties.put("Sample Boolean", new Boolean(true));
Date date=new Date(); Date date=new Date();
@ -325,8 +325,8 @@ public class TestMetaDataIPI extends TestCase{
/* Insert some custom properties into the container. */ /* Insert some custom properties into the container. */
String a1=(String) customProperties.get("Key1"); String a1=(String) customProperties.get("Key1");
assertEquals("Key1","Value1",a1); assertEquals("Key1","Value1",a1);
String a2=(String) customProperties.get("Schl<EFBFBD>ssel2"); String a2=(String) customProperties.get("Schl\u00fcssel2");
assertEquals("Schl<EFBFBD>ssel2","Wert2",a2); assertEquals("Schl\u00fcssel2","Wert2",a2);
Integer a3=(Integer) customProperties.get("Sample Integer"); Integer a3=(Integer) customProperties.get("Sample Integer");
assertEquals("Sample Number",new Integer(12345),a3); assertEquals("Sample Number",new Integer(12345),a3);
Boolean a4=(Boolean) customProperties.get("Sample Boolean"); Boolean a4=(Boolean) customProperties.get("Sample Boolean");
@ -431,7 +431,7 @@ public void testTwo(){
String a1=(String) customProperties.get(k1); String a1=(String) customProperties.get(k1);
assertEquals("Key1",p1,a1); assertEquals("Key1",p1,a1);
String a2=(String) customProperties.get(k2); String a2=(String) customProperties.get(k2);
assertEquals("Schl<EFBFBD>ssel2",p2,a2); assertEquals("Schl\u00fcssel2",p2,a2);
Integer a3=(Integer) customProperties.get("Sample Number"); Integer a3=(Integer) customProperties.get("Sample Number");
assertEquals("Sample Number",new Integer(12345),a3); assertEquals("Sample Number",new Integer(12345),a3);
Boolean a4=(Boolean) customProperties.get("Sample Boolean"); Boolean a4=(Boolean) customProperties.get("Sample Boolean");
@ -450,7 +450,7 @@ public void testTwo(){
*/ */
public String strangize(String s){ public String strangize(String s){
StringBuffer sb=new StringBuffer(); StringBuffer sb=new StringBuffer();
String[] umlaute= {"<EFBFBD>","<EFBFBD>","<EFBFBD>","<EFBFBD>","$","<EFBFBD>","<EFBFBD>","<EFBFBD>","<EFBFBD>","@","<EFBFBD>","&"}; String[] umlaute= {"\u00e4","\u00fc","\u00f6","\u00dc","$","\u00d6","\u00dc","\u00c9","\u00d6","@","\u00e7","&"};
char j=0; char j=0;
Random rand=new Random(); Random rand=new Random();
for (int i=0;i<5;i++){ for (int i=0;i<5;i++){
@ -544,7 +544,7 @@ public void testThree(){
String a1=(String) customProperties.get(k1); String a1=(String) customProperties.get(k1);
assertEquals("Key1",p1,a1); assertEquals("Key1",p1,a1);
String a2=(String) customProperties.get(k2); String a2=(String) customProperties.get(k2);
assertEquals("Schl<EFBFBD>ssel2",p2,a2); assertEquals("Schl\u00fcssel2",p2,a2);
Integer a3=(Integer) customProperties.get("Sample Number"); Integer a3=(Integer) customProperties.get("Sample Number");
assertEquals("Sample Number",new Integer(12345),a3); assertEquals("Sample Number",new Integer(12345),a3);
Boolean a4=(Boolean) customProperties.get("Sample Boolean"); Boolean a4=(Boolean) customProperties.get("Sample Boolean");
@ -577,7 +577,7 @@ public void testThree(){
public String strangizeU(String s){ public String strangizeU(String s){
StringBuffer sb=new StringBuffer(); StringBuffer sb=new StringBuffer();
String[] umlaute= {"<EFBFBD>","<EFBFBD>","<EFBFBD>","<EFBFBD>","$","<EFBFBD>","<EFBFBD>","<EFBFBD>","<EFBFBD>","@","<EFBFBD>","&"}; String[] umlaute= {"\u00e4","\u00fc","\u00f6","\u00dc","$","\u00d6","\u00dc","\u00c9","\u00d6","@","\u00e7","&"};
char j=0; char j=0;
Random rand=new Random(); Random rand=new Random();
for (int i=0;i<5;i++){ for (int i=0;i<5;i++){
@ -592,7 +592,7 @@ public void testThree(){
sb.append(umlaute[rand.nextInt(umlaute.length)]); sb.append(umlaute[rand.nextInt(umlaute.length)]);
sb.append("<"); sb.append("<");
} }
sb.append("<EFBFBD><EFBFBD><EFBFBD>\uD840\uDC00"); sb.append("\u00e4\u00f6\u00fc\uD840\uDC00");
return sb.toString(); return sb.toString();
} }
/** /**
@ -668,7 +668,7 @@ public void testThree(){
String a1=(String) customProperties.get(k1); String a1=(String) customProperties.get(k1);
assertEquals("Key1",p1,a1); assertEquals("Key1",p1,a1);
String a2=(String) customProperties.get(k2); String a2=(String) customProperties.get(k2);
assertEquals("Schl<EFBFBD>ssel2",p2,a2); assertEquals("Schl\u00fcssel2",p2,a2);
Integer a3=(Integer) customProperties.get("Sample Number"); Integer a3=(Integer) customProperties.get("Sample Number");
assertEquals("Sample Number",new Integer(12345),a3); assertEquals("Sample Number",new Integer(12345),a3);
Boolean a4=(Boolean) customProperties.get("Sample Boolean"); Boolean a4=(Boolean) customProperties.get("Sample Boolean");

View File

@ -120,7 +120,6 @@ public class TestWriteWellKnown extends TestCase
for (int i = 0; i < docs.length; i++) for (int i = 0; i < docs.length; i++)
{ {
final File doc = docs[i]; final File doc = docs[i];
System.out.println("Reading file " + doc);
/* Read a test document <em>doc</em> into a POI filesystem. */ /* Read a test document <em>doc</em> into a POI filesystem. */
final POIFSFileSystem poifs = new POIFSFileSystem(new FileInputStream(doc)); final POIFSFileSystem poifs = new POIFSFileSystem(new FileInputStream(doc));
@ -351,10 +350,10 @@ public class TestWriteWellKnown extends TestCase
CustomProperties customProperties = dsi.getCustomProperties(); CustomProperties customProperties = dsi.getCustomProperties();
if (customProperties == null) if (customProperties == null)
customProperties = new CustomProperties(); customProperties = new CustomProperties();
customProperties.put("Schl\u00fcssel <EFBFBD>", "Wert <20>"); customProperties.put("Schl\u00fcssel \u00e4", "Wert \u00e4");
customProperties.put("Schl\u00fcssel <EFBFBD><EFBFBD>", "Wert <20><>"); customProperties.put("Schl\u00fcssel \u00e4\u00f6", "Wert \u00e4\u00f6");
customProperties.put("Schl\u00fcssel <EFBFBD><EFBFBD><EFBFBD>", "Wert <20><><EFBFBD>"); customProperties.put("Schl\u00fcssel \u00e4\u00f6\u00fc", "Wert \u00e4\u00f6\u00fc");
customProperties.put("Schl\u00fcssel <EFBFBD><EFBFBD><EFBFBD><EFBFBD>", "Wert <20><><EFBFBD><EFBFBD>"); customProperties.put("Schl\u00fcssel \u00e4\u00f6\u00fc\u00d6", "Wert \u00e4\u00f6\u00fc\u00d6");
customProperties.put("positive_Integer", POSITIVE_INTEGER); customProperties.put("positive_Integer", POSITIVE_INTEGER);
customProperties.put("positive_Long", POSITIVE_LONG); customProperties.put("positive_Long", POSITIVE_LONG);
customProperties.put("positive_Double", POSITIVE_DOUBLE); customProperties.put("positive_Double", POSITIVE_DOUBLE);
@ -440,10 +439,10 @@ public class TestWriteWellKnown extends TestCase
final CustomProperties cps = dsi.getCustomProperties(); final CustomProperties cps = dsi.getCustomProperties();
assertEquals(customProperties, cps); assertEquals(customProperties, cps);
assertNull(cps.get("No value available")); assertNull(cps.get("No value available"));
assertEquals("Wert <EFBFBD>", cps.get("Schl\u00fcssel <EFBFBD>")); assertEquals("Wert \u00e4", cps.get("Schl\u00fcssel \u00e4"));
assertEquals("Wert <EFBFBD><EFBFBD>", cps.get("Schl\u00fcssel <EFBFBD><EFBFBD>")); assertEquals("Wert \u00e4\u00f6", cps.get("Schl\u00fcssel \u00e4\u00f6"));
assertEquals("Wert <EFBFBD><EFBFBD><EFBFBD>", cps.get("Schl\u00fcssel <EFBFBD><EFBFBD><EFBFBD>")); assertEquals("Wert \u00e4\u00f6\u00fc", cps.get("Schl\u00fcssel \u00e4\u00f6\u00fc"));
assertEquals("Wert <EFBFBD><EFBFBD><EFBFBD><EFBFBD>", cps.get("Schl\u00fcssel <EFBFBD><EFBFBD><EFBFBD><EFBFBD>")); assertEquals("Wert \u00e4\u00f6\u00fc\u00d6", cps.get("Schl\u00fcssel \u00e4\u00f6\u00fc\u00d6"));
assertEquals(POSITIVE_INTEGER, cps.get("positive_Integer")); assertEquals(POSITIVE_INTEGER, cps.get("positive_Integer"));
assertEquals(POSITIVE_LONG, cps.get("positive_Long")); assertEquals(POSITIVE_LONG, cps.get("positive_Long"));
assertEquals(POSITIVE_DOUBLE, cps.get("positive_Double")); assertEquals(POSITIVE_DOUBLE, cps.get("positive_Double"));
@ -665,7 +664,7 @@ public class TestWriteWellKnown extends TestCase
*/ */
public void testCustomerProperties() public void testCustomerProperties()
{ {
final String KEY = "Schl\u00fcssel <EFBFBD>"; final String KEY = "Schl\u00fcssel \u00e4";
final String VALUE_1 = "Wert 1"; final String VALUE_1 = "Wert 1";
final String VALUE_2 = "Wert 2"; final String VALUE_2 = "Wert 2";
@ -705,7 +704,7 @@ public class TestWriteWellKnown extends TestCase
{ {
final int ID_1 = 2; final int ID_1 = 2;
final int ID_2 = 3; final int ID_2 = 3;
final String NAME_1 = "Schl\u00fcssel <EFBFBD>"; final String NAME_1 = "Schl\u00fcssel \u00e4";
final String VALUE_1 = "Wert 1"; final String VALUE_1 = "Wert 1";
final Map dictionary = new HashMap(); final Map dictionary = new HashMap();