您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
# 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进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。