Somewhat speed up creating data formats with large counts, and add maximum format/style count checking. #57884
git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1677368 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
parent
31adc2f269
commit
602832bda6
@ -22,7 +22,7 @@ import java.io.InputStream;
|
|||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.Arrays;
|
import java.util.Arrays;
|
||||||
import java.util.LinkedHashMap;
|
import java.util.HashMap;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map;
|
import java.util.Map;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
@ -30,6 +30,7 @@ import java.util.Map.Entry;
|
|||||||
import org.apache.poi.POIXMLDocumentPart;
|
import org.apache.poi.POIXMLDocumentPart;
|
||||||
import org.apache.poi.openxml4j.opc.PackagePart;
|
import org.apache.poi.openxml4j.opc.PackagePart;
|
||||||
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
import org.apache.poi.openxml4j.opc.PackageRelationship;
|
||||||
|
import org.apache.poi.ss.SpreadsheetVersion;
|
||||||
import org.apache.poi.ss.usermodel.BuiltinFormats;
|
import org.apache.poi.ss.usermodel.BuiltinFormats;
|
||||||
import org.apache.poi.ss.usermodel.FontFamily;
|
import org.apache.poi.ss.usermodel.FontFamily;
|
||||||
import org.apache.poi.ss.usermodel.FontScheme;
|
import org.apache.poi.ss.usermodel.FontScheme;
|
||||||
@ -59,11 +60,10 @@ import org.openxmlformats.schemas.spreadsheetml.x2006.main.StyleSheetDocument;
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Table of styles shared across all sheets in a workbook.
|
* Table of styles shared across all sheets in a workbook.
|
||||||
*
|
|
||||||
* @author ugo
|
|
||||||
*/
|
*/
|
||||||
public class StylesTable extends POIXMLDocumentPart {
|
public class StylesTable extends POIXMLDocumentPart {
|
||||||
private final Map<Integer, String> numberFormats = new LinkedHashMap<Integer,String>();
|
private final Map<Integer, String> numberFormats = new HashMap<Integer,String>();
|
||||||
|
private final boolean[] usedNumberFormats = new boolean[SpreadsheetVersion.EXCEL2007.getMaxCellStyles()];
|
||||||
private final List<XSSFFont> fonts = new ArrayList<XSSFFont>();
|
private final List<XSSFFont> fonts = new ArrayList<XSSFFont>();
|
||||||
private final List<XSSFCellFill> fills = new ArrayList<XSSFCellFill>();
|
private final List<XSSFCellFill> fills = new ArrayList<XSSFCellFill>();
|
||||||
private final List<XSSFCellBorder> borders = new ArrayList<XSSFCellBorder>();
|
private final List<XSSFCellBorder> borders = new ArrayList<XSSFCellBorder>();
|
||||||
@ -76,6 +76,7 @@ public class StylesTable extends POIXMLDocumentPart {
|
|||||||
* The first style id available for use as a custom style
|
* The first style id available for use as a custom style
|
||||||
*/
|
*/
|
||||||
public static final int FIRST_CUSTOM_STYLE_ID = BuiltinFormats.FIRST_USER_DEFINED_FORMAT_INDEX + 1;
|
public static final int FIRST_CUSTOM_STYLE_ID = BuiltinFormats.FIRST_USER_DEFINED_FORMAT_INDEX + 1;
|
||||||
|
private static final int MAXIMUM_STYLE_ID = SpreadsheetVersion.EXCEL2007.getMaxCellStyles();
|
||||||
|
|
||||||
private StyleSheetDocument doc;
|
private StyleSheetDocument doc;
|
||||||
private ThemesTable theme;
|
private ThemesTable theme;
|
||||||
@ -130,7 +131,9 @@ public class StylesTable extends POIXMLDocumentPart {
|
|||||||
CTNumFmts ctfmts = styleSheet.getNumFmts();
|
CTNumFmts ctfmts = styleSheet.getNumFmts();
|
||||||
if( ctfmts != null){
|
if( ctfmts != null){
|
||||||
for (CTNumFmt nfmt : ctfmts.getNumFmtArray()) {
|
for (CTNumFmt nfmt : ctfmts.getNumFmtArray()) {
|
||||||
numberFormats.put((int)nfmt.getNumFmtId(), nfmt.getFormatCode());
|
int formatId = (int)nfmt.getNumFmtId();
|
||||||
|
numberFormats.put(formatId, nfmt.getFormatCode());
|
||||||
|
usedNumberFormats[formatId] = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -183,21 +186,24 @@ public class StylesTable extends POIXMLDocumentPart {
|
|||||||
public int putNumberFormat(String fmt) {
|
public int putNumberFormat(String fmt) {
|
||||||
if (numberFormats.containsValue(fmt)) {
|
if (numberFormats.containsValue(fmt)) {
|
||||||
// Find the key, and return that
|
// Find the key, and return that
|
||||||
for(Integer key : numberFormats.keySet() ) {
|
for (Entry<Integer,String> numFmt : numberFormats.entrySet()) {
|
||||||
if(numberFormats.get(key).equals(fmt)) {
|
if(numFmt.getValue().equals(fmt)) {
|
||||||
return key;
|
return numFmt.getKey();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
throw new IllegalStateException("Found the format, but couldn't figure out where - should never happen!");
|
throw new IllegalStateException("Found the format, but couldn't figure out where - should never happen!");
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find a spare key, and add that
|
// Find a spare key, and add that
|
||||||
int newKey = FIRST_CUSTOM_STYLE_ID;
|
for (int i=FIRST_CUSTOM_STYLE_ID; i<usedNumberFormats.length; i++) {
|
||||||
while(numberFormats.containsKey(newKey)) {
|
if (!usedNumberFormats[i]) {
|
||||||
newKey++;
|
usedNumberFormats[i] = true;
|
||||||
|
numberFormats.put(i, fmt);
|
||||||
|
return i;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
numberFormats.put(newKey, fmt);
|
throw new IllegalStateException("The maximum number of Data Formats was exceeded. " +
|
||||||
return newKey;
|
"You can define up to " + usedNumberFormats.length + " formats in a .xlsx Workbook");
|
||||||
}
|
}
|
||||||
|
|
||||||
public XSSFFont getFontAt(int idx) {
|
public XSSFFont getFontAt(int idx) {
|
||||||
@ -532,13 +538,17 @@ public class StylesTable extends POIXMLDocumentPart {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public XSSFCellStyle createCellStyle() {
|
public XSSFCellStyle createCellStyle() {
|
||||||
|
int xfSize = styleXfs.size();
|
||||||
|
if (xfSize > MAXIMUM_STYLE_ID)
|
||||||
|
throw new IllegalStateException("The maximum number of Cell Styles was exceeded. " +
|
||||||
|
"You can define up to " + MAXIMUM_STYLE_ID + " style in a .xlsx Workbook");
|
||||||
|
|
||||||
CTXf xf = CTXf.Factory.newInstance();
|
CTXf xf = CTXf.Factory.newInstance();
|
||||||
xf.setNumFmtId(0);
|
xf.setNumFmtId(0);
|
||||||
xf.setFontId(0);
|
xf.setFontId(0);
|
||||||
xf.setFillId(0);
|
xf.setFillId(0);
|
||||||
xf.setBorderId(0);
|
xf.setBorderId(0);
|
||||||
xf.setXfId(0);
|
xf.setXfId(0);
|
||||||
int xfSize = styleXfs.size();
|
|
||||||
int indexXf = putCellXf(xf);
|
int indexXf = putCellXf(xf);
|
||||||
return new XSSFCellStyle(indexXf - 1, xfSize - 1, this, theme);
|
return new XSSFCellStyle(indexXf - 1, xfSize - 1, this, theme);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user