316 lines
9.8 KiB
Java
316 lines
9.8 KiB
Java
/* ====================================================================
|
|
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.BorderStyle;
|
|
|
|
import junit.framework.TestCase;
|
|
|
|
public final class TestHSSFOptimiser extends TestCase {
|
|
public void testDoesNoHarmIfNothingToDo() {
|
|
HSSFWorkbook wb = new HSSFWorkbook();
|
|
|
|
// New files start with 4 built in fonts, and 21 built in styles
|
|
assertEquals(4, wb.getNumberOfFonts());
|
|
assertEquals(21, wb.getNumCellStyles());
|
|
|
|
// Create a test font and style, and use them
|
|
HSSFFont f = wb.createFont();
|
|
f.setFontName("Testing");
|
|
HSSFCellStyle s = wb.createCellStyle();
|
|
s.setFont(f);
|
|
|
|
HSSFSheet sheet = wb.createSheet();
|
|
HSSFRow row = sheet.createRow(0);
|
|
row.createCell(0).setCellStyle(s);
|
|
|
|
// Should have one more than the default of each
|
|
assertEquals(5, wb.getNumberOfFonts());
|
|
assertEquals(22, wb.getNumCellStyles());
|
|
|
|
// Optimise fonts
|
|
HSSFOptimiser.optimiseFonts(wb);
|
|
|
|
assertEquals(5, wb.getNumberOfFonts());
|
|
assertEquals(22, wb.getNumCellStyles());
|
|
|
|
assertEquals(f, s.getFont(wb));
|
|
|
|
// Optimise styles
|
|
HSSFOptimiser.optimiseCellStyles(wb);
|
|
|
|
assertEquals(5, wb.getNumberOfFonts());
|
|
assertEquals(22, wb.getNumCellStyles());
|
|
|
|
assertEquals(f, s.getFont(wb));
|
|
}
|
|
|
|
public void testOptimiseFonts() {
|
|
HSSFWorkbook wb = new HSSFWorkbook();
|
|
|
|
// Add 6 fonts, some duplicates
|
|
HSSFFont f1 = wb.createFont();
|
|
f1.setFontHeight((short) 11);
|
|
f1.setFontName("Testing");
|
|
|
|
HSSFFont f2 = wb.createFont();
|
|
f2.setFontHeight((short) 22);
|
|
f2.setFontName("Also Testing");
|
|
|
|
HSSFFont f3 = wb.createFont();
|
|
f3.setFontHeight((short) 33);
|
|
f3.setFontName("Unique");
|
|
|
|
HSSFFont f4 = wb.createFont();
|
|
f4.setFontHeight((short) 11);
|
|
f4.setFontName("Testing");
|
|
|
|
HSSFFont f5 = wb.createFont();
|
|
f5.setFontHeight((short) 22);
|
|
f5.setFontName("Also Testing");
|
|
|
|
HSSFFont f6 = wb.createFont();
|
|
f6.setFontHeight((short) 66);
|
|
f6.setFontName("Also Unique");
|
|
|
|
// Use all three of the four in cell styles
|
|
assertEquals(21, wb.getNumCellStyles());
|
|
|
|
HSSFCellStyle cs1 = wb.createCellStyle();
|
|
cs1.setFont(f1);
|
|
assertEquals(5, cs1.getFontIndex());
|
|
|
|
HSSFCellStyle cs2 = wb.createCellStyle();
|
|
cs2.setFont(f4);
|
|
assertEquals(8, cs2.getFontIndex());
|
|
|
|
HSSFCellStyle cs3 = wb.createCellStyle();
|
|
cs3.setFont(f5);
|
|
assertEquals(9, cs3.getFontIndex());
|
|
|
|
HSSFCellStyle cs4 = wb.createCellStyle();
|
|
cs4.setFont(f6);
|
|
assertEquals(10, cs4.getFontIndex());
|
|
|
|
assertEquals(25, wb.getNumCellStyles());
|
|
|
|
// And three in rich text
|
|
HSSFSheet s = wb.createSheet();
|
|
HSSFRow r = s.createRow(0);
|
|
|
|
HSSFRichTextString rtr1 = new HSSFRichTextString("Test");
|
|
rtr1.applyFont(0, 2, f1);
|
|
rtr1.applyFont(3, 4, f2);
|
|
r.createCell(0).setCellValue(rtr1);
|
|
|
|
HSSFRichTextString rtr2 = new HSSFRichTextString("AlsoTest");
|
|
rtr2.applyFont(0, 2, f3);
|
|
rtr2.applyFont(3, 5, f5);
|
|
rtr2.applyFont(6, 8, f6);
|
|
r.createCell(1).setCellValue(rtr2);
|
|
|
|
// Check what we have now
|
|
assertEquals(10, wb.getNumberOfFonts());
|
|
assertEquals(25, wb.getNumCellStyles());
|
|
|
|
// Optimise
|
|
HSSFOptimiser.optimiseFonts(wb);
|
|
|
|
// Check font count
|
|
assertEquals(8, wb.getNumberOfFonts());
|
|
assertEquals(25, wb.getNumCellStyles());
|
|
|
|
// Check font use in cell styles
|
|
assertEquals(5, cs1.getFontIndex());
|
|
assertEquals(5, cs2.getFontIndex()); // duplicate of 1
|
|
assertEquals(6, cs3.getFontIndex()); // duplicate of 2
|
|
assertEquals(8, cs4.getFontIndex()); // two have gone
|
|
|
|
// And in rich text
|
|
|
|
// RTR 1 had f1 and f2, unchanged
|
|
assertEquals(5, r.getCell(0).getRichStringCellValue().getFontAtIndex(0));
|
|
assertEquals(5, r.getCell(0).getRichStringCellValue().getFontAtIndex(1));
|
|
assertEquals(6, r.getCell(0).getRichStringCellValue().getFontAtIndex(3));
|
|
assertEquals(6, r.getCell(0).getRichStringCellValue().getFontAtIndex(4));
|
|
|
|
// RTR 2 had f3 (unchanged), f5 (=f2) and f6 (moved down)
|
|
assertEquals(7, r.getCell(1).getRichStringCellValue().getFontAtIndex(0));
|
|
assertEquals(7, r.getCell(1).getRichStringCellValue().getFontAtIndex(1));
|
|
assertEquals(6, r.getCell(1).getRichStringCellValue().getFontAtIndex(3));
|
|
assertEquals(6, r.getCell(1).getRichStringCellValue().getFontAtIndex(4));
|
|
assertEquals(8, r.getCell(1).getRichStringCellValue().getFontAtIndex(6));
|
|
assertEquals(8, r.getCell(1).getRichStringCellValue().getFontAtIndex(7));
|
|
}
|
|
|
|
public void testOptimiseStyles() {
|
|
HSSFWorkbook wb = new HSSFWorkbook();
|
|
|
|
// Two fonts
|
|
assertEquals(4, wb.getNumberOfFonts());
|
|
|
|
HSSFFont f1 = wb.createFont();
|
|
f1.setFontHeight((short) 11);
|
|
f1.setFontName("Testing");
|
|
|
|
HSSFFont f2 = wb.createFont();
|
|
f2.setFontHeight((short) 22);
|
|
f2.setFontName("Also Testing");
|
|
|
|
assertEquals(6, wb.getNumberOfFonts());
|
|
|
|
// Several styles
|
|
assertEquals(21, wb.getNumCellStyles());
|
|
|
|
HSSFCellStyle cs1 = wb.createCellStyle();
|
|
cs1.setFont(f1);
|
|
|
|
HSSFCellStyle cs2 = wb.createCellStyle();
|
|
cs2.setFont(f2);
|
|
|
|
HSSFCellStyle cs3 = wb.createCellStyle();
|
|
cs3.setFont(f1);
|
|
|
|
HSSFCellStyle cs4 = wb.createCellStyle();
|
|
cs4.setFont(f1);
|
|
cs4.setAlignment((short) 22);
|
|
|
|
HSSFCellStyle cs5 = wb.createCellStyle();
|
|
cs5.setFont(f2);
|
|
cs5.setAlignment((short) 111);
|
|
|
|
HSSFCellStyle cs6 = wb.createCellStyle();
|
|
cs6.setFont(f2);
|
|
|
|
assertEquals(27, wb.getNumCellStyles());
|
|
|
|
// Use them
|
|
HSSFSheet s = wb.createSheet();
|
|
HSSFRow r = s.createRow(0);
|
|
|
|
r.createCell(0).setCellStyle(cs1);
|
|
r.createCell(1).setCellStyle(cs2);
|
|
r.createCell(2).setCellStyle(cs3);
|
|
r.createCell(3).setCellStyle(cs4);
|
|
r.createCell(4).setCellStyle(cs5);
|
|
r.createCell(5).setCellStyle(cs6);
|
|
r.createCell(6).setCellStyle(cs1);
|
|
r.createCell(7).setCellStyle(cs2);
|
|
|
|
assertEquals(21, r.getCell(0).getCellValueRecord().getXFIndex());
|
|
assertEquals(26, r.getCell(5).getCellValueRecord().getXFIndex());
|
|
assertEquals(21, r.getCell(6).getCellValueRecord().getXFIndex());
|
|
|
|
// Optimise
|
|
HSSFOptimiser.optimiseCellStyles(wb);
|
|
|
|
// Check
|
|
assertEquals(6, wb.getNumberOfFonts());
|
|
assertEquals(25, wb.getNumCellStyles());
|
|
|
|
// cs1 -> 21
|
|
assertEquals(21, r.getCell(0).getCellValueRecord().getXFIndex());
|
|
// cs2 -> 22
|
|
assertEquals(22, r.getCell(1).getCellValueRecord().getXFIndex());
|
|
assertEquals(22, r.getCell(1).getCellStyle().getFont(wb).getFontHeight());
|
|
// cs3 = cs1 -> 21
|
|
assertEquals(21, r.getCell(2).getCellValueRecord().getXFIndex());
|
|
// cs4 --> 24 -> 23
|
|
assertEquals(23, r.getCell(3).getCellValueRecord().getXFIndex());
|
|
// cs5 --> 25 -> 24
|
|
assertEquals(24, r.getCell(4).getCellValueRecord().getXFIndex());
|
|
// cs6 = cs2 -> 22
|
|
assertEquals(22, r.getCell(5).getCellValueRecord().getXFIndex());
|
|
// cs1 -> 21
|
|
assertEquals(21, r.getCell(6).getCellValueRecord().getXFIndex());
|
|
// cs2 -> 22
|
|
assertEquals(22, r.getCell(7).getCellValueRecord().getXFIndex());
|
|
|
|
|
|
// Add a new duplicate, and two that aren't used
|
|
HSSFCellStyle csD = wb.createCellStyle();
|
|
csD.setFont(f1);
|
|
r.createCell(8).setCellStyle(csD);
|
|
|
|
HSSFFont f3 = wb.createFont();
|
|
f3.setFontHeight((short) 23);
|
|
f3.setFontName("Testing 3");
|
|
HSSFFont f4 = wb.createFont();
|
|
f4.setFontHeight((short) 24);
|
|
f4.setFontName("Testing 4");
|
|
|
|
HSSFCellStyle csU1 = wb.createCellStyle();
|
|
csU1.setFont(f3);
|
|
HSSFCellStyle csU2 = wb.createCellStyle();
|
|
csU2.setFont(f4);
|
|
|
|
// Check before the optimise
|
|
assertEquals(8, wb.getNumberOfFonts());
|
|
assertEquals(28, wb.getNumCellStyles());
|
|
|
|
// Optimise, should remove the two un-used ones and the one duplicate
|
|
HSSFOptimiser.optimiseCellStyles(wb);
|
|
|
|
// Check
|
|
assertEquals(8, wb.getNumberOfFonts());
|
|
assertEquals(25, wb.getNumCellStyles());
|
|
|
|
// csD -> cs1 -> 21
|
|
assertEquals(21, r.getCell(8).getCellValueRecord().getXFIndex());
|
|
}
|
|
|
|
public void testOptimiseStylesCheckActualStyles() {
|
|
HSSFWorkbook wb = new HSSFWorkbook();
|
|
|
|
// Several styles
|
|
assertEquals(21, wb.getNumCellStyles());
|
|
|
|
HSSFCellStyle cs1 = wb.createCellStyle();
|
|
cs1.setBorderBottom(BorderStyle.THICK);
|
|
|
|
HSSFCellStyle cs2 = wb.createCellStyle();
|
|
cs2.setBorderBottom(BorderStyle.DASH_DOT);
|
|
|
|
HSSFCellStyle cs3 = wb.createCellStyle(); // = cs1
|
|
cs3.setBorderBottom(BorderStyle.THICK);
|
|
|
|
assertEquals(24, wb.getNumCellStyles());
|
|
|
|
// Use them
|
|
HSSFSheet s = wb.createSheet();
|
|
HSSFRow r = s.createRow(0);
|
|
|
|
r.createCell(0).setCellStyle(cs1);
|
|
r.createCell(1).setCellStyle(cs2);
|
|
r.createCell(2).setCellStyle(cs3);
|
|
|
|
assertEquals(21, r.getCell(0).getCellValueRecord().getXFIndex());
|
|
assertEquals(22, r.getCell(1).getCellValueRecord().getXFIndex());
|
|
assertEquals(23, r.getCell(2).getCellValueRecord().getXFIndex());
|
|
|
|
// Optimise
|
|
HSSFOptimiser.optimiseCellStyles(wb);
|
|
|
|
// Check
|
|
assertEquals(23, wb.getNumCellStyles());
|
|
|
|
assertEquals(BorderStyle.THICK, r.getCell(0).getCellStyle().getBorderBottomEnum());
|
|
assertEquals(BorderStyle.DASH_DOT, r.getCell(1).getCellStyle().getBorderBottomEnum());
|
|
assertEquals(BorderStyle.THICK, r.getCell(2).getCellStyle().getBorderBottomEnum());
|
|
}
|
|
}
|