poi中word中表格跨列合并以及不兼容wps问题,java下 linux下word转pdf 问题解决

2022-06-21 00:00:00 合并 表格 不兼容

   最近需要在word中绘制表格,绘制完成后发现 wps不支持poi的跨列合并,百度没有找到好的解决办法。自己在office中把文档转换为doc格式之后发现wps可以正常显示word中的表格了,同时之前微信预览不到表格的问题也解决了。

poi版本为3.17 以下是跨列以及跨行合并代码 之前网上搜到的 忘记原作者是哪位大佬了

maven

        <!--poi 用于操作word-->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.14</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-scratchpad</artifactId>
            <version>3.14</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml</artifactId>
            <version>3.14</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi-ooxml-schemas</artifactId>
            <version>3.14</version>
        </dependency>
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>ooxml-schemas</artifactId>
            <version>1.3</version>
        </dependency>
    // word跨列合并单元格
    public void mergeCellsHorizontal(XWPFTable table, int row, int fromCell, int toCell) {
        for (int cellIndex = fromCell; cellIndex <= toCell; cellIndex++) {
            XWPFTableCell cell = table.getRow(row).getCell(cellIndex);
            if (cellIndex == fromCell) {
                // The first merged cell is set with RESTART merge value
                cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.RESTART);
            } else {
                // Cells which join (merge) the first one, are set with CONTINUE
                cell.getCTTc().addNewTcPr().addNewHMerge().setVal(STMerge.CONTINUE);
            }
        }
    }

    // word跨行并单元格
    public void mergeCellsVertically(XWPFTable table, int col, int fromRow, int toRow) {
        for (int rowIndex = fromRow; rowIndex <= toRow; rowIndex++) {
            XWPFTableCell cell = table.getRow(rowIndex).getCell(col);
            if (rowIndex == fromRow) {
                // The first merged cell is set with RESTART merge value
                cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.RESTART);
            } else {
                // Cells which join (merge) the first one, are set with CONTINUE
                cell.getCTTc().addNewTcPr().addNewVMerge().setVal(STMerge.CONTINUE);
            }
        }
    }

   docx转doc用的是aspose-words-jdk16.jar   这个jar包全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF,EPUB, XPS, SWF 相互转换 且linux和windiws下均可使用。效率也很高。比之前使用的jacob要好用很多,以下是调用方法十分简单

    /**
     * word转pdf 需引入 aspose-words-16.4.0-jdk16.jar包  收费插件windows linux下均可用
     *
     * @param inPath  源文件路径
     * @param outPath 输出文件路径
     */
    public static void docx2pdf(String inPath, String outPath) {
        //jar包为破解版 不用进行验证
        /*
        if (!getLicense()) { // 验证License 若不验证则转化出的pdf文档会有水印产生
            return;
        }*/

        try {
            File file = new File(outPath); // 新建一个空白pdf文档
            FileOutputStream os = new FileOutputStream(file);
            com.aspose.words.Document doc = new com.aspose.words.Document(inPath); // Address是将要被转化的word文档
            doc.save(os, SaveFormat.PDF);// 全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF,EPUB, XPS, SWF 相互转换
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    /**
     * docx转doc 需引入 aspose-words-16.4.0-jdk16.jar包  收费插件windows linux下均可用
     *
     * wps不兼容docx的表格跨列合并,微信文件预览不支持docx下的表格
     * 转换为doc格式的可以被wps兼容 微信可预览表格
     *
     * @param inPath  源文件路径
     * @param outPath 输出文件路径
     */
    public static void docx2doc(String inPath, String outPath) {
        try {
            File file = new File(outPath); // 新建一个空白pdf文档
            FileOutputStream os = new FileOutputStream(file);
            com.aspose.words.Document doc = new com.aspose.words.Document(inPath); // Address是将要被转化的word文档
            doc.save(os, SaveFormat.DOC);// 全面支持DOC, DOCX, OOXML, RTF HTML, OpenDocument, PDF,EPUB, XPS, SWF 相互转换
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

这个是aspose的下载地址 破解版本 转换之后没有发现水印 下载后放至maven对应目录下 或者直接把jar包放入工程内

aspose下载地址

        <!-- word转pdf插件包 破解版 此包需要手动导入至maven仓库 -->
        <dependency>
            <groupId>com.aspose.words</groupId>
            <artifactId>aspose-words-jdk16</artifactId>
        </dependency>

 

    原文作者:蛋 壳
    原文地址: https://blog.csdn.net/FlyDanke/article/details/84563473
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。

相关文章