首頁 > 軟體

Java實現將匯出帶格式的Excel資料到Word表格

2022-11-13 14:01:09

在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實現將匯出帶格式的Excel資料到Word表格的文章就介紹到這了,更多相關Java匯出Excel資料到Word內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com