C#将Excel转为PDF时怎么自定义表格纸张大小

发布时间:2021-11-30 10:50:29 作者:iii
来源:亿速云 阅读:363
# 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. 注意事项


三、使用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. 组合方案优势

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. 内容截断问题

// 或设置缩放比例 worksheet.PrinterSettings.FitToPage = true; worksheet.PrinterSettings.FitToHeight = 1;


### 2. 页眉页脚丢失
- 使用Interop时需显式设置:
  ```csharp
  sheet.PageSetup.LeftHeader = "&\"Arial\"&10页码:&P";
  sheet.PageSetup.CenterFooter = "&D";

3. 跨平台兼容性


六、性能优化建议

  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格式(代码块、表格等)

可根据实际需要调整技术细节或补充特定场景的实现方案。

推荐阅读:
  1. Java 将Excel转为PDF_基于Spire.Cloud.Excel
  2. C#中怎么将Excel转成PDF

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

excel pdf

上一篇:SQL Server高级函数的用法有哪些

下一篇:C/C++ Qt TreeWidget单层树形组件怎么应用

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》