溫馨提示×

溫馨提示×

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

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

C#將Excel轉為PDF時怎么自定義表格紙張大小

發布時間:2021-11-30 10:50:29 來源:億速云 閱讀:366 作者:iii 欄目:開發技術
# C#將Excel轉為PDF時怎么自定義表格紙張大小

## 引言

在企業級應用開發中,將Excel文檔轉換為PDF是常見的需求。然而,默認轉換往往無法滿足特定排版要求,尤其是當需要控制PDF的紙張大小時。本文將深入探討如何通過C#代碼在Excel轉PDF過程中自定義紙張尺寸,涵蓋主流技術方案和實際代碼示例。

---

## 一、技術方案選型

### 1. 主流轉換庫對比

| 技術方案           | 授權方式   | 紙張設置支持 | 代碼復雜度 |
|--------------------|------------|--------------|------------|
| Microsoft Office Interop | 免費(需安裝Office) | 完全支持 | 中等 |
| EPPlus             | 商業/開源  | 部分支持     | 較低       |
| Spire.XLS          | 商業       | 完全支持     | 低         |
| Aspose.Cells       | 商業       | 完全支持     | 低         |

### 2. 推薦方案
- **免費方案**:Office Interop + iTextSharp(適合已部署Office環境)
- **商業方案**:Spire.XLS(性價比高,API簡潔)

---

## 二、使用Office Interop實現

### 1. 環境準備
```csharp
// 添加引用
using Microsoft.Office.Interop.Excel;
using Microsoft.Office.Interop.Word; // 用于后期PDF轉換

2. 核心代碼實現

public void ConvertExcelToPdfWithCustomSize(string excelPath, string pdfPath, float width, float height)
{
    Application excelApp = new Application();
    Workbook workbook = excelApp.Workbooks.Open(excelPath);
    
    // 設置頁面布局
    foreach (Worksheet sheet in workbook.Worksheets)
    {
        // 設置為自定義紙張(以磅為單位,1磅=1/72英寸)
        sheet.PageSetup.PaperSize = XlPaperSize.xlPaperUser;
        sheet.PageSetup.Orientation = width > height ? 
            XlPageOrientation.xlLandscape : 
            XlPageOrientation.xlPortrait;
        
        // 轉換為厘米到磅(1厘米=28.35磅)
        sheet.PageSetup.PageWidth = width * 28.35f;
        sheet.PageSetup.PageHeight = height * 28.35f;
        
        // 設置邊距(可選)
        sheet.PageSetup.LeftMargin = excelApp.CentimetersToPoints(1.5f);
        sheet.PageSetup.RightMargin = excelApp.CentimetersToPoints(1.5f);
    }
    
    // 導出PDF
    workbook.ExportAsFixedFormat(
        XlFixedFormatType.xlTypePDF, 
        pdfPath,
        Quality: XlFixedFormatQuality.xlQualityStandard);
    
    workbook.Close(false);
    excelApp.Quit();
}

3. 注意事項

  • 需安裝Microsoft Office
  • 進程釋放問題:建議使用Marshal.ReleaseComObject()釋放COM對象
  • DPI設置:默認96DPI,可通過注冊表調整

三、使用Spire.XLS商業庫

1. 安裝NuGet包

Install-Package Spire.XLS

2. 完整示例代碼

using Spire.Xls;
using System.Drawing.Printing;

public void ConvertWithSpire(string excelPath, string pdfPath)
{
    Workbook workbook = new Workbook();
    workbook.LoadFromFile(excelPath);

    // 設置所有工作表
    foreach (Worksheet sheet in workbook.Worksheets)
    {
        // 自定義紙張大?。ê撩讍挝唬?        sheet.PageSetup.CustomPaperSizeName = "A3橫向";
        sheet.PageSetup.PaperSize = PaperKind.Custom;
        sheet.PageSetup.Orientation = PageOrientationType.Landscape;
        sheet.PageSetup.CustomWidth = 420;  // A3寬度420mm
        sheet.PageSetup.CustomHeight = 297; // A3高度297mm
        
        // 縮放設置
        sheet.PageSetup.FitToPagesWide = 1;
        sheet.PageSetup.FitToPagesTall = false;
    }

    // PDF導出選項
    PdfConverterSettings settings = new PdfConverterSettings();
    settings.JpegQuality = 90;
    settings.SheetFitToPage = true;
    
    workbook.SaveToFile(pdfPath, settings);
}

3. 高級配置項

// 設置PDF元數據
settings.DocumentProperties.Title = "財務報表";
settings.DocumentProperties.Subject = "2023年Q4報表";

// 嵌入字體
settings.EmbedFonts = true;

// 分頁控制
settings.SheetFitToPage = false;
settings.PdfPageSize = PdfPageSize.A4;

四、使用EPPlus+第三方PDF庫

1. 組合方案優勢

  • EPPlus處理Excel數據
  • iTextSharp/PdfSharp控制PDF輸出

2. 實現代碼片段

using OfficeOpenXml;
using PdfSharp.Pdf;
using PdfSharp.Drawing;

public void EpplusToPdf(string excelPath, string pdfPath)
{
    using (var package = new ExcelPackage(new FileInfo(excelPath)))
    {
        var worksheet = package.Workbook.Worksheets[0];
        
        // 創建PDF文檔
        PdfDocument document = new PdfDocument();
        PdfPage page = document.AddPage();
        page.Width = XUnit.FromMillimeter(300); // 自定義寬度
        page.Height = XUnit.FromMillimeter(200); // 自定義高度
        
        XGraphics gfx = XGraphics.FromPdfPage(page);
        XFont font = new XFont("Arial", 10);
        
        // 將Excel內容繪制到PDF(簡化示例)
        gfx.DrawString(worksheet.Cells["A1"].Text, font, 
                      XBrushes.Black, new XPoint(20, 20));
        
        document.Save(pdfPath);
    }
}

五、常見問題解決方案

1. 內容截斷問題

  • 原因:單元格內容超出紙張尺寸
  • 解決方案: “`csharp // 自動調整列寬 worksheet.Cells.AutoFitColumns();

// 或設置縮放比例 worksheet.PrinterSettings.FitToPage = true; worksheet.PrinterSettings.FitToHeight = 1;


### 2. 頁眉頁腳丟失
- 使用Interop時需顯式設置:
  ```csharp
  sheet.PageSetup.LeftHeader = "&\"Arial\"&10頁碼:&P";
  sheet.PageSetup.CenterFooter = "&D";

3. 跨平臺兼容性

  • Linux方案:使用LibreOffice無頭模式
    
    soffice --headless --convert-to pdf --outdir /output /input.xlsx
    

六、性能優化建議

  1. 批量處理:對于大量文件,使用Parallel.ForEach
  2. 內存管理:及時釋放COM對象
  3. 緩存重用:保持Excel應用實例單例
  4. 異步操作:對UI應用使用async/await
// 并行處理示例
Parallel.ForEach(fileList, file => {
    ConvertExcelToPdf(file, Path.ChangeExtension(file, ".pdf"));
});

結語

通過本文介紹的三種主要方案,開發者可以根據項目需求選擇最適合的Excel轉PDF方法。關鍵點在于: 1. 精確控制PageSetup相關屬性 2. 理解不同單位的換算關系(磅/英寸/毫米) 3. 處理特殊元素的轉換邏輯

對于企業級應用,建議使用Spire.XLS或Aspose等商業庫,它們在穩定性和功能完整性上更有保障。開源方案則更適合預算有限的小型項目。

附錄: - Excel單位換算表 - Spire.XLS官方文檔 “`

該文檔包含: 1. 詳細的技術方案對比 2. 三種實現方式的完整代碼示例 3. 實際開發中的問題解決方案 4. 性能優化建議 5. 標準的Markdown格式(代碼塊、表格等)

可根據實際需要調整技術細節或補充特定場景的實現方案。

向AI問一下細節

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

AI

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