@Kiwiwings:
Now I have modified your code to make similar on what I did in actual
project.
Here is the whole demo code:
import java.awt.Color;
import java.awt.geom.Rectangle2D;
import java.io.FileOutputStream;
import java.util.Collections;
import java.util.List;
import java.util.stream.Collectors;

import org.apache.poi.sl.draw.DrawTableShape;
import org.apache.poi.sl.usermodel.TextShape;
import org.apache.poi.xslf.usermodel.XMLSlideShow;
import org.apache.poi.xslf.usermodel.XSLFSlide;
import org.apache.poi.xslf.usermodel.XSLFTable;
import org.apache.poi.xslf.usermodel.XSLFTableCell;
import org.apache.poi.xslf.usermodel.XSLFTableRow;
import org.apache.poi.xslf.usermodel.XSLFTextRun;

public class TableResizeDemo {

        public static void main(String[] args) throws Exception {
                String[][] data = {
                                { "ID", "Name", "Description", "Price", 
"Percent", "Current Value" },
                                { "123", "Car", "It is new car in 2019", 
"$40000", "88%", "$38000" },
                                { "123", "Car", "It is new car in 2019", 
"$40000", "88%", "$38000" },
                                { "123", "Car", "It is new car in 2019", 
"$40000", "88%", "$38000" },
                                { "123", "Car", "It is new car in 2019", 
"$40000", "88%", "$38000" }
                        };
                
                try (XMLSlideShow ppt = new XMLSlideShow()) {
                        XSLFSlide slide = ppt.createSlide();

                        Rectangle2D nextAnchor = displayTable(slide, data, 
null);//First
                        displayTable(slide, data, nextAnchor);//Second

                        try (FileOutputStream fos = new
FileOutputStream("output/tableTest.pptx")) {
                                ppt.write(fos);
                        }
                }
        }
        
        static Rectangle2D displayTable(XSLFSlide slide, String[][] data,
Rectangle2D nextAnchor) {
                XSLFTable tab = slide.createTable(data.length, data[0].length);

                for (int row = 0; row < data.length; row++) {
                        for (int col = 0; col < data[row].length; col++) {
                                XSLFTableCell c = tab.getCell(row, col);
                                c.setText(data[row][col]);
                                c.setTextAutofit(TextShape.TextAutofit.SHAPE);
                                XSLFTextRun tr = 
c.getTextParagraphs().get(0).getTextRuns().get(0);
                                double fontSize = (0 == row) ? 20. : 15.;
                                tr.setFontSize(fontSize);
                        }
                }
                tab.setColumnWidth(0, 120);//FIXME - issue?
                tab.setColumnWidth(1, 120);//FIXME - issue?

                // Calculate Gap between tables
                Rectangle2D rect = (null != nextAnchor) ? 
getGapAnchor(nextAnchor, 20) :
new Rectangle2D.Double(40, 40, tab.getAnchor().getWidth(),
tab.getAnchor().getHeight());
                tab.setAnchor(rect);
                
                // Calculate Table's height
                calculateTableHeight(tab, tab.getAnchor());
                
                // Get Next Anchor
                Rectangle2D anchor = getNextAnchor(tab.getAnchor());
                
                DrawTableShape dts = new DrawTableShape(tab);
        dts.setOutsideBorders(Color.DARK_GRAY, 1.0);
                
                return anchor;
        }
        
        static void calculateTableHeight(XSLFTable tab, Rectangle2D anchor)
{//FIXME - issue?
                double totalCellAnchorHeight = 0;
                for (XSLFTableRow row : tab.getRows()) {
                        /*for (XSLFTableCell cell : row.getCells()) {
                                cell.resizeToFitText(); //make Cell Height fits 
with Text Height
                        }*/
                        List<Double> cellAnchorHeightList = 
row.getCells().stream().map(c ->
c.getAnchor().getHeight()).collect(Collectors.toList());
                        double maxCellAnchorHeight = 
Collections.max(cellAnchorHeightList);// Get
only Max Cell Anchor's height
                        totalCellAnchorHeight += maxCellAnchorHeight;
                }
                Rectangle2D newAnchor = new Rectangle2D.Double(anchor.getX(),
anchor.getY(), anchor.getWidth(), totalCellAnchorHeight);
                tab.setAnchor(newAnchor);
        }
        
        static Rectangle2D getNextAnchor(Rectangle2D anchor) {//FIXME - issue?
                return new Rectangle2D.Double(anchor.getX(), anchor.getMaxY(),
anchor.getWidth(), anchor.getHeight());
        }
        
        static Rectangle2D getGapAnchor(Rectangle2D anchor, int gap) {//FIXME -
issue?
                return new Rectangle2D.Double(anchor.getX(), anchor.getY() + 
gap,
anchor.getWidth(), anchor.getHeight());
        }
}

When you run that program, you will see two issues as I wrote:
1. Display text does not fit with column. 
For example, less text should display in small column. long text should 
display in big column. 

2. Calculate table's height, so I can display two or more tables in the same 
slide. 
I mean after display one table and then need to display second table.

It seems work well with static data but when I applied real data, it does
not work well.




--
Sent from: http://apache-poi.1045710.n5.nabble.com/POI-User-f2280730.html

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to