首页 > 编程语言 >如何通过Java导出带格式的 Excel 数据到 Word 表格

如何通过Java导出带格式的 Excel 数据到 Word 表格

时间:2022-11-11 16:45:16浏览次数:61  
标签:Java spire Excel wTextRange xCell Word com

在Word中制作报表时,我们经常需要将Excel中的数据复制粘贴到Word中,这样则可以直接在Word文档中查看数据而无需打开另一个Excel文件。但是如果表格比较长,内容就会存在一定程度的丢失,无法完整显示数据。并且当工作量到达一定程度时,整个过程会非常费时,降低工作效率。那么如何轻松地将带格式的 Excel 数据导出到 Word 表格呢?不用担心,本文将通过Java应用程序详细介绍如何把带格式的Excel数据导入Word表格。希望这篇文章能对大家有所帮助。

使用工具Free Spire.Office for Java

程序环境:

方法1:手动引入。将 Free Spire.Office for Java 下载到本地,解压,找到lib文件夹下的Spire.XLS.jar文件。在IDEA中打开如下界面,将本地路径中的jar文件引入Java程序

方法2: 如果您想通过 Maven安装,则可以在 pom.xml 文件中添加以下代码导入 JAR 文件。

<repositories>

    <repository>

        <id>com.e-iceblue</id>

        <name>e-iceblue</name>

        <url>https://repo.e-iceblue.cn/repository/maven-public/</url>

    </repository>

</repositories>

<dependencies>

    <dependency>

        <groupId>e-iceblue</groupId>

        <artifactId>spire.office.free</artifactId>

        <version>5.3.1</version>

    </dependency>

</dependencies>

具体步骤:

  • 创建一个 Workbook 对象并使用 Workbook.LoadFromFile() 方法加载一个示例 Excel 文件。
  • 通过 Workbook.Worksheets[index] 属性获取特定的工作表。
  • 创建一个 Document 对象,并向其添加一个节。
  • 使用 Section.AddTable() 方法添加一个表。
  • 检测工作表中合并的单元格,并使用自定义方法 MergeCells() 合并 Word表格相应的单元格。
  • 通过 CellRange.Value 属性获取特定 Excel 单元格的值,并使用 TableCell.AddParagraph().AppendText() 方法将其添加到 Word 表格的单元格中。
  • 使用自定义方法 CopyStyle() 将字体样式和单元格样式从 Excel 复制到 Word 表格中。
  • 使用 Document.SaveToFile() 方法将文档保存到 Word 文件。

完整代码:

【Java】

import com.spire.doc.*;
import com.spire.doc.FileFormat;
import com.spire.doc.documents.HorizontalAlignment;
import com.spire.doc.documents.PageOrientation;
import com.spire.doc.documents.VerticalAlignment;
import com.spire.doc.fields.TextRange;
import com.spire.xls.*;

public class ExportExcelToWord {

    public static void main(String[] args) {

        //下载一个Excel文件
        Workbook workbook = new Workbook();
        workbook.loadFromFile("sample.xlsx");

        //得到第一张工作表
        Worksheet sheet = workbook.getWorksheets().get(0);

        //创建一个Word文档
        Document doc = new Document();
        Section section = doc.addSection();
        section.getPageSetup().setOrientation(PageOrientation.Landscape);

        //添加一个表格
        Table table = section.addTable(true);
        table.resetCells(sheet.getLastRow(), sheet.getLastColumn());

        //合并单元格
        mergeCells(sheet, table);

        for (int r = 1; r <= sheet.getLastRow(); r++) {

            //设置行高
            table.getRows().get(r - 1).setHeight((float) sheet.getRowHeight(r));

            for (int c = 1; c <= sheet.getLastColumn(); c++) {
                CellRange xCell = sheet.getCellRange(r, c);
                TableCell wCell = table.get(r - 1, c - 1);

                //获得特定Excel单元格的值并将其添加到Word表格单元格
                TextRange textRange = wCell.addParagraph().appendText(xCell.getValue());

                // 从Excel复制字体和单元格样式到Word
                copyStyle(textRange, xCell, wCell);
            }
        }

        //保存文档为Word文件
        doc.saveToFile("ExportToWord.docx", FileFormat.Docx);
    }

    //如果有合并的区域,则合并单元格
    private static void mergeCells(Worksheet sheet, Table table) {
        if (sheet.hasMergedCells()) {

            //从Excel中获取合并的单元格范围
            CellRange[] ranges = sheet.getMergedCells();
            for (int i = 0; i < ranges.length; i++) {
                int startRow = ranges[i].getRow();
                int startColumn = ranges[i].getColumn();
                int rowCount = ranges[i].getRowCount();
                int columnCount = ranges[i].getColumnCount();

                //合并Word表格中的对应单元格
                if (rowCount > 1 && columnCount > 1) {
                    for (int j = startRow; j <= startRow + rowCount ; j++) {
                        table.applyHorizontalMerge(j - 1, startColumn - 1, startColumn - 1 + columnCount - 1);
                    }
                    table.applyVerticalMerge(startColumn - 1, startRow - 1, startRow - 1 + rowCount - 1 );
                }
                if (rowCount > 1 && columnCount == 1 ) {
                    table.applyVerticalMerge(startColumn - 1, startRow - 1, startRow - 1 + rowCount - 1);
                }
                if (columnCount > 1 && rowCount == 1 ) {
                    table.applyHorizontalMerge(startRow - 1, startColumn - 1,  startColumn - 1 + columnCount-1);
                }
            }
        }
    }

    //复制Excel单元格样式到Word表格
    private static void copyStyle(TextRange wTextRange, CellRange xCell, TableCell wCell) {

        //复制字体样式
        wTextRange.getCharacterFormat().setTextColor(xCell.getStyle().getFont().getColor());
        wTextRange.getCharacterFormat().setFontSize((float) xCell.getStyle().getFont().getSize());
        wTextRange.getCharacterFormat().setFontName(xCell.getStyle().getFont().getFontName());
        wTextRange.getCharacterFormat().setBold(xCell.getStyle().getFont().isBold());
        wTextRange.getCharacterFormat().setItalic(xCell.getStyle().getFont().isItalic());

        //复制背景色
        wCell.getCellFormat().setBackColor(xCell.getStyle().getColor());

        //复制水平对齐方式
        switch (xCell.getHorizontalAlignment()) {
            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;
        }

        //复制垂直对齐方式
        switch (xCell.getVerticalAlignment()) {
            case Bottom:
                wCell.getCellFormat().setVerticalAlignment(VerticalAlignment.Bottom);
                break;
            case Center:
                wCell.getCellFormat().setVerticalAlignment(VerticalAlignment.Middle);
                break;
            case Top:
                wCell.getCellFormat().setVerticalAlignment(VerticalAlignment.Top);
                break;
        }
    }
}

效果图

 

——本文完——

标签:Java,spire,Excel,wTextRange,xCell,Word,com
From: https://www.cnblogs.com/Yesi/p/16880981.html

相关文章

  • Java8新特性 - 04 - 方法引用06 - 方式五 【类名[]::new
    参考:https://blog.csdn.net/qq_39505245/article/details/1231427801.类名[]::new`1.将Lambda表达式替换为【类名[]::new】的写法。2.确保【数组的构造方法】的......
  • JAVA 六种常见线程池
    在我们日常业务开发中,如果遇到使用线程池的场景时,会先去思考一下这种场景需要使用到怎样的线程池,去避免线程资源滥用。这个时候选择困难症就来了,不过不用担心,Java其实早......
  • Ueditor集成Word导入(富文本编辑器)
    ​ 当前功能基于PHP,其它语言流程大致相同 1.新增上传wordjson配置在ueditor\php\config.json中新增如下配置:     /* 上传word配置 */    "wordAction......
  • Linux 定时任务crontab监控重启java服务脚本
    linux服务器下,利用Linux定时器和简单监控脚本,监控自动重启java服务。注意:脚本最好在Linux系统中用touch建立.sh文件,并用shmod+x+‘脚本文件名’,在window下编辑有可能会......
  • java 更新list内的元素
    参考:https://blog.csdn.net/liangqi1234/article/details/50176451/***更新list内的元素。*@paramobjlist*@paramoldObj旧对象*@paramnewObj要更新的对象*......
  • 【Java】多线程 语法 使用
    在java中使用多线程有三种方式。1.继承Thread类;2.实现Runnable接口;3.匿名内部类;第一种一般不用,因为java只允许单继承,万一这个业务类有父类就无法继承了。第二种如下:publicc......
  • 配置java_home
    查看有无环境变量echo$JAVA_HOME 查找java安装位置 find/-namejava 编辑环境变量vim/etc/profile 配置:exportJAVA_HOME=/usr/lib/jvm/java-1.8.0-open......
  • [Typescript] 97. Hard - Capitalize Words
    Implement CapitalizeWords<T> whichconvertsthefirstletterof eachwordofastring touppercaseandleavestherestas-is.Forexampletypecapitalized......
  • 【Java】 java -jar 命令 传递系统参数 与 main函数参数 顺序
    packagecom.liyao.runner;/***用法:java[-options]class[args...]*(执行类)*或java[-options]-jarjarfile[args...]*(执行ja......
  • JAVA四大核心函数式接口
    Consumer接口1.接口说明Consumer接口是消费性接口,无返回值。Java8中对Consumer的定义如下所示。@FunctionalInterfacepublicinterfaceConsumer<T>{voidaccep......