ASF Bugzilla – Attachment 33269 Details for
Bug 57450
[PATCH] A way to autosize columns on SXSSF
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Help
|
New Account
|
Log In
Remember
[x]
|
Forgot Password
Login:
[x]
SXSSF Autosizing fix
bug57450-20151110.txt (text/plain), 10.29 KB, created by
Stefan Thurnherr
on 2015-11-10 18:28:54 UTC
(
hide
)
Description:
SXSSF Autosizing fix
Filename:
MIME Type:
Creator:
Stefan Thurnherr
Created:
2015-11-10 18:28:54 UTC
Size:
10.29 KB
patch
obsolete
>Index: src/java/org/apache/poi/ss/util/SheetUtil.java >=================================================================== >--- src/java/org/apache/poi/ss/util/SheetUtil.java (revision 1713706) >+++ src/java/org/apache/poi/ss/util/SheetUtil.java (working copy) >@@ -232,7 +232,7 @@ > * @param wb the workbook to get the default character width from > * @return default character width > */ >- private static int getDefaultCharWidth(final Workbook wb) { >+ public static int getDefaultCharWidth(final Workbook wb) { > Font defaultFont = wb.getFontAt((short) 0); > > AttributedString str = new AttributedString(String.valueOf(defaultChar)); >Index: src/ooxml/java/org/apache/poi/xssf/streaming/AutoSizeColumnTracker.java >=================================================================== >--- src/ooxml/java/org/apache/poi/xssf/streaming/AutoSizeColumnTracker.java (revision 0) >+++ src/ooxml/java/org/apache/poi/xssf/streaming/AutoSizeColumnTracker.java (working copy) >@@ -0,0 +1,129 @@ >+/* ==================================================================== >+ 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.xssf.streaming; >+ >+import java.util.Map; >+import java.util.TreeMap; >+ >+import org.apache.poi.ss.usermodel.Cell; >+import org.apache.poi.ss.usermodel.DataFormatter; >+import org.apache.poi.ss.usermodel.Row; >+import org.apache.poi.ss.util.SheetUtil; >+ >+/** >+ * Tracks maximum column width for rows of an {@link SXSSFSheet}, >+ * to be able to correctly calculate auto-sized column widths even >+ * if some rows are already flushed to disk. >+*/ >+/*package-protected*/ class AutoSizeColumnTracker { >+ private final SXSSFSheet sheet; >+ private int defaultCharWidth = -1; >+ >+ private final Map<Integer, ColumnWidthPair> maxColumnWidths = new TreeMap<Integer, ColumnWidthPair>(); >+ private DataFormatter dataFormatter; >+ >+ private static class ColumnWidthPair { >+ private double withSkipMergedCells = -1.0; >+ private double withUseMergedCells = -1.0; >+ >+ ColumnWidthPair(final double columnWidthSkipMergedCells, final double columnWidthUseMergedCells) { >+ this.withSkipMergedCells = columnWidthSkipMergedCells; >+ this.withUseMergedCells = columnWidthUseMergedCells; >+ } >+ >+ void updateWithMax(final double cellWidthSkipMergedCells, final double cellWidthUseMergedCells) { >+ withSkipMergedCells = Math.max(withSkipMergedCells, cellWidthSkipMergedCells); >+ withUseMergedCells = Math.max(withUseMergedCells, cellWidthUseMergedCells); >+ } >+ >+ double getMaxColumnWidth(final boolean useMergedCells) { >+ return useMergedCells ? withUseMergedCells : withSkipMergedCells; >+ } >+ } >+ >+ AutoSizeColumnTracker(final SXSSFSheet sheet) { >+ this.sheet = sheet; >+ } >+ >+ void trackCurrentWindowRows() { >+ for (int rowIdx = sheet.getFirstRowNum(); rowIdx <= sheet.getLastRowNum(); rowIdx++) { >+ Row row = sheet.getRow(rowIdx); >+ if (row != null) { >+ trackRow(row); >+ } >+ } >+ } >+ >+ void trackRow(final Row row) { >+ final int firstCellNum = row.getFirstCellNum(); >+ if (firstCellNum < 0) { >+ return; >+ } >+ final int lastCellNum = row.getLastCellNum(); >+ >+ if (defaultCharWidth < 0) { >+ defaultCharWidth = SheetUtil.getDefaultCharWidth(sheet.getWorkbook()); >+ } >+ >+ if (dataFormatter == null) { >+ dataFormatter = new DataFormatter(); >+ } >+ >+ for (int cellNum = firstCellNum; cellNum < lastCellNum; cellNum++) { >+ final Cell cell = row.getCell(cellNum); >+ if (cell == null) { >+ continue; >+ } >+ final double cellWidthSkipMergedCells = SheetUtil.getCellWidth(cell, defaultCharWidth, dataFormatter, false); >+ final double cellWidthUseMergedCells = SheetUtil.getCellWidth(cell, defaultCharWidth, dataFormatter, true); >+ >+ final ColumnWidthPair maxColumnWidthPair = maxColumnWidths.get(cellNum); >+ if (maxColumnWidthPair == null) { >+ final ColumnWidthPair columnWidthPair = new ColumnWidthPair(cellWidthSkipMergedCells, cellWidthUseMergedCells); >+ maxColumnWidths.put(cellNum, columnWidthPair); >+ } else { >+ maxColumnWidthPair.updateWithMax(cellWidthSkipMergedCells, cellWidthUseMergedCells); >+ } >+ } >+ } >+ >+ void autoSizeColumn(final int columnIndex) { >+ autoSizeColumn(columnIndex, false); >+ } >+ >+ void autoSizeColumn(final int columnIndex, final boolean useMergedCells) { >+ Integer columnWidth = calculateWidthForColumn(columnIndex, useMergedCells); >+ if (columnWidth != null) { >+ sheet.setColumnWidth(columnIndex, columnWidth); >+ } >+ } >+ >+ private Integer calculateWidthForColumn(final int columnIndex, final boolean useMergedCells) { >+ final ColumnWidthPair maxColumnWidthPair = maxColumnWidths.get(columnIndex); >+ if (maxColumnWidthPair == null) { >+ return null; >+ } >+ double maxColumnWidth = maxColumnWidthPair.getMaxColumnWidth(useMergedCells); >+ if (maxColumnWidth > 0.0) { >+ maxColumnWidth = Math.min(maxColumnWidth, 255); // The maximum column width for an individual cell is 255 characters >+ return (int)(maxColumnWidth*256); >+ } >+ return null; >+ } >+ >+} > >Property changes on: src/ooxml/java/org/apache/poi/xssf/streaming/AutoSizeColumnTracker.java >___________________________________________________________________ >Added: svn:eol-style >## -0,0 +1 ## >+native >\ No newline at end of property >Index: src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFSheet.java >=================================================================== >--- src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFSheet.java (revision 1713706) >+++ src/ooxml/java/org/apache/poi/xssf/streaming/SXSSFSheet.java (working copy) >@@ -42,7 +42,6 @@ > import org.apache.poi.ss.usermodel.SheetConditionalFormatting; > import org.apache.poi.ss.usermodel.Workbook; > import org.apache.poi.ss.util.CellRangeAddress; >-import org.apache.poi.ss.util.SheetUtil; > import org.apache.poi.xssf.usermodel.XSSFDataValidation; > import org.apache.poi.xssf.usermodel.XSSFHyperlink; > import org.apache.poi.xssf.usermodel.XSSFSheet; >@@ -59,9 +58,11 @@ > private TreeMap<Integer,SXSSFRow> _rows=new TreeMap<Integer,SXSSFRow>(); > private SheetDataWriter _writer; > private int _randomAccessWindowSize = SXSSFWorkbook.DEFAULT_WINDOW_SIZE; >+ private AutoSizeColumnTracker _autoSizeColumnTracker; > private int outlineLevelRow = 0; > private int lastFlushedRowNumber = -1; > private boolean allFlushed = false; >+ private boolean autoSizeTrackFlushedRows = false; > > public SXSSFSheet(SXSSFWorkbook workbook, XSSFSheet xSheet) throws IOException { > _workbook = workbook; >@@ -68,7 +69,24 @@ > _sh = xSheet; > _writer = workbook.createSheetDataWriter(); > setRandomAccessWindowSize(_workbook.getRandomAccessWindowSize()); >+ _autoSizeColumnTracker = new AutoSizeColumnTracker(this); > } >+ >+ /** >+ * Set this to <code>true</code> to enable column width auto-size calculation based >+ * on all rows contained in the Sheet. By default (e.g. when this value is >+ * <code>false</code>), only the rows currently held in memory will be taken into >+ * account when calling {@link #autoSizeColumn(int)} or {@link #autoSizeColumn(int, boolean)}. >+ * >+ * @param autoSizeTrackFlushedRows Set to <code>true</code> to force tracking of >+ * all rows for auto-sized column width calculation. Default is <code>false</code> >+ * >+ * @see SXSSFWorkbook#DEFAULT_WINDOW_SIZE >+ */ >+ public void setAutoSizeTrackAllFlushedRows(boolean autoSizeTrackFlushedRows) >+ { >+ this.autoSizeTrackFlushedRows = autoSizeTrackFlushedRows; >+ } > > /** > * for testing purposes only >@@ -1306,15 +1324,10 @@ > */ > public void autoSizeColumn(int column, boolean useMergedCells) > { >- double width = SheetUtil.getColumnWidth(this, column, useMergedCells); >- >- if (width != -1) { >- width *= 256; >- int maxColumnWidth = 255*256; // The maximum column width for an individual cell is 255 characters >- if (width > maxColumnWidth) { >- width = maxColumnWidth; >- } >- setColumnWidth(column, (int)(width)); >+ if (_autoSizeColumnTracker != null) >+ { >+ this._autoSizeColumnTracker.trackCurrentWindowRows(); >+ this._autoSizeColumnTracker.autoSizeColumn(column, useMergedCells); > } > } > >@@ -1524,9 +1537,14 @@ > private void flushOneRow() throws IOException > { > Integer firstRowNum = _rows.firstKey(); >- if (firstRowNum!=null) { >+ if (firstRowNum!=null) >+ { > int rowIndex = firstRowNum.intValue(); > SXSSFRow row = _rows.get(firstRowNum); >+ if (autoSizeTrackFlushedRows && _autoSizeColumnTracker != null) >+ { >+ _autoSizeColumnTracker.trackRow(row); >+ } > _writer.writeRow(rowIndex, row); > _rows.remove(firstRowNum); > lastFlushedRowNumber = rowIndex; >@@ -1555,6 +1573,7 @@ > * @return true if the file was deleted, false if it wasn't. > */ > boolean dispose() throws IOException { >+ this._autoSizeColumnTracker = null; > if (!allFlushed) flushRows(); > return _writer.dispose(); > }
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Raw
Actions:
View
Attachments on
bug 57450
:
33194
|
33207
|
33251
|
33269
|
33277
|
33307
|
33308