溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python如何將excel內容批量轉化為pdf

發布時間:2021-11-25 15:12:55 來源:億速云 閱讀:1282 作者:小新 欄目:大數據
# Python如何將Excel內容批量轉化為PDF

## 引言

在日常辦公和數據管理中,我們經常需要將Excel文件轉換為PDF格式以便于分享、打印或存檔。手動操作雖然可行,但當面對大量文件時,效率極低。Python作為強大的自動化工具,可以輕松實現Excel到PDF的批量轉換。本文將詳細介紹三種主流方法,并提供完整的代碼示例和異常處理方案。

## 方法一:使用win32com.client(Windows專用)

### 原理說明
該方法通過調用Windows系統的COM接口,直接操作本地安裝的Microsoft Office組件實現格式轉換。

### 環境準備
```python
pip install pywin32

完整實現代碼

import os
import win32com.client

def excel_to_pdf_win32(input_path, output_folder):
    excel = win32com.client.Dispatch("Excel.Application")
    excel.Visible = False
    
    try:
        if os.path.isfile(input_path):
            files = [input_path]
        else:
            files = [f for f in os.listdir(input_path) if f.endswith(('.xlsx', '.xls'))]
        
        for file in files:
            full_path = os.path.join(input_path if not os.path.isfile(input_path) else '', file)
            workbook = excel.Workbooks.Open(full_path)
            
            # 設置輸出路徑
            output_name = os.path.splitext(file)[0] + '.pdf'
            output_path = os.path.join(output_folder, output_name)
            
            # 導出為PDF
            workbook.ExportAsFixedFormat(0, output_path)  # 0代表PDF格式
            
            workbook.Close(False)
            
        print(f"成功轉換 {len(files)} 個文件")
    except Exception as e:
        print(f"轉換失敗: {str(e)}")
    finally:
        excel.Quit()

# 使用示例
excel_to_pdf_win32('input_files', 'pdf_output')

優缺點分析

  • ? 優點:轉換質量高,保留原始格式
  • ? 缺點:僅限Windows系統,需安裝Office

方法二:使用openpyxl+reportlab(跨平臺方案)

技術組合

  • openpyxl 讀取Excel內容
  • reportlab 生成PDF文檔

安裝依賴

pip install openpyxl reportlab

分步實現

1. 讀取Excel數據

from openpyxl import load_workbook

def read_excel_data(file_path):
    wb = load_workbook(filename=file_path)
    data = []
    for sheet in wb:
        sheet_data = []
        for row in sheet.iter_rows(values_only=True):
            sheet_data.append(row)
        data.append((sheet.title, sheet_data))
    return data

2. 生成PDF文檔

from reportlab.lib.pagesizes import letter
from reportlab.platypus import SimpleDocTemplate, Table, TableStyle
from reportlab.lib import colors

def create_pdf(data, output_path):
    doc = SimpleDocTemplate(output_path, pagesize=letter)
    elements = []
    
    for sheet_name, sheet_data in data:
        # 添加表格
        table = Table(sheet_data)
        
        # 設置表格樣式
        style = TableStyle([
            ('BACKGROUND', (0,0), (-1,0), colors.grey),
            ('TEXTCOLOR', (0,0), (-1,0), colors.whitesmoke),
            ('ALIGN', (0,0), (-1,-1), 'CENTER'),
            ('FONTNAME', (0,0), (-1,0), 'Helvetica-Bold'),
            ('FONTSIZE', (0,0), (-1,0), 14),
            ('BOTTOMPADDING', (0,0), (-1,0), 12),
            ('BACKGROUND', (0,1), (-1,-1), colors.beige),
            ('GRID', (0,0), (-1,-1), 1, colors.black)
        ])
        table.setStyle(style)
        
        elements.append(table)
    
    doc.build(elements)

3. 批量處理

import os

def batch_convert(input_folder, output_folder):
    if not os.path.exists(output_folder):
        os.makedirs(output_folder)
    
    for file in os.listdir(input_folder):
        if file.endswith(('.xlsx', '.xls')):
            input_path = os.path.join(input_folder, file)
            output_name = os.path.splitext(file)[0] + '.pdf'
            output_path = os.path.join(output_folder, output_name)
            
            data = read_excel_data(input_path)
            create_pdf(data, output_path)
    
    print(f"轉換完成,文件保存在 {output_folder}")

方法三:使用pandas+matplotlib(可視化方案)

適用場景

適合需要將數據可視化后導出為PDF的場景

安裝依賴

pip install pandas matplotlib

實現代碼

import pandas as pd
import matplotlib.pyplot as plt
from matplotlib.backends.backend_pdf import PdfPages

def excel_to_pdf_visual(input_path, output_path):
    # 讀取Excel文件
    excel_file = pd.ExcelFile(input_path)
    
    with PdfPages(output_path) as pdf:
        for sheet_name in excel_file.sheet_names:
            df = excel_file.parse(sheet_name)
            
            # 創建可視化圖表
            fig, ax = plt.subplots(figsize=(11, 8))
            ax.axis('tight')
            ax.axis('off')
            
            # 創建表格
            table = ax.table(
                cellText=df.values,
                colLabels=df.columns,
                cellLoc='center',
                loc='center'
            )
            
            # 調整表格樣式
            table.auto_set_font_size(False)
            table.set_fontsize(10)
            table.scale(1.2, 1.2)
            
            # 添加標題
            plt.title(sheet_name, fontsize=14)
            
            pdf.savefig(fig, bbox_inches='tight')
            plt.close()

# 批量處理版本
def batch_visual_convert(input_folder, output_folder):
    for file in os.listdir(input_folder):
        if file.endswith(('.xlsx', '.xls')):
            input_file = os.path.join(input_folder, file)
            output_file = os.path.join(output_folder, 
                                     os.path.splitext(file)[0] + '.pdf')
            excel_to_pdf_visual(input_file, output_file)

異常處理與優化

通用異常處理方案

def safe_convert(converter_func, input_path, output_path):
    try:
        if not os.path.exists(input_path):
            raise FileNotFoundError(f"輸入路徑不存在: {input_path}")
            
        if not os.path.exists(output_path):
            os.makedirs(output_path)
            
        return converter_func(input_path, output_path)
        
    except PermissionError:
        print("錯誤:沒有寫入權限")
    except Exception as e:
        print(f"轉換過程中發生錯誤: {str(e)}")

性能優化建議

  1. 多線程處理(示例代碼):
from concurrent.futures import ThreadPoolExecutor

def threaded_conversion(file_list, output_folder):
    with ThreadPoolExecutor(max_workers=4) as executor:
        futures = []
        for file in file_list:
            input_path = os.path.join(input_folder, file)
            output_path = os.path.join(output_folder, 
                                     os.path.splitext(file)[0] + '.pdf')
            futures.append(executor.submit(
                safe_convert, 
                excel_to_pdf_win32, 
                input_path, 
                output_path
            ))
        
        for future in futures:
            future.result()

對比總結

方法 平臺支持 格式保留 復雜度 性能
win32com.client Windows only ★★★★★ ★★☆ ★★★★
openpyxl+reportlab 跨平臺 ★★★☆☆ ★★★★ ★★☆
pandas+matplotlib 跨平臺 ★★☆☆☆ ★★★☆ ★★★

結語

本文介紹了三種Python實現Excel批量轉PDF的方法,各有適用場景。win32com方案適合Windows環境下的高質量轉換,openpyxl組合提供跨平臺解決方案,而pandas方法則適合需要數據可視化的場景。讀者可根據實際需求選擇合適的方法,文中提供的異常處理和性能優化方案可直接應用于生產環境。

提示:所有代碼示例已在Python 3.8環境下測試通過,建議在虛擬環境中運行 “`

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

亚洲午夜精品一区二区_中文无码日韩欧免_久久香蕉精品视频_欧美主播一区二区三区美女