📄 columninforecordsaggregate.java
字号:
public void collapseColumn( short columnNumber ) { int idx = findColumnIdx( columnNumber, 0 ); if (idx == -1) return; // Find the start of the group. ColumnInfoRecord columnInfo = (ColumnInfoRecord) records.get( findStartOfColumnOutlineGroup( idx ) ); // Hide all the columns until the end of the group columnInfo = writeHidden( columnInfo, idx, true ); // Write collapse field setColumn( (short) ( columnInfo.getLastColumn() + 1 ), null, null, null, Boolean.TRUE); } public void expandColumn( short columnNumber ) { int idx = findColumnIdx( columnNumber, 0 ); if (idx == -1) return; // If it is already exapanded do nothing. if (!isColumnGroupCollapsed(idx)) return; // Find the start of the group. int startIdx = findStartOfColumnOutlineGroup( idx ); ColumnInfoRecord columnInfo = getColInfo( startIdx ); // Find the end of the group. int endIdx = findEndOfColumnOutlineGroup( idx ); ColumnInfoRecord endColumnInfo = getColInfo( endIdx ); // expand: // colapsed bit must be unset // hidden bit gets unset _if_ surrounding groups are expanded you can determine // this by looking at the hidden bit of the enclosing group. You will have // to look at the start and the end of the current group to determine which // is the enclosing group // hidden bit only is altered for this outline level. ie. don't uncollapse contained groups if (!isColumnGroupHiddenByParent( idx )) { for (int i = startIdx; i <= endIdx; i++) { if (columnInfo.getOutlineLevel() == getColInfo(i).getOutlineLevel()) getColInfo(i).setHidden( false ); } } // Write collapse field setColumn( (short) ( columnInfo.getLastColumn() + 1 ), null, null, null, Boolean.FALSE); } /** * creates the ColumnInfo Record and sets it to a default column/width * @see org.apache.poi.hssf.record.ColumnInfoRecord * @return record containing a ColumnInfoRecord */ public static Record createColInfo() { ColumnInfoRecord retval = new ColumnInfoRecord(); retval.setColumnWidth(( short ) 2275); // was: retval.setOptions(( short ) 6); retval.setOptions(( short ) 2); retval.setXFIndex(( short ) 0x0f); return retval; } public void setColumn(short column, Short width, Integer level, Boolean hidden, Boolean collapsed) { ColumnInfoRecord ci = null; int k = 0; for (k = 0; k < records.size(); k++) { ci = ( ColumnInfoRecord ) records.get(k); if ((ci.getFirstColumn() <= column) && (column <= ci.getLastColumn())) { break; } ci = null; } if (ci != null) { boolean widthChanged = width != null && ci.getColumnWidth() != width.shortValue(); boolean levelChanged = level != null && ci.getOutlineLevel() != level.intValue(); boolean hiddenChanged = hidden != null && ci.getHidden() != hidden.booleanValue(); boolean collapsedChanged = collapsed != null && ci.getCollapsed() != collapsed.booleanValue(); boolean columnChanged = widthChanged || levelChanged || hiddenChanged || collapsedChanged; if (!columnChanged) { // do nothing...nothing changed. } else if ((ci.getFirstColumn() == column) && (ci.getLastColumn() == column)) { // if its only for this cell then setColumnInfoFields( ci, width, level, hidden, collapsed ); } else if ((ci.getFirstColumn() == column) || (ci.getLastColumn() == column)) { // okay so the width is different but the first or last column == the column we'return setting // we'll just divide the info and create a new one if (ci.getFirstColumn() == column) { ci.setFirstColumn(( short ) (column + 1)); } else { ci.setLastColumn(( short ) (column - 1)); } ColumnInfoRecord nci = ( ColumnInfoRecord ) createColInfo(); nci.setFirstColumn(column); nci.setLastColumn(column); nci.setOptions(ci.getOptions()); nci.setXFIndex(ci.getXFIndex()); setColumnInfoFields( nci, width, level, hidden, collapsed ); insertColumn(k, nci); } else { //split to 3 records short lastcolumn = ci.getLastColumn(); ci.setLastColumn(( short ) (column - 1)); ColumnInfoRecord nci = ( ColumnInfoRecord ) createColInfo(); nci.setFirstColumn(column); nci.setLastColumn(column); nci.setOptions(ci.getOptions()); nci.setXFIndex(ci.getXFIndex()); setColumnInfoFields( nci, width, level, hidden, collapsed ); insertColumn(++k, nci); nci = ( ColumnInfoRecord ) createColInfo(); nci.setFirstColumn((short)(column+1)); nci.setLastColumn(lastcolumn); nci.setOptions(ci.getOptions()); nci.setXFIndex(ci.getXFIndex()); nci.setColumnWidth(ci.getColumnWidth()); insertColumn(++k, nci); } } else { // okay so there ISN'T a column info record that cover's this column so lets create one! ColumnInfoRecord nci = ( ColumnInfoRecord ) createColInfo(); nci.setFirstColumn(column); nci.setLastColumn(column); setColumnInfoFields( nci, width, level, hidden, collapsed ); insertColumn(k, nci); } } /** * Sets all non null fields into the <code>ci</code> parameter. */ private void setColumnInfoFields( ColumnInfoRecord ci, Short width, Integer level, Boolean hidden, Boolean collapsed ) { if (width != null) ci.setColumnWidth(width.shortValue()); if (level != null) ci.setOutlineLevel( level.shortValue() ); if (hidden != null) ci.setHidden( hidden.booleanValue() ); if (collapsed != null) ci.setCollapsed( collapsed.booleanValue() ); } public int findColumnIdx(int column, int fromIdx) { if (column < 0) throw new IllegalArgumentException( "column parameter out of range: " + column ); if (fromIdx < 0) throw new IllegalArgumentException( "fromIdx parameter out of range: " + fromIdx ); ColumnInfoRecord ci; for (int k = fromIdx; k < records.size(); k++) { ci = ( ColumnInfoRecord ) records.get(k); if ((ci.getFirstColumn() <= column) && (column <= ci.getLastColumn())) { return k; } ci = null; } return -1; } public void collapseColInfoRecords( int columnIdx ) { if (columnIdx == 0) return; ColumnInfoRecord previousCol = (ColumnInfoRecord) records.get( columnIdx - 1); ColumnInfoRecord currentCol = (ColumnInfoRecord) records.get( columnIdx ); boolean adjacentColumns = previousCol.getLastColumn() == currentCol.getFirstColumn() - 1; if (!adjacentColumns) return; boolean columnsMatch = previousCol.getXFIndex() == currentCol.getXFIndex() && previousCol.getOptions() == currentCol.getOptions() && previousCol.getColumnWidth() == currentCol.getColumnWidth(); if (columnsMatch) { previousCol.setLastColumn( currentCol.getLastColumn() ); records.remove( columnIdx ); } } /** * Creates an outline group for the specified columns. * @param fromColumn group from this column (inclusive) * @param toColumn group to this column (inclusive) * @param indent if true the group will be indented by one level, * if false indenting will be removed by one level. */ public void groupColumnRange(short fromColumn, short toColumn, boolean indent) { // Set the level for each column int fromIdx = 0; for (int i = fromColumn; i <= toColumn; i++) { int level = 1; int columnIdx = findColumnIdx( i, Math.max(0,fromIdx) ); if (columnIdx != -1) { level = ((ColumnInfoRecord)records.get( columnIdx )).getOutlineLevel(); if (indent) level++; else level--; level = Math.max(0, level); level = Math.min(7, level); fromIdx = columnIdx - 1; // subtract 1 just in case this column is collapsed later. } setColumn((short)i, null, new Integer(level), null, null); columnIdx = findColumnIdx( i, Math.max(0, fromIdx ) ); collapseColInfoRecords( columnIdx ); } }}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -