# 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轉換
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();
}
Marshal.ReleaseComObject()
釋放COM對象Install-Package Spire.XLS
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);
}
// 設置PDF元數據
settings.DocumentProperties.Title = "財務報表";
settings.DocumentProperties.Subject = "2023年Q4報表";
// 嵌入字體
settings.EmbedFonts = true;
// 分頁控制
settings.SheetFitToPage = false;
settings.PdfPageSize = PdfPageSize.A4;
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);
}
}
// 或設置縮放比例 worksheet.PrinterSettings.FitToPage = true; worksheet.PrinterSettings.FitToHeight = 1;
### 2. 頁眉頁腳丟失
- 使用Interop時需顯式設置:
```csharp
sheet.PageSetup.LeftHeader = "&\"Arial\"&10頁碼:&P";
sheet.PageSetup.CenterFooter = "&D";
soffice --headless --convert-to pdf --outdir /output /input.xlsx
Parallel.ForEach
// 并行處理示例
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格式(代碼塊、表格等)
可根據實際需要調整技術細節或補充特定場景的實現方案。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。