From c94ce5034479bb7ee41200637af49780aa5ec1ea Mon Sep 17 00:00:00 2001 From: Nick Burch Date: Sun, 16 Mar 2008 17:23:24 +0000 Subject: [PATCH] More create helper stuff, and some sample formatting files git-svn-id: https://svn.apache.org/repos/asf/poi/branches/ooxml@637614 13f79535-47bb-0310-9956-ffa450edef68 --- .../content/xdocs/spreadsheet/quick-guide.xml | 18 ++++--- .../ss/usermodel/examples/FromQuickGuide.java | 36 +++++++++++++- .../apache/poi/hssf/usermodel/HSSFCell.java | 7 --- .../hssf/usermodel/HSSFCreationHelper.java | 44 ++++++++++++++++++ .../poi/hssf/usermodel/HSSFWorkbook.java | 5 ++ .../org/apache/poi/hssf/data/Formatting.xls | Bin 0 -> 18432 bytes .../org/apache/poi/hssf/data/Formatting.xlsx | Bin 0 -> 8847 bytes 7 files changed, 95 insertions(+), 15 deletions(-) create mode 100644 src/java/org/apache/poi/hssf/usermodel/HSSFCreationHelper.java create mode 100755 src/testcases/org/apache/poi/hssf/data/Formatting.xls create mode 100755 src/testcases/org/apache/poi/hssf/data/Formatting.xlsx diff --git a/src/documentation/content/xdocs/spreadsheet/quick-guide.xml b/src/documentation/content/xdocs/spreadsheet/quick-guide.xml index bde88d43bd..528582beb0 100644 --- a/src/documentation/content/xdocs/spreadsheet/quick-guide.xml +++ b/src/documentation/content/xdocs/spreadsheet/quick-guide.xml @@ -105,6 +105,7 @@ Workbook wb = new HSSFWorkbook(); //Workbook wb = new XSSFWorkbook(); + CreationHelper createHelper = wb.getCreationHelper(); Sheet sheet = wb.createSheet("new sheet"); // Create a row and put some cells in it. Rows are 0 based. @@ -116,7 +117,7 @@ // Or do it on one line. row.createCell((short)1).setCellValue(1.2); row.createCell((short)2).setCellValue( - cell.createRichTextString("This is a string")); + createHelper.createRichTextString("This is a string")); row.createCell((short)3).setCellValue(true); // Write the output to a file @@ -128,22 +129,25 @@
Creating Date Cells - HSSFWorkbook wb = new HSSFWorkbook(); - HSSFSheet sheet = wb.createSheet("new sheet"); + Workbook wb = new HSSFWorkbook(); + //Workbook wb = new XSSFWorkbook(); + CreationHelper createHelper = wb.getCreationHelper(); + Sheet sheet = wb.createSheet("new sheet"); // Create a row and put some cells in it. Rows are 0 based. - HSSFRow row = sheet.createRow((short)0); + Row row = sheet.createRow((short)0); // Create a cell and put a date value in it. The first cell is not styled // as a date. - HSSFCell cell = row.createCell((short)0); + Cell cell = row.createCell((short)0); cell.setCellValue(new Date()); // we style the second cell as a date (and time). It is important to // create a new cell style from the workbook otherwise you can end up // modifying the built in style and effecting not only this cell but other cells. - HSSFCellStyle cellStyle = wb.createCellStyle(); - cellStyle.setDataFormat(HSSFDataFormat.getBuiltinFormat("m/d/yy h:mm")); + CellStyle cellStyle = wb.createCellStyle(); + cellStyle.setDataFormat( + createHelper.createDataFormat().getFormat("m/d/yy h:mm")); cell = row.createCell((short)1); cell.setCellValue(new Date()); cell.setCellStyle(cellStyle); diff --git a/src/examples/src/org/apache/poi/ss/usermodel/examples/FromQuickGuide.java b/src/examples/src/org/apache/poi/ss/usermodel/examples/FromQuickGuide.java index 1a1913a693..88433e1b5e 100644 --- a/src/examples/src/org/apache/poi/ss/usermodel/examples/FromQuickGuide.java +++ b/src/examples/src/org/apache/poi/ss/usermodel/examples/FromQuickGuide.java @@ -18,9 +18,13 @@ package org.apache.poi.ss.usermodel.examples; import java.io.FileOutputStream; import java.io.IOException; +import java.util.Date; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; +import org.apache.poi.ss.usermodel.CreationHelper; +import org.apache.poi.ss.usermodel.DataFormat; import org.apache.poi.ss.usermodel.RichTextString; import org.apache.poi.ss.usermodel.Row; import org.apache.poi.ss.usermodel.Sheet; @@ -71,6 +75,7 @@ public class FromQuickGuide { for (int i = 0; i < wbs.length; i++) { Workbook wb = wbs[i]; + CreationHelper createHelper = wb.getCreationHelper(); Sheet sheet = wb.createSheet("new sheet"); // Create a row and put some cells in it. Rows are 0 based. @@ -82,7 +87,7 @@ public class FromQuickGuide { // Or do it on one line. row.createCell((short)1).setCellValue(1.2); row.createCell((short)2).setCellValue( - cell.createRichTextString("This is a string")); + createHelper.createRichTextString("This is a string")); row.createCell((short)3).setCellValue(true); // Write the output to a file @@ -91,4 +96,33 @@ public class FromQuickGuide { fileOut.close(); } } + + public void newDateCells() throws IOException { + Workbook wb = new HSSFWorkbook(); + //Workbook wb = new XSSFWorkbook(); + CreationHelper createHelper = wb.getCreationHelper(); + Sheet sheet = wb.createSheet("new sheet"); + + // Create a row and put some cells in it. Rows are 0 based. + Row row = sheet.createRow((short)0); + + // Create a cell and put a date value in it. The first cell is not styled + // as a date. + Cell cell = row.createCell((short)0); + cell.setCellValue(new Date()); + + // we style the second cell as a date (and time). It is important to + // create a new cell style from the workbook otherwise you can end up + // modifying the built in style and effecting not only this cell but other cells. + CellStyle cellStyle = wb.createCellStyle(); + cellStyle.setDataFormat(createHelper.createDataFormat().getFormat("m/d/yy h:mm")); + cell = row.createCell((short)1); + cell.setCellValue(new Date()); + cell.setCellStyle(cellStyle); + + // Write the output to a file + FileOutputStream fileOut = new FileOutputStream("workbook.xls"); + wb.write(fileOut); + fileOut.close(); + } } diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java b/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java index ba812e20e5..f906e91a49 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFCell.java @@ -1141,11 +1141,4 @@ public class HSSFCell implements Cell int eofLoc = sheet.findFirstRecordLocBySid( EOFRecord.sid ); sheet.getRecords().add( eofLoc, link.record ); } - - /** - * Creates a new HSSFRichTextString for you. - */ - public RichTextString createRichTextString(String text) { - return new HSSFRichTextString(text); - } } diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFCreationHelper.java b/src/java/org/apache/poi/hssf/usermodel/HSSFCreationHelper.java new file mode 100644 index 0000000000..aadba9a4ad --- /dev/null +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFCreationHelper.java @@ -0,0 +1,44 @@ +/* ==================================================================== + 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.hssf.usermodel; + +import org.apache.poi.ss.usermodel.CreationHelper; +import org.apache.poi.ss.usermodel.DataFormat; +import org.apache.poi.ss.usermodel.RichTextString; + +public class HSSFCreationHelper implements CreationHelper { + private HSSFWorkbook workbook; + private HSSFDataFormat dataFormat; + + HSSFCreationHelper(HSSFWorkbook wb) { + workbook = wb; + + // Create the things we only ever need one of + dataFormat = new HSSFDataFormat(workbook.getWorkbook()); + } + + /** + * Creates a new HSSFRichTextString for you. + */ + public RichTextString createRichTextString(String text) { + return new HSSFRichTextString(text); + } + + public DataFormat createDataFormat() { + return dataFormat; + } +} diff --git a/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java b/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java index 686bd433d7..837a5ff744 100644 --- a/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java +++ b/src/java/org/apache/poi/hssf/usermodel/HSSFWorkbook.java @@ -63,6 +63,7 @@ import org.apache.poi.hssf.record.formula.MemFuncPtg; import org.apache.poi.hssf.record.formula.UnionPtg; import org.apache.poi.hssf.util.CellReference; import org.apache.poi.poifs.filesystem.POIFSFileSystem; +import org.apache.poi.ss.usermodel.CreationHelper; import org.apache.poi.util.POILogFactory; import org.apache.poi.util.POILogger; @@ -1460,6 +1461,10 @@ public class HSSFWorkbook extends POIDocument implements org.apache.poi.ss.userm } } } + + public CreationHelper getCreationHelper() { + return new HSSFCreationHelper(this); + } private byte[] newUID() { diff --git a/src/testcases/org/apache/poi/hssf/data/Formatting.xls b/src/testcases/org/apache/poi/hssf/data/Formatting.xls new file mode 100755 index 0000000000000000000000000000000000000000..b8354173e253c52c81b825dd0c19a9bad45873e3 GIT binary patch literal 18432 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 literal 0 HcmV?d00001 diff --git a/src/testcases/org/apache/poi/hssf/data/Formatting.xlsx b/src/testcases/org/apache/poi/hssf/data/Formatting.xlsx new file mode 100755 index 0000000000000000000000000000000000000000..b1f2e26a03858d2f59828477f2714496fc121e69 GIT binary patch literal 8847 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