Allow the cloning of one HSSFCellStyle onto another, including cloning styles from one HSSFWorkbook onto another
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@676205 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
eb35f25f3b
commit
511f83925b
@ -37,6 +37,7 @@
|
|||||||
|
|
||||||
<!-- Don't forget to update status.xml too! -->
|
<!-- Don't forget to update status.xml too! -->
|
||||||
<release version="3.1.1-alpha1" date="2008-??-??">
|
<release version="3.1.1-alpha1" date="2008-??-??">
|
||||||
|
<action dev="POI-DEVELOPERS" type="add">Allow the cloning of one HSSFCellStyle onto another, including cloning styles from one HSSFWorkbook onto another</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">45289 - finished support for special comparison operators in COUNTIF</action>
|
<action dev="POI-DEVELOPERS" type="fix">45289 - finished support for special comparison operators in COUNTIF</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">45126 - Avoid generating multiple NamedRanges with the same name, which Excel dislikes</action>
|
<action dev="POI-DEVELOPERS" type="fix">45126 - Avoid generating multiple NamedRanges with the same name, which Excel dislikes</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">Fix cell.getRichStringCellValue() for formula cells with string results</action>
|
<action dev="POI-DEVELOPERS" type="fix">Fix cell.getRichStringCellValue() for formula cells with string results</action>
|
||||||
|
@ -34,6 +34,7 @@
|
|||||||
<!-- Don't forget to update changes.xml too! -->
|
<!-- Don't forget to update changes.xml too! -->
|
||||||
<changes>
|
<changes>
|
||||||
<release version="3.1.1-alpha1" date="2008-??-??">
|
<release version="3.1.1-alpha1" date="2008-??-??">
|
||||||
|
<action dev="POI-DEVELOPERS" type="add">Allow the cloning of one HSSFCellStyle onto another, including cloning styles from one HSSFWorkbook onto another</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">45289 - finished support for special comparison operators in COUNTIF</action>
|
<action dev="POI-DEVELOPERS" type="fix">45289 - finished support for special comparison operators in COUNTIF</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">45126 - Avoid generating multiple NamedRanges with the same name, which Excel dislikes</action>
|
<action dev="POI-DEVELOPERS" type="fix">45126 - Avoid generating multiple NamedRanges with the same name, which Excel dislikes</action>
|
||||||
<action dev="POI-DEVELOPERS" type="fix">Fix cell.getRichStringCellValue() for formula cells with string results</action>
|
<action dev="POI-DEVELOPERS" type="fix">Fix cell.getRichStringCellValue() for formula cells with string results</action>
|
||||||
|
@ -409,6 +409,24 @@ public class Workbook implements Model
|
|||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Retrieves the index of the given font
|
||||||
|
*/
|
||||||
|
public int getFontIndex(FontRecord font) {
|
||||||
|
for(int i=0; i<=numfonts; i++) {
|
||||||
|
FontRecord thisFont =
|
||||||
|
( FontRecord ) records.get((records.getFontpos() - (numfonts - 1)) + i);
|
||||||
|
if(thisFont == font) {
|
||||||
|
// There is no 4!
|
||||||
|
if(i > 3) {
|
||||||
|
return (i+1);
|
||||||
|
}
|
||||||
|
return i;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
throw new IllegalArgumentException("Could not find that font!");
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* creates a new font record and adds it to the "font table". This causes the
|
* creates a new font record and adds it to the "font table". This causes the
|
||||||
* boundsheets to move down one, extended formats to move down (so this function moves
|
* boundsheets to move down one, extended formats to move down (so this function moves
|
||||||
|
@ -915,6 +915,10 @@ public class HSSFCell
|
|||||||
|
|
||||||
public void setCellStyle(HSSFCellStyle style)
|
public void setCellStyle(HSSFCellStyle style)
|
||||||
{
|
{
|
||||||
|
// Verify it really does belong to our workbook
|
||||||
|
style.verifyBelongsToWorkbook(book);
|
||||||
|
|
||||||
|
// Change our cell record to use this style
|
||||||
record.setXFIndex(style.getIndex());
|
record.setXFIndex(style.getIndex());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,6 +20,7 @@ package org.apache.poi.hssf.usermodel;
|
|||||||
|
|
||||||
import org.apache.poi.hssf.model.Workbook;
|
import org.apache.poi.hssf.model.Workbook;
|
||||||
import org.apache.poi.hssf.record.ExtendedFormatRecord;
|
import org.apache.poi.hssf.record.ExtendedFormatRecord;
|
||||||
|
import org.apache.poi.hssf.record.FontRecord;
|
||||||
import org.apache.poi.hssf.util.HSSFColor;
|
import org.apache.poi.hssf.util.HSSFColor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -928,6 +929,63 @@ public class HSSFCellStyle
|
|||||||
return format.getFillForeground();
|
return format.getFillForeground();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Verifies that this style belongs to the supplied Workbook.
|
||||||
|
* Will throw an exception if it belongs to a different one.
|
||||||
|
* This is normally called when trying to assign a style to a
|
||||||
|
* cell, to ensure the cell and the style are from the same
|
||||||
|
* workbook (if they're not, it won't work)
|
||||||
|
* @throws IllegalArgumentException if there's a workbook mis-match
|
||||||
|
*/
|
||||||
|
public void verifyBelongsToWorkbook(HSSFWorkbook wb) {
|
||||||
|
if(wb.getWorkbook() != workbook) {
|
||||||
|
throw new IllegalArgumentException("This Style does not belong to the supplied Workbook. Are you trying to assign a style from one workbook to the cell of a differnt workbook?");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clones all the style information from another
|
||||||
|
* HSSFCellStyle, onto this one. This
|
||||||
|
* HSSFCellStyle will then have all the same
|
||||||
|
* properties as the source, but the two may
|
||||||
|
* be edited independently.
|
||||||
|
* Any stylings on this HSSFCellStyle will be lost!
|
||||||
|
*
|
||||||
|
* The source HSSFCellStyle could be from another
|
||||||
|
* HSSFWorkbook if you like. This allows you to
|
||||||
|
* copy styles from one HSSFWorkbook to another.
|
||||||
|
*/
|
||||||
|
public void cloneStyleFrom(HSSFCellStyle source) {
|
||||||
|
// First we need to clone the extended format
|
||||||
|
// record
|
||||||
|
format.cloneStyleFrom(source.format);
|
||||||
|
|
||||||
|
// Handle matching things if we cross workbooks
|
||||||
|
if(workbook != source.workbook) {
|
||||||
|
// Then we need to clone the format string,
|
||||||
|
// and update the format record for this
|
||||||
|
short fmt = workbook.createFormat(
|
||||||
|
source.getDataFormatString()
|
||||||
|
);
|
||||||
|
setDataFormat(fmt);
|
||||||
|
|
||||||
|
// Finally we need to clone the font,
|
||||||
|
// and update the format record for this
|
||||||
|
FontRecord fr = workbook.createNewFont();
|
||||||
|
fr.cloneStyleFrom(
|
||||||
|
source.workbook.getFontRecordAt(
|
||||||
|
source.getFontIndex()
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
HSSFFont font = new HSSFFont(
|
||||||
|
(short)workbook.getFontIndex(fr), fr
|
||||||
|
);
|
||||||
|
setFont(font);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
public int hashCode() {
|
public int hashCode() {
|
||||||
final int prime = 31;
|
final int prime = 31;
|
||||||
int result = 1;
|
int result = 1;
|
||||||
|
@ -38,6 +38,7 @@ public final class AllModelTests {
|
|||||||
result.addTestSuite(TestRVA.class);
|
result.addTestSuite(TestRVA.class);
|
||||||
result.addTestSuite(TestSheet.class);
|
result.addTestSuite(TestSheet.class);
|
||||||
result.addTestSuite(TestSheetAdditional.class);
|
result.addTestSuite(TestSheetAdditional.class);
|
||||||
|
result.addTestSuite(TestWorkbook.class);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
61
src/testcases/org/apache/poi/hssf/model/TestWorkbook.java
Normal file
61
src/testcases/org/apache/poi/hssf/model/TestWorkbook.java
Normal file
@ -0,0 +1,61 @@
|
|||||||
|
/* ====================================================================
|
||||||
|
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.model;
|
||||||
|
|
||||||
|
import org.apache.poi.hssf.record.FontRecord;
|
||||||
|
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
|
||||||
|
|
||||||
|
import junit.framework.TestCase;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Unit test for the Workbook class.
|
||||||
|
*
|
||||||
|
* @author Glen Stampoultzis (glens at apache.org)
|
||||||
|
*/
|
||||||
|
public final class TestWorkbook extends TestCase {
|
||||||
|
public void testFontStuff() throws Exception {
|
||||||
|
Workbook wb = (new HW()).getWorkbook();
|
||||||
|
|
||||||
|
assertEquals(4, wb.getNumberOfFontRecords());
|
||||||
|
|
||||||
|
FontRecord f1 = wb.getFontRecordAt(0);
|
||||||
|
FontRecord f4 = wb.getFontRecordAt(3);
|
||||||
|
|
||||||
|
assertEquals(0, wb.getFontIndex(f1));
|
||||||
|
assertEquals(3, wb.getFontIndex(f4));
|
||||||
|
|
||||||
|
assertEquals(f1, wb.getFontRecordAt(0));
|
||||||
|
assertEquals(f4, wb.getFontRecordAt(3));
|
||||||
|
|
||||||
|
// There is no 4! new ones go in at 5
|
||||||
|
|
||||||
|
FontRecord n = wb.createNewFont();
|
||||||
|
assertEquals(5, wb.getNumberOfFontRecords());
|
||||||
|
assertEquals(5, wb.getFontIndex(n));
|
||||||
|
assertEquals(n, wb.getFontRecordAt(5));
|
||||||
|
}
|
||||||
|
|
||||||
|
private class HW extends HSSFWorkbook {
|
||||||
|
private HW() {
|
||||||
|
super();
|
||||||
|
}
|
||||||
|
protected Workbook getWorkbook() {
|
||||||
|
return super.getWorkbook();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -230,6 +230,80 @@ public class TestCellStyle
|
|||||||
// assert((s.getLastRowNum() == 99));
|
// assert((s.getLastRowNum() == 99));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cloning one HSSFCellStyle onto Another, same
|
||||||
|
* HSSFWorkbook
|
||||||
|
*/
|
||||||
|
public void testCloneStyleSameWB() throws Exception {
|
||||||
|
HSSFWorkbook wb = new HSSFWorkbook();
|
||||||
|
HSSFFont fnt = wb.createFont();
|
||||||
|
fnt.setFontName("TestingFont");
|
||||||
|
assertEquals(5, wb.getNumberOfFonts());
|
||||||
|
|
||||||
|
HSSFCellStyle orig = wb.createCellStyle();
|
||||||
|
orig.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
|
||||||
|
orig.setFont(fnt);
|
||||||
|
orig.setDataFormat((short)18);
|
||||||
|
|
||||||
|
assertTrue(HSSFCellStyle.ALIGN_RIGHT == orig.getAlignment());
|
||||||
|
assertTrue(fnt == orig.getFont(wb));
|
||||||
|
assertTrue(18 == orig.getDataFormat());
|
||||||
|
|
||||||
|
HSSFCellStyle clone = wb.createCellStyle();
|
||||||
|
assertFalse(HSSFCellStyle.ALIGN_RIGHT == clone.getAlignment());
|
||||||
|
assertFalse(fnt == clone.getFont(wb));
|
||||||
|
assertFalse(18 == clone.getDataFormat());
|
||||||
|
|
||||||
|
clone.cloneStyleFrom(orig);
|
||||||
|
assertTrue(HSSFCellStyle.ALIGN_RIGHT == clone.getAlignment());
|
||||||
|
assertTrue(fnt == clone.getFont(wb));
|
||||||
|
assertTrue(18 == clone.getDataFormat());
|
||||||
|
assertEquals(5, wb.getNumberOfFonts());
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Cloning one HSSFCellStyle onto Another, across
|
||||||
|
* two different HSSFWorkbooks
|
||||||
|
*/
|
||||||
|
public void testCloneStyleDiffWB() throws Exception {
|
||||||
|
HSSFWorkbook wbOrig = new HSSFWorkbook();
|
||||||
|
|
||||||
|
HSSFFont fnt = wbOrig.createFont();
|
||||||
|
fnt.setFontName("TestingFont");
|
||||||
|
assertEquals(5, wbOrig.getNumberOfFonts());
|
||||||
|
|
||||||
|
HSSFDataFormat fmt = wbOrig.createDataFormat();
|
||||||
|
fmt.getFormat("MadeUpOne");
|
||||||
|
fmt.getFormat("MadeUpTwo");
|
||||||
|
|
||||||
|
HSSFCellStyle orig = wbOrig.createCellStyle();
|
||||||
|
orig.setAlignment(HSSFCellStyle.ALIGN_RIGHT);
|
||||||
|
orig.setFont(fnt);
|
||||||
|
orig.setDataFormat(fmt.getFormat("Test##"));
|
||||||
|
|
||||||
|
assertTrue(HSSFCellStyle.ALIGN_RIGHT == orig.getAlignment());
|
||||||
|
assertTrue(fnt == orig.getFont(wbOrig));
|
||||||
|
assertTrue(fmt.getFormat("Test##") == orig.getDataFormat());
|
||||||
|
|
||||||
|
// Now a style on another workbook
|
||||||
|
HSSFWorkbook wbClone = new HSSFWorkbook();
|
||||||
|
assertEquals(4, wbClone.getNumberOfFonts());
|
||||||
|
HSSFDataFormat fmtClone = wbClone.createDataFormat();
|
||||||
|
|
||||||
|
HSSFCellStyle clone = wbClone.createCellStyle();
|
||||||
|
assertEquals(4, wbClone.getNumberOfFonts());
|
||||||
|
|
||||||
|
assertFalse(HSSFCellStyle.ALIGN_RIGHT == clone.getAlignment());
|
||||||
|
assertFalse("TestingFont" == clone.getFont(wbClone).getFontName());
|
||||||
|
|
||||||
|
clone.cloneStyleFrom(orig);
|
||||||
|
assertTrue(HSSFCellStyle.ALIGN_RIGHT == clone.getAlignment());
|
||||||
|
assertTrue("TestingFont" == clone.getFont(wbClone).getFontName());
|
||||||
|
assertTrue(fmtClone.getFormat("Test##") == clone.getDataFormat());
|
||||||
|
assertFalse(fmtClone.getFormat("Test##") == fmt.getFormat("Test##"));
|
||||||
|
assertEquals(5, wbClone.getNumberOfFonts());
|
||||||
|
}
|
||||||
|
|
||||||
public static void main(String [] ignored_args)
|
public static void main(String [] ignored_args)
|
||||||
{
|
{
|
||||||
System.out
|
System.out
|
||||||
|
@ -382,6 +382,43 @@ public final class TestHSSFCell extends TestCase {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Test to ensure we can only assign cell styles that belong
|
||||||
|
* to our workbook, and not those from other workbooks.
|
||||||
|
*/
|
||||||
|
public void testCellStyleWorkbookMatch() throws Exception {
|
||||||
|
HSSFWorkbook wbA = new HSSFWorkbook();
|
||||||
|
HSSFWorkbook wbB = new HSSFWorkbook();
|
||||||
|
|
||||||
|
HSSFCellStyle styA = wbA.createCellStyle();
|
||||||
|
HSSFCellStyle styB = wbB.createCellStyle();
|
||||||
|
|
||||||
|
styA.verifyBelongsToWorkbook(wbA);
|
||||||
|
styB.verifyBelongsToWorkbook(wbB);
|
||||||
|
try {
|
||||||
|
styA.verifyBelongsToWorkbook(wbB);
|
||||||
|
fail();
|
||||||
|
} catch(IllegalArgumentException e) {}
|
||||||
|
try {
|
||||||
|
styB.verifyBelongsToWorkbook(wbA);
|
||||||
|
fail();
|
||||||
|
} catch(IllegalArgumentException e) {}
|
||||||
|
|
||||||
|
HSSFCell cellA = wbA.createSheet().createRow(0).createCell((short)0);
|
||||||
|
HSSFCell cellB = wbB.createSheet().createRow(0).createCell((short)0);
|
||||||
|
|
||||||
|
cellA.setCellStyle(styA);
|
||||||
|
cellB.setCellStyle(styB);
|
||||||
|
try {
|
||||||
|
cellA.setCellStyle(styB);
|
||||||
|
fail();
|
||||||
|
} catch(IllegalArgumentException e) {}
|
||||||
|
try {
|
||||||
|
cellB.setCellStyle(styA);
|
||||||
|
fail();
|
||||||
|
} catch(IllegalArgumentException e) {}
|
||||||
|
}
|
||||||
|
|
||||||
public static void main(String [] args) {
|
public static void main(String [] args) {
|
||||||
junit.textui.TestRunner.run(TestHSSFCell.class);
|
junit.textui.TestRunner.run(TestHSSFCell.class);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user