bug 61454: add column width to example Spreadsheet ToHtml; thanks to Christian Froehler

git-svn-id: https://svn.apache.org/repos/asf/poi/trunk@1808816 13f79535-47bb-0310-9956-ffa450edef68
This commit is contained in:
Javen O'Neal 2017-09-19 03:26:20 +00:00
parent 357816942a
commit 7a52b8c93b
2 changed files with 59 additions and 8 deletions

View File

@ -30,6 +30,7 @@ import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Set;
import java.util.TreeMap;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
@ -96,6 +97,10 @@ public class ToHtml {
BorderStyle.THICK, "solid 3pt",
BorderStyle.THIN, "dashed 1pt");
private static final int IDX_TABLE_WIDTH = -2;
private static final int IDX_HEADER_COL_WIDTH = -1;
@SuppressWarnings({"unchecked"})
private static <K, V> Map<K, V> mapFor(Object... mapping) {
Map<K, V> map = new HashMap<>();
@ -355,17 +360,61 @@ public class ToHtml {
public void printSheet(Sheet sheet) {
ensureOut();
out.format("<table class=%s>%n", DEFAULTS_CLASS);
printCols(sheet);
Map<Integer, Integer> widths = computeWidths(sheet);
int tableWidth = widths.get(IDX_TABLE_WIDTH);
out.format("<table class=%s style=\"width:%dpx;\">%n", DEFAULTS_CLASS, tableWidth);
printCols(widths);
printSheetContent(sheet);
out.format("</table>%n");
}
private void printCols(Sheet sheet) {
out.format("<col/>%n");
/**
* computes the column widths, defined by the sheet.
*
* @param sheet
* @return Map with key: column index; value: column width in pixels
* <br>special keys:
* <br>{@link #IDX_HEADER_COL_WIDTH} - width of the header column
* <br>{@link #IDX_TABLE_WIDTH} - width of the entire table
*/
private Map<Integer, Integer> computeWidths(Sheet sheet) {
Map<Integer, Integer> ret = new TreeMap<Integer, Integer>();
int tableWidth = 0;
ensureColumnBounds(sheet);
// compute width of the header column
int lastRowNum = sheet.getLastRowNum();
int headerCharCount = String.valueOf(lastRowNum).length();
int headerColWidth = widthToPixels((headerCharCount + 1) * 256);
ret.put(IDX_HEADER_COL_WIDTH, headerColWidth);
tableWidth += headerColWidth;
for (int i = firstColumn; i < endColumn; i++) {
out.format("<col/>%n");
int colWidth = poiWidthToPixels(sheet.getColumnWidth(i));
ret.put(i, colWidth);
tableWidth += colWidth;
}
ret.put(IDX_TABLE_WIDTH, tableWidth);
return ret ;
}
/**
* Probably platform-specific, but appears to be a close approximation on some systems
* @param widthUnits POI's native width unit (twips)
* @return the approximate number of pixels for a typical display
*/
protected int widthToPixels(final double widthUnits) {
return (int) (Math.round(widthUnits * 9 / 256));
}
private void printCols(Map<Integer, Integer> widths) {
int headerColWidth = widths.get(IDX_HEADER_COL_WIDTH);
out.format("<col style=\"width:%dpx\"/>%n", headerColWidth);
for (int i = firstColumn; i < endColumn; i++) {
int colWidth = widths.get(i);
out.format("<col style=\"width:%dpx;\"/>%n", colWidth);
}
}

View File

@ -30,7 +30,7 @@
text-indent: 0;
letter-spacing: 0;
word-spacing: 0;
white-space: normal;
white-space: pre-wrap;
unicode-bidi: normal;
vertical-align: 0;
background-image: none;
@ -40,7 +40,6 @@
padding: 0;
margin: 0;
border-collapse: collapse;
white-space: pre;
vertical-align: bottom;
font-style: normal;
font-family: sans-serif;
@ -48,6 +47,9 @@
font-weight: normal;
font-size: 10pt;
text-align: right;
table-layout: fixed;
word-wrap: break-word;
overflow-wrap: break-word;
}
.excelDefaults td {