最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Python基于OpenPyxl實(shí)現(xiàn)Excel轉(zhuǎn)PDF并精準(zhǔn)控制分頁

 更新時(shí)間:2025年12月09日 08:36:34   作者:天天進(jìn)步2015  
在 Python 自動化辦公(RPA)的場景中,我們經(jīng)常需要自動生成帶有圖表或圖片的 Excel 報(bào)表,并最終將其導(dǎo)出為 PDF,下面我們就來聊聊如何使用OpenPyxl實(shí)現(xiàn)這一功能并精準(zhǔn)控制分頁吧

在 Python 自動化辦公(RPA)的場景中,我們經(jīng)常需要自動生成帶有圖表或圖片的 Excel 報(bào)表,并最終將其導(dǎo)出為 PDF。

但你是否遇到過這種情況:代碼跑得很歡,生成的 Excel 也很完美,但一轉(zhuǎn)成 PDF,精美的圖表剛好被切成了兩半,一半在第一頁頁腳,另一半在第二頁頁眉?

這不僅難看,還顯得非常不專業(yè)。今天,我們就來聊聊如何利用 openpyxl 中的 Break 對象,精準(zhǔn)控制分頁,讓你的報(bào)表“指哪打哪”。

核心原理:手動管理分頁符

Excel 本身是基于單元格(Grid)流式布局的,圖片是懸浮在單元格之上的層(Layer)。默認(rèn)情況下,Excel 的自動分頁邏輯只看單元格高度,完全不管上面有沒有壓著圖片。

要解決這個(gè)問題,我們需要“強(qiáng)行”告訴 Excel:“這里不僅是圖片結(jié)束的地方,也是這一頁結(jié)束的地方。”

這就需要用到 openpyxl.worksheet.pagebreak.Break

簡單來說,我們的策略是:在插入圖片之前和之后,分別插入一個(gè) Row Break(行分頁符),給圖片劃定一個(gè)獨(dú)立的“安全區(qū)”。

實(shí)戰(zhàn)代碼

我們需要用到 openpyxl 庫。如果你還沒有安裝,請執(zhí)行:

pip install openpyxl pillow

1. 基礎(chǔ)實(shí)現(xiàn):不跨頁的核心邏輯

下面的代碼演示了如何在一個(gè) Excel 中插入圖片,并確保每張圖片都獨(dú)占一頁(或者至少保證圖片頭部是從新的一頁開始)。

from openpyxl import Workbook
from openpyxl.drawing.image import Image
from openpyxl.worksheet.pagebreak import Break
from openpyxl.utils import get_column_letter

def create_pdf_friendly_report():
    wb = Workbook()
    ws = wb.active
    ws.title = "圖片不跨頁示例"

    # 假設(shè)我們有一組圖片路徑
    image_paths = ["chart1.png", "chart2.png", "chart3.png"] # 請確保目錄下有這些圖片,或替換為實(shí)際路徑
    
    current_row = 1
    
    for idx, img_path in enumerate(image_paths):
        try:
            img = Image(img_path)
        except FileNotFoundError:
            print(f"找不到圖片: {img_path},跳過")
            continue

        # --- 核心步驟 1: 插入前置分頁符 (Before Break) ---
        # 如果不是第一張圖,我們在圖片開始前強(qiáng)制換頁,保證圖片從頁首開始
        if idx > 0:
            # 注意:Break 的 id 對應(yīng)的是行索引。
            # 在 current_row - 1 處打斷,意味著 current_row 將是新的一頁的開始
            page_break = Break(id=current_row - 1)
            ws.row_breaks.append(page_break)

        # --- 步驟 2: 放置圖片 ---
        # 定位單元格,例如 A1, A20, A40...
        cell_location = f"A{current_row}"
        ws.add_image(img, cell_location)
        
        # 添加一些描述文字(可選)
        ws[cell_location] = f"圖表 {idx + 1}: 銷售數(shù)據(jù)分析"

        # --- 步驟 3: 計(jì)算圖片占用的行數(shù) ---
        # 這是一個(gè)估算。Excel默認(rèn)行高約 15 像素(20 units)。
        # 我們需要根據(jù)圖片高度計(jì)算它大概跨越了多少行,以便更新 current_row
        # img.height 是像素值
        rows_to_skip = int(img.height / 20) + 2 # +2 是留一點(diǎn)余量
        
        # --- 核心步驟 4: 插入后置分頁符 (After Break) ---
        # 計(jì)算圖片結(jié)束的行
        end_row = current_row + rows_to_skip
        
        # 在圖片結(jié)束后強(qiáng)制換頁(如果你希望一頁只有一張圖)
        # 如果你希望緊接著放文字,這步可以省略,只依賴“前置分頁符”即可
        break_after = Break(id=end_row)
        ws.row_breaks.append(break_after)

        # 更新下一張圖的起始位置
        current_row = end_row + 1

    # 保存結(jié)果
    wb.save("完美分頁報(bào)表.xlsx")
    print("Excel 生成完畢,請打開打印預(yù)覽查看分頁效果。")

if __name__ == "__main__":
    # 為了演示,請先準(zhǔn)備幾張名為 chart1.png 等的圖片,或者修改代碼中的路徑
    create_pdf_friendly_report()

2. 代碼解析

1.from openpyxl.worksheet.pagebreak import Break: 這是主角。它是 OpenPyxl 用來標(biāo)記分頁符的類。

2.ws.row_breaks.append(...): 工作表對象有一個(gè) row_breaks 列表。我們將創(chuàng)建好的 Break 對象添加進(jìn)去即可。

注意: 還有一個(gè) col_breaks,那是用于橫向分頁的(列寬不夠時(shí)),但處理圖片跨頁通常使用的是行分頁。

3.Break(id=row_index): 這里的 id 是關(guān)鍵。

OpenPyxl 的邏輯是:當(dāng)你把 id 設(shè)為 10,Excel 會在第 10 行之后不僅是一條分界線,第 11 行將成為下一頁的第一行。

進(jìn)階技巧:動態(tài)計(jì)算與流式布局

上面的代碼是“一頁一張圖”的暴力解法。如果你希望文字和圖片混排,僅在圖片即將跨頁時(shí)才插入分頁符,該怎么辦?

這就需要計(jì)算“當(dāng)前頁剩余高度”。但這在純 Python 端很難精確做到,因?yàn)?Excel 的渲染受打印機(jī)驅(qū)動、頁邊距設(shè)置影響很大。

推薦的工程化方案:

不要去計(jì)算“能不能塞得下”,而是防御性分頁。

  • 策略:將“標(biāo)題 + 圖片 + 圖片說明”視為一個(gè)原子塊(Block)。
  • 操作:在這個(gè)原子塊開始之前,無條件插入一個(gè) Break(除非它是文檔的開頭)。雖然這可能會導(dǎo)致上一頁留有較多空白,但它能 100% 保證圖片完整展示。
def insert_atomic_block(ws, img_path, title, start_row):
    """
    插入一個(gè)原子塊,并強(qiáng)制在塊之前分頁
    """
    # 1. 強(qiáng)制分頁(開啟新的一頁)
    if start_row > 1:
        ws.row_breaks.append(Break(id=start_row - 1))
    
    # 2. 寫入標(biāo)題
    ws.cell(row=start_row, column=1, value=title)
    
    # 3. 插入圖片
    img = Image(img_path)
    ws.add_image(img, f"A{start_row + 1}")
    
    # 4. 返回下一個(gè)可用的行號
    # 估算高度:標(biāo)題1行 + 圖片高度/20 + 余量
    height_rows = 1 + int(img.height / 20) + 2
    return start_row + height_rows

總結(jié)

利用 openpyxl.worksheet.pagebreak.Break,我們不再是被動接受 Excel 的默認(rèn)打印行為,而是掌握了主動權(quán)。

  • 原理Break(id=row) 也是對象,添加到 ws.row_breaks 列表。
  • 技巧:在圖片插入前及插入后計(jì)算出的位置,分別通過代碼插入分頁符。
  • 效果:生成的 Excel 在打印預(yù)覽或?qū)С?PDF 時(shí),圖片將擁有獨(dú)立且完整的頁面空間。

下次做自動化報(bào)表時(shí),加上這幾行代碼,讓你的交付成果更加專業(yè)!

到此這篇關(guān)于Python基于OpenPyxl實(shí)現(xiàn)Excel轉(zhuǎn)PDF并精準(zhǔn)控制分頁的文章就介紹到這了,更多相關(guān)Python Excel轉(zhuǎn)PDF內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • python讀寫自定義格式的pcd文件的示例代碼

    python讀寫自定義格式的pcd文件的示例代碼

    這篇文章主要介紹了python讀寫自定義格式的pcd文件,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下
    2023-07-07
  • C++實(shí)現(xiàn)將文件保存到指定磁盤路徑的完整指南

    C++實(shí)現(xiàn)將文件保存到指定磁盤路徑的完整指南

    在C++編程中,文件操作是常見的需求之一,本文將深入探討如何使用std::ofstream將文件保存到特定的磁盤路徑,特別是D盤,并分析各種路徑表示方法的優(yōu)缺點(diǎn),希望對大家有所幫助
    2025-12-12
  • Pandas日期處理之生成工作日與節(jié)假日

    Pandas日期處理之生成工作日與節(jié)假日

    Python中的Pandas 提供了許多日期處理功能,使得處理時(shí)間序列數(shù)據(jù)變得容易。本文將介紹如何使用 Pandas 生成工作日和節(jié)假日,感興趣的小伙伴可以收藏一下
    2023-05-05
  • pytorch邏輯回歸實(shí)現(xiàn)步驟詳解

    pytorch邏輯回歸實(shí)現(xiàn)步驟詳解

    這篇文章主要為大家詳細(xì)介紹了Pytorch實(shí)現(xiàn)邏輯回歸分類,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2022-10-10
  • pandas根據(jù)指定條件篩選數(shù)據(jù)的實(shí)現(xiàn)示例

    pandas根據(jù)指定條件篩選數(shù)據(jù)的實(shí)現(xiàn)示例

    條件篩選是pandas中非常重要的一個(gè)功能,它允許我們根據(jù)特定條件來快速、高效地篩選數(shù)據(jù),本文主要介紹了pandas根據(jù)指定條件篩選數(shù)據(jù)的實(shí)現(xiàn)示例,具有一定的參考價(jià)值,感興趣的可以了解一下
    2024-03-03
  • 安裝Python?3.13.1的多種方式實(shí)例教程

    安裝Python?3.13.1的多種方式實(shí)例教程

    Python是一種廣泛使用的高級編程語言,以其簡潔易讀的語法和強(qiáng)大的庫支持而著稱,這篇文章主要介紹了安裝Python?3.13.1的多種方式,文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2025-07-07
  • python實(shí)現(xiàn)電子詞典

    python實(shí)現(xiàn)電子詞典

    這篇文章主要為大家詳細(xì)介紹了python實(shí)現(xiàn)電子詞典的相關(guān)資料,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-03-03
  • 根據(jù)tensor的名字獲取變量的值方式

    根據(jù)tensor的名字獲取變量的值方式

    今天小編就為大家分享一篇根據(jù)tensor的名字獲取變量的值方式,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-01-01
  • Python圖形化界面基礎(chǔ)篇之如何使用彈出窗口和對話框

    Python圖形化界面基礎(chǔ)篇之如何使用彈出窗口和對話框

    對于Python程序員來說,處理彈出窗口似乎并不是一個(gè)常見的任務(wù),這篇文章主要給大家介紹了關(guān)于Python圖形化界面基礎(chǔ)篇之如何使用彈出窗口和對話框的相關(guān)資料,需要的朋友可以參考下
    2024-03-03
  • 使用pandas讀取csv文件的指定列方法

    使用pandas讀取csv文件的指定列方法

    下面小編就為大家分享一篇使用pandas讀取csv文件的指定列方法,具有很好的參考價(jià)值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2018-04-04

最新評論

安庆市| 依安县| 榆社县| 翼城县| 梁河县| 元氏县| 舒兰市| 通江县| 抚松县| 蕲春县| 德清县| 平江县| 昭苏县| 廉江市| 山东省| 扶风县| 桐城市| 竹溪县| 龙里县| 浦北县| 沽源县| 兴和县| 东台市| 太仆寺旗| 界首市| 惠来县| 清河县| 安多县| 九寨沟县| 清丰县| 安阳市| 卓资县| 库车县| 景洪市| 溧水县| 介休市| 县级市| 静安区| 巍山| 曲靖市| 东山县|