为有中文需求的客户提供多渠道中文技术支持.

Sat Sep 18, 2021 7:30 am

我使用的是4.8.0版本

1.ppt中的附件progID是Excel.Sheet.12时,提取到本地报错,无法打开。Excel.sheet.8无此问题。
2.部分excel、visio附件从ppt提取到本地再插入word后,附件图标的文字(附件名)出现乱码,附件图标的文字(附件名)如何获取?我看到提取到本地的附件图标并没有带有文字。
我使用的获取附件图标的方法:IOleObject.getSubstituteImagePictureFillFormat().getPicture().getEmbedImage().getImage();
3.是否支持读取ppt中带有合并单元格的表格?

谢谢

dadachaoren
 
Posts: 3
Joined: Sat Sep 18, 2021 7:11 am

Sat Sep 18, 2021 8:36 am

您好,目前问题2已规避。

dadachaoren
 
Posts: 3
Joined: Sat Sep 18, 2021 7:11 am

Sat Sep 18, 2021 9:53 am

您好,

感谢您的咨询。以下是我对您问题的答复。

问题1:我模拟了一个嵌入xlsx格式文档的PPT文件进行测试,但是并没有重现您的问题。为了帮助我们进一步调查,请提供您的输入文件及测试代码。您可以通过邮件将其发送给我们(support@e-iceblue.com)。此外,请注意PPT文件中不同类型的附件所对应的progID是不同的,progID为Excel.Sheet.12对应的是.xlsx格式,请确保您保存的时候文件后缀是正确的。
问题3:我们支持读取PPT中带有合并单元格的表格,您可以参照下面的示例代码进行测试:
Code: Select all
        Presentation presentation = new Presentation();
        presentation.loadFromFile("data/MergedCellInTable.pptx");
        ITable table = null;
        for (int i = 0; i < presentation.getSlides().get(0).getShapes().getCount();i ++) {
            IShape shape = presentation.getSlides().get(0).getShapes().get(i);
            if (shape instanceof ITable) {
                table = (ITable) shape;

                for (int j = 0; j < table.getTableRows().getCount(); j++) {
                    TableRow row = table.getTableRows().get(j);
                    for (int a = 0; a < row.getCount(); a++) {
                        if (row.get(a).getRowSpan() > 1 || row.get(a).getColSpan() > 1) {
                            System.out.println("The cell " + j + ":" + a + "is a part of merged cell with RowSpan=" + row.get(a).getRowSpan() + " and ColSpan=" + row.get(a).getColSpan() + " starting from Cell " + row.get(a).getFirstRowIndex() + " : " + row.get(a).getFirstColumnIndex());
                        }

                    }

                }
            }
        }


Sincerely,
Brian
E-iceblue support team
User avatar

Brian.Li
 
Posts: 1271
Joined: Mon Oct 19, 2020 3:04 am

Tue Sep 21, 2021 9:42 am

感谢您的支持,问题1应该是本身文件的问题,更换文件后可以正常读写。
请教一下,如何读写ppt中带有合并单元格的表格到word中呢?如何读出正确的单元格排列和数据而不仅仅是判断。

dadachaoren
 
Posts: 3
Joined: Sat Sep 18, 2021 7:11 am

Wed Sep 22, 2021 10:36 am

您好,

感谢您的咨询.
请参考以下代码将PPT文件中的表格及表格中的内容复制到Word文档中。
Code: Select all
    public static void main(String[] args) throws Exception{

        Document doc = new Document();
        doc.loadFromFile("data/test.docx");

        Presentation presentation = new Presentation();
        presentation.loadFromFile("data/MergedCellInTable.pptx");
        ITable table = null;
        for (int i = 0; i < presentation.getSlides().get(0).getShapes().getCount();i ++) {
            IShape shape = presentation.getSlides().get(0).getShapes().get(i);
            if (shape instanceof ITable) {
                table = (ITable) shape;

                copyToWord(table, doc);
            }
        }
        doc.saveToFile("result.docx",FileFormat.Docx);

    }

    public static void copyToWord(ITable pptTable, Document document) {
        //添加表格
        Table table = document.getSections().get(0).addTable(true);
        table.resetCells(pptTable.getTableRows().getCount(), pptTable.getColumnsList().getCount());
        table.getTableFormat().getBorders().getLeft().setBorderType(BorderStyle.Single);
        table.getTableFormat().getBorders().getRight().setBorderType(BorderStyle.Single);
        table.getTableFormat().getBorders().getTop().setBorderType(BorderStyle.Single);
        table.getTableFormat().getBorders().getBottom().setBorderType(BorderStyle.Single);
        //复制表格内容
        for (int r = 0; r < pptTable.getTableRows().getCount(); r++) {
            for (int c = 0; c < pptTable.getColumnsList().getCount(); c++) {
                Cell xCell = pptTable.get(c, r);

                if (xCell.getRowSpan()>1) {
                    int rowSpan = xCell.getRowSpan();
                    table.applyVerticalMerge(c, r , r + rowSpan-1);
                    r = r + rowSpan-1;
                }
                if(xCell.getColSpan()>1){
                    int columnSpan = xCell.getColSpan();
                    table.applyHorizontalMerge(r, c, c + columnSpan-1);
                    c = c + columnSpan - 1;
                }
            }
        }

        //复制内容
        for (int r = 0; r < pptTable.getTableRows().getCount(); r++) {
            for (int c = 0; c < pptTable.getColumnsList().getCount(); c++) {
                Cell xCell = pptTable.get(c, r);

                TableCell wCell = table.getRows().get(r).getCells().get(c);
                if (!xCell.getTextFrame().getText().isEmpty()) {
                    Paragraph paragraph = wCell.addParagraph();
                    paragraph.getFormat().setBeforeSpacing(0);
                    paragraph.getFormat().setAfterSpacing(0);
                    TextRange textRange = paragraph.appendText(xCell.getTextFrame().getText());
                    copyStyle(textRange, xCell, wCell);
                }
            }
        }


    }

    private static void copyStyle(TextRange wTextRange, Cell xCell, TableCell wCell) {

        wTextRange.getCharacterFormat().setTextColor(xCell.getTextFrame().getTextRange().getFill().getSolidColor().getColor());
        wTextRange.getCharacterFormat().setFontSize(xCell.getTextFrame().getTextRange().getFontHeight());
        //复制排列方式
        switch (xCell.getTextFrame().getParagraphs().get(0).getAlignment()) {
            case LEFT:
                wTextRange.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Left);
                break;
            case CENTER:
                wTextRange.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Center);
                break;
            case RIGHT:
                wTextRange.getOwnerParagraph().getFormat().setHorizontalAlignment(HorizontalAlignment.Right);
                break;
            default:
                break;
        }
    }

如果这无法解决您的问题,请提供您的输入文档和期望的结果。您可以通过邮件发送给我们(support@e-iceblue.com)。提前感谢。

Sincerely,
Brian
E-iceblue support team
User avatar

Brian.Li
 
Posts: 1271
Joined: Mon Oct 19, 2020 3:04 am

Return to 中文技术支持