Browse Source

Merge pull request #290 in CORE/base-third from ~HUGH.C/base-third:release/10.0 to release/10.0

* commit 'bdcd1df5f7acaf5e5a3733fb8e831d1d68a99c91':
  REPORT-22637 HTML的<table>标签,列宽其每列的最大值
release/10.0
neil 5 years ago
parent
commit
234ba968c7
  1. 101
      fine-itext/src/com/fr/third/v2/lowagie/text/html/simpleparser/IncTable.java

101
fine-itext/src/com/fr/third/v2/lowagie/text/html/simpleparser/IncTable.java

@ -68,6 +68,7 @@ public class IncTable {
private ArrayList cols;
private ArrayList<Float> rowHeights = new ArrayList<Float>();
private ArrayList<Float> relativeColWidths = new ArrayList<Float>();
/** Creates a new instance of IncTable */
public IncTable(HashMap props) {
this.props.putAll(props);
@ -103,33 +104,30 @@ public class IncTable {
if (rows.isEmpty())
return new PdfPTable(1);
int ncol = 0;
ArrayList c0 = (ArrayList)rows.get(0);
ArrayList<Float> colWidths = new ArrayList<Float>();
float widthSum = 0;
ArrayList c0 = (ArrayList) rows.get(0);
for (int k = 0; k < c0.size(); ++k) {
PdfPCell pCell = ((PdfPCell)c0.get(k));
int cellCols = pCell.getColspan();
ncol += cellCols;
//不取 0 ,后面可能需要求比值
float styleWidth = pCell.getStyleWidth();
if(cellCols > 1){
float avgWidth = styleWidth / cellCols;
float width = 0 == avgWidth ? 1 : avgWidth;
widthSum = width * cellCols;
for(int a = 0; a < cellCols ; a++){
colWidths.add(width);
}
}else {
float width = 0 == styleWidth ? 1 : styleWidth;
widthSum += width;
colWidths.add(width);
}
ncol += ((PdfPCell) c0.get(k)).getColspan();
}
processColWidth(ncol);
PdfPTable table = new PdfPTable(ncol);
try {
TableProperties tableProperties = parseTableProperties();
table.setTableProperties(tableProperties);
//相对宽度
float[] floats = new float[relativeColWidths.size()];
for (int a = 0; a < relativeColWidths.size(); a++) {
floats[a] = relativeColWidths.get(a);
}
try {
table.setWidths(floats);
} catch (Exception e) {
e.printStackTrace();
}
String width = (String)props.get("width");
if (width == null)
table.setWidthPercentage(100);
@ -138,18 +136,7 @@ public class IncTable {
table.setWidthPercentage(CSSUtils.parseFloat(width));
else {
//解析单元格宽度
float totalWidth = CSSUtils.parseFloat(width);
float[] floats = new float[colWidths.size()];
for (int a = 0; a < colWidths.size(); a++) {
floats[a] = totalWidth * colWidths.get(a) / widthSum;
}
//解析px数值
table.setTotalWidth(totalWidth);
try {
table.setWidths(floats);
}catch (Exception e){
e.printStackTrace();
}
table.setTotalWidth(CSSUtils.parseFloat(width));
table.setLockedWidth(true);
}
}
@ -161,14 +148,60 @@ public class IncTable {
}
processRowHeight(table);
}catch (Exception e){
e.printStackTrace();
}
return table;
}
/**
* 调整列宽每列取最大值
*
* @param colCount 列数
*/
private void processColWidth(int colCount) {
if (null == rows || 0 == rows.size()) {
return;
}
//初始化一下
for (int i = 0; i < colCount; i++) {
relativeColWidths.add(0f);
}
for (int rowIndex = 0; rowIndex < rows.size(); rowIndex++) {
ArrayList cols = (ArrayList) rows.get(rowIndex);
for (int colIndex = 0; colIndex < cols.size(); colIndex++) {
PdfPCell pCell = ((PdfPCell) cols.get(colIndex));
int cellCols = pCell.getColspan();
float avgWidth = pCell.getStyleWidth() / cellCols;
for (int i = 0; i < cellCols && colIndex + i < colCount; i++) {
if (relativeColWidths.get(i) < avgWidth) {
relativeColWidths.set(colIndex + i, avgWidth);
}
}
}
}
dealRelativeColWidthsWhenAllAreZero(relativeColWidths);
}
/**
* 全部为0,则全部赋值1
*
* @param relativeColWidths 相对宽度
*/
private void dealRelativeColWidthsWhenAllAreZero(ArrayList<Float> relativeColWidths) {
if (0 == relativeColWidths.size()) {
return;
}
for (int i = 0; i < relativeColWidths.size(); i++) {
if (0 != relativeColWidths.get(i)) {
return;
}
}
for (int i = 0; i < relativeColWidths.size(); i++) {
relativeColWidths.set(i, 1f);
}
}
public void processRowHeight(PdfPTable table) {
Float height = CSSUtils.parseFloat((String) props.get("height"));
Float eachHeight = height / table.getRows().size();

Loading…
Cancel
Save