diff -urBb old/HSSFOptimiser.java new/HSSFOptimiser.java --- old/HSSFOptimiser.java 2014-12-16 10:55:23.000000000 +0900 +++ new/HSSFOptimiser.java 2015-01-31 17:58:31.253810364 +0900 @@ -18,10 +18,13 @@ import java.util.HashSet; +import org.apache.poi.hssf.model.InternalWorkbook; import org.apache.poi.hssf.record.ExtendedFormatRecord; import org.apache.poi.hssf.record.FontRecord; +import org.apache.poi.hssf.record.StyleRecord; import org.apache.poi.hssf.record.common.UnicodeString; import org.apache.poi.ss.usermodel.Cell; +import org.apache.poi.ss.usermodel.CellStyle; import org.apache.poi.ss.usermodel.Row; /** @@ -173,20 +176,49 @@ public static void optimiseCellStyles(HSSFWorkbook workbook) { // Where each style has ended up, and if we need to // delete the record for it. Start off with no change - short[] newPos = new short[workbook.getWorkbook().getNumExFormats()]; + final short off = 1; + InternalWorkbook iwb = workbook.getWorkbook(); + short[] newPos = new short[iwb.getNumExFormats()]; boolean[] isUsed = new boolean[newPos.length]; boolean[] zapRecords = new boolean[newPos.length]; + short[] oldParent = new short[newPos.length]; + int colmin; + int colmax; + for(int i=0; i colmax) { + colmax = ci; + } + + } + else { + colmin = ci; + colmax = ci; } + } + + } + + for(ci = colmin; ci <= colmax; ci++) + { + cs = s.getColumnStyle(ci); + if(cs!=null) + { + oldXf = cs.getIndex(); + isUsed[newPos[oldXf]] = true; + isUsed[oldParent[oldXf]] = true; + } + + } + } // Mark any that aren't used as needing zapping - for (int i=21; i