چگونه فایل های Excel را به PDF در .NET تبدیل کنیم
این مقاله نشان می دهد که چگونه به اتصال تبدیل چند فایل اکسل به PDF با استفاده از Aspose.Cells LowCode PDF Converter در برنامه های .NET. این تبدیل PDF ارائه یک رویکرد دقیق به تبدیل اسناد بدون نیاز به کدگذاری گسترده و یا دانش عمیق از ساختارهای داخلی اکسل - ایده آل برای تجزیه و تحلیلگران کسب و کار و توسعه دهندگان گزارش که باید به طور خودکار جریان کار گزارش خود را.
مشکل دنیای واقعی
در محیط های کسب و کار، تیم های گزارشگر اغلب نیاز به تبدیل ده ها یا حتی صدها کتاب کار اکسل به فرمت PDF به طور منظم. انجام این کار به صورت دستی زمان می برد، خطا می کند، و منابع ارزشمند را از وظایف تجزیه و تحلیل مهم تر جدا می شود. علاوه بر این، اطمینان حاصل شود که فرآیند و طرح سازگار در سراسر تمام گزارش ها در هنگام تبدیل فایل های فردی چالش برانگیز است.
بررسی راه حل
با استفاده از Aspose.Cells LowCode PDF Converter، ما می توانیم این چالش را به طور موثر با کد حداقل حل کنیم.این راه حل ایده آل برای تجزیه و تحلیلگران کسب و کار و توسعه دهندگان گزارش است که نیاز به ساده سازی فرآیندهای گزارشگری خود، اطمینان از سازگاری در سراسر اسناد و صرفه جویی در زمان برای کار ارزشمندتر دارند. رویکرد ما بر ایجاد یک سیستم پردازش بسته قوی تمرکز خواهد کرد که می تواند حجم زیادی از فایل های اکسل را با تنظیمات تبدیل سفارشی مدیریت کند.
پیش شرط
قبل از راه حل، مطمئن شوید که:
- Visual Studio 2019 یا بالاتر
- .NET 6.0 یا بالاتر (متوافق با .Net Framework 4.6.2+)
- Aspose.Cells برای بسته .NET نصب شده از طریق NuGet
- آشنایی با برنامه نویسی C#
PM> Install-Package Aspose.Cells
پیاده سازی گام به گام
مرحله 1: نصب و تنظیم Aspose.Cells
بسته Aspose.Cells را به پروژه خود اضافه کنید و فضاهای نامی مورد نیاز را شامل کنید:
using Aspose.Cells;
using Aspose.Cells.LowCode;
using System;
using System.IO;
using System.Collections.Generic;
using System.Threading.Tasks;
مرحله 2: ایجاد یک ساختار دایرکتوری برای پردازش بسته بندی
ساختار دایرکتوری را برای سازماندهی فایل های ورودی Excel و خروجی PDF خود تنظیم کنید:
// Create directories if they don't exist
string inputDirectory = @"C:\Reports\ExcelFiles";
string outputDirectory = @"C:\Reports\PDFOutput";
string logDirectory = @"C:\Reports\Logs";
Directory.CreateDirectory(inputDirectory);
Directory.CreateDirectory(outputDirectory);
Directory.CreateDirectory(logDirectory);
مرحله 3: اجرای File Discovery Logic
یک روش برای کشف تمام فایل های Excel که نیاز به تبدیل دارند ایجاد کنید:
private List<string> GetExcelFilesToProcess(string directoryPath, string searchPattern = "*.xlsx")
{
List<string> excelFiles = new List<string>();
try
{
// Get all Excel files (.xlsx) in the directory
string[] files = Directory.GetFiles(directoryPath, searchPattern);
excelFiles.AddRange(files);
// Optionally, you can also search for .xls files
string[] oldFormatFiles = Directory.GetFiles(directoryPath, "*.xls");
excelFiles.AddRange(oldFormatFiles);
Console.WriteLine($"Found {excelFiles.Count} Excel files to process.");
}
catch (Exception ex)
{
Console.WriteLine($"Error searching for Excel files: {ex.Message}");
}
return excelFiles;
}
مرحله 4: تنظیم گزینه های PDF Converter
یک روش برای تنظیم گزینه های تبدیل PDF برای خروجی منسجم ایجاد کنید:
private LowCodePdfSaveOptions ConfigurePdfOptions(bool onePagePerSheet = true,
bool includeHiddenSheets = false,
bool printComments = false)
{
// Create PDF save options
PdfSaveOptions pdfOpts = new PdfSaveOptions();
// Set whether each worksheet should be rendered as a separate page
pdfOpts.OnePagePerSheet = onePagePerSheet;
// Option to include hidden worksheets in the output
pdfOpts.AllColumnsInOnePagePerSheet = true;
// Configure additional PDF options
pdfOpts.Compliance = PdfCompliance.PdfA1b; // For archival quality
pdfOpts.PrintingPageType = PrintingPageType.ActualSize;
// Configure comment display options
pdfOpts.PrintComments = printComments ? PrintCommentsType.PrintInPlace : PrintCommentsType.PrintNoComments;
// Create low code PDF save options
LowCodePdfSaveOptions lcsopts = new LowCodePdfSaveOptions();
lcsopts.PdfOptions = pdfOpts;
return lcsopts;
}
مرحله 5: اجرای منطق تبدیل فایل تک
یک روش برای تبدیل یک فایل Excel به PDF ایجاد کنید:
private bool ConvertExcelToPdf(string inputFilePath, string outputFilePath, LowCodePdfSaveOptions pdfOptions)
{
try
{
// Create load options
LowCodeLoadOptions loadOptions = new LowCodeLoadOptions();
loadOptions.InputFile = inputFilePath;
// Set output file path
pdfOptions.OutputFile = outputFilePath;
// Process the conversion
PdfConverter.Process(loadOptions, pdfOptions);
return true;
}
catch (Exception ex)
{
Console.WriteLine($"Error converting {Path.GetFileName(inputFilePath)}: {ex.Message}");
return false;
}
}
مرحله 6: پیاده سازی منطق پردازش باتچ
اکنون روش اصلی را ایجاد کنید که چندین فایل را پردازش می کند:
public void BatchConvertExcelToPdf(string inputDirectory, string outputDirectory, string searchPattern = "*.xlsx")
{
// Get all Excel files
List<string> excelFiles = GetExcelFilesToProcess(inputDirectory, searchPattern);
// Configure PDF options
LowCodePdfSaveOptions pdfOptions = ConfigurePdfOptions(true, false, false);
// Track conversion statistics
int successCount = 0;
int failureCount = 0;
// Process each file
foreach (string excelFile in excelFiles)
{
string fileName = Path.GetFileNameWithoutExtension(excelFile);
string outputFilePath = Path.Combine(outputDirectory, $"{fileName}.pdf");
Console.WriteLine($"Converting: {fileName}");
bool success = ConvertExcelToPdf(excelFile, outputFilePath, pdfOptions);
if (success)
{
successCount++;
Console.WriteLine($"Successfully converted: {fileName}");
}
else
{
failureCount++;
Console.WriteLine($"Failed to convert: {fileName}");
}
}
// Report summary
Console.WriteLine("\n===== Conversion Summary =====");
Console.WriteLine($"Total files processed: {excelFiles.Count}");
Console.WriteLine($"Successfully converted: {successCount}");
Console.WriteLine($"Failed conversions: {failureCount}");
}
مرحله 7: پیاده سازی پردازش موازی برای عملکرد بهتر
برای بسته های بزرگ، پردازش موازی را برای سرعت بخشیدن به تبدیل انجام دهید:
public void ParallelBatchConvertExcelToPdf(string inputDirectory, string outputDirectory, string searchPattern = "*.xlsx")
{
// Get all Excel files
List<string> excelFiles = GetExcelFilesToProcess(inputDirectory, searchPattern);
// Track conversion statistics
int successCount = 0;
int failureCount = 0;
object lockObj = new object();
// Configure PDF options (will be reused for each conversion)
LowCodePdfSaveOptions pdfOptions = ConfigurePdfOptions(true, false, false);
// Process files in parallel
Parallel.ForEach(excelFiles,
new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount },
excelFile =>
{
string fileName = Path.GetFileNameWithoutExtension(excelFile);
string outputFilePath = Path.Combine(outputDirectory, $"{fileName}.pdf");
// Each thread needs its own copy of the options
LowCodePdfSaveOptions threadPdfOptions = ConfigurePdfOptions(true, false, false);
threadPdfOptions.OutputFile = outputFilePath;
Console.WriteLine($"Converting: {fileName}");
// Create load options
LowCodeLoadOptions loadOptions = new LowCodeLoadOptions();
loadOptions.InputFile = excelFile;
try
{
// Process the conversion
PdfConverter.Process(loadOptions, threadPdfOptions);
lock (lockObj)
{
successCount++;
Console.WriteLine($"Successfully converted: {fileName}");
}
}
catch (Exception ex)
{
lock (lockObj)
{
failureCount++;
Console.WriteLine($"Failed to convert {fileName}: {ex.Message}");
}
}
});
// Report summary
Console.WriteLine("\n===== Conversion Summary =====");
Console.WriteLine($"Total files processed: {excelFiles.Count}");
Console.WriteLine($"Successfully converted: {successCount}");
Console.WriteLine($"Failed conversions: {failureCount}");
}
مرحله هشتم: نمونه کامل
در اینجا یک نمونه کامل از کار است که نشان دهنده کل فرآیند تبدیل بسته:
using Aspose.Cells;
using Aspose.Cells.LowCode;
using System;
using System.Collections.Generic;
using System.IO;
using System.Threading.Tasks;
namespace ExcelBatchConverter
{
public class ExcelToPdfBatchConverter
{
private readonly string _inputDirectory;
private readonly string _outputDirectory;
private readonly string _logDirectory;
public ExcelToPdfBatchConverter(string inputDirectory, string outputDirectory, string logDirectory)
{
_inputDirectory = inputDirectory;
_outputDirectory = outputDirectory;
_logDirectory = logDirectory;
// Ensure directories exist
Directory.CreateDirectory(_inputDirectory);
Directory.CreateDirectory(_outputDirectory);
Directory.CreateDirectory(_logDirectory);
}
// Log the conversion activity
private void LogConversion(string message)
{
string logFilePath = Path.Combine(_logDirectory, $"ConversionLog_{DateTime.Now.ToString("yyyyMMdd")}.txt");
string logEntry = $"[{DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss")}] {message}";
try
{
File.AppendAllText(logFilePath, logEntry + Environment.NewLine);
}
catch (Exception ex)
{
Console.WriteLine($"Warning: Unable to write to log file: {ex.Message}");
}
Console.WriteLine(logEntry);
}
// Get all Excel files to process
private List<string> GetExcelFilesToProcess(string searchPattern = "*.xlsx")
{
List<string> excelFiles = new List<string>();
try
{
// Get all Excel files in the directory
excelFiles.AddRange(Directory.GetFiles(_inputDirectory, "*.xlsx"));
excelFiles.AddRange(Directory.GetFiles(_inputDirectory, "*.xls"));
excelFiles.AddRange(Directory.GetFiles(_inputDirectory, "*.xlsm"));
LogConversion($"Found {excelFiles.Count} Excel files to process.");
}
catch (Exception ex)
{
LogConversion($"Error searching for Excel files: {ex.Message}");
}
return excelFiles;
}
// Configure PDF conversion options
private LowCodePdfSaveOptions ConfigurePdfOptions()
{
// Create PDF save options
PdfSaveOptions pdfOpts = new PdfSaveOptions();
// Set whether each worksheet should be rendered as a separate page
pdfOpts.OnePagePerSheet = true;
// Set additional PDF options
pdfOpts.Compliance = PdfCompliance.PdfA1b; // For archival quality
pdfOpts.AllColumnsInOnePagePerSheet = true;
// Create low code PDF save options
LowCodePdfSaveOptions lcsopts = new LowCodePdfSaveOptions();
lcsopts.PdfOptions = pdfOpts;
return lcsopts;
}
// Process all Excel files in the input directory
public void ProcessAllFiles(bool useParallelProcessing = true)
{
LogConversion("Starting batch conversion process...");
List<string> excelFiles = GetExcelFilesToProcess();
if (excelFiles.Count == 0)
{
LogConversion("No Excel files found to process.");
return;
}
// Conversion statistics
int successCount = 0;
int failureCount = 0;
if (useParallelProcessing)
{
// For thread safety with parallel processing
object lockObj = new object();
// Process files in parallel
Parallel.ForEach(excelFiles,
new ParallelOptions { MaxDegreeOfParallelism = Environment.ProcessorCount },
excelFile =>
{
string fileName = Path.GetFileNameWithoutExtension(excelFile);
string outputFilePath = Path.Combine(_outputDirectory, $"{fileName}.pdf");
try
{
// Create load options for this file
LowCodeLoadOptions loadOptions = new LowCodeLoadOptions();
loadOptions.InputFile = excelFile;
// Configure PDF options for this file
LowCodePdfSaveOptions pdfOptions = ConfigurePdfOptions();
pdfOptions.OutputFile = outputFilePath;
// Process the conversion
PdfConverter.Process(loadOptions, pdfOptions);
lock (lockObj)
{
successCount++;
LogConversion($"Successfully converted: {fileName}");
}
}
catch (Exception ex)
{
lock (lockObj)
{
failureCount++;
LogConversion($"Failed to convert {fileName}: {ex.Message}");
}
}
});
}
else
{
// Process files sequentially
foreach (string excelFile in excelFiles)
{
string fileName = Path.GetFileNameWithoutExtension(excelFile);
string outputFilePath = Path.Combine(_outputDirectory, $"{fileName}.pdf");
try
{
// Create load options for this file
LowCodeLoadOptions loadOptions = new LowCodeLoadOptions();
loadOptions.InputFile = excelFile;
// Configure PDF options for this file
LowCodePdfSaveOptions pdfOptions = ConfigurePdfOptions();
pdfOptions.OutputFile = outputFilePath;
// Process the conversion
PdfConverter.Process(loadOptions, pdfOptions);
successCount++;
LogConversion($"Successfully converted: {fileName}");
}
catch (Exception ex)
{
failureCount++;
LogConversion($"Failed to convert {fileName}: {ex.Message}");
}
}
}
// Report summary
LogConversion("\n===== Conversion Summary =====");
LogConversion($"Total files processed: {excelFiles.Count}");
LogConversion($"Successfully converted: {successCount}");
LogConversion($"Failed conversions: {failureCount}");
LogConversion("Batch conversion process completed.");
}
}
class Program
{
static void Main(string[] args)
{
// Define directory paths
string inputDirectory = @"C:\Reports\ExcelFiles";
string outputDirectory = @"C:\Reports\PDFOutput";
string logDirectory = @"C:\Reports\Logs";
// Create and run the converter
ExcelToPdfBatchConverter converter = new ExcelToPdfBatchConverter(
inputDirectory, outputDirectory, logDirectory);
// Process all files (using parallel processing)
converter.ProcessAllFiles(true);
Console.WriteLine("Process completed. Press any key to exit.");
Console.ReadKey();
}
}
}
استفاده از موارد و برنامه ها
سیستم های گزارشگری شرکت ها
در سیستم های گزارشگری مالی، چرخه های پایان ماه یا سه ماهه اغلب نیاز به تبدیل بسیاری از گزارش های مبتنی بر اکسل به فرمت PDF برای توزیع به ذینفعان. این راه حل تبدیل بسته اجازه می دهد تا توسعه دهندگان گزارش به اتوماسیون فرآیند، اطمینان حاصل شود که تمام گزارش ها با تنظیمات سازگار و قالب سازی تبدیل می شود، در حالی که به طور چشمگیری کاهش تلاش دستی.
اداره پردازش داده ها
تجزیه و تحلیلگران کسب و کار که داده های مبتنی بر اکسل را از بخش های متعدد جمع آوری می کنند می توانند از این راه حل برای استاندارد سازی و آرشیو ارسال ها استفاده کنند.با تبدیل خودکار کتاب های کاری دریافت شده به PDF، آنها یک سوابق دائمی از ارسال داده ها را ایجاد می کند در حالی که اطلاعات را قابل به اشتراک گذاشتن با ذینفعان که Excel ندارند.
مدیریت مستندات به صورت اتوماتیک
این راه حل می تواند به عنوان بخشی از یک جریان کار بزرگ تر اجرا شود که فایل های جدید اکسل را جمع آوری می کند، آنها را به PDF تبدیل کرده و پس از آن به ذخایر مستند مناسب با متا داده های مناسب هدایت می شود.
چالش ها و راه حل های مشترک
چالش 1: مدیریت فایل های اکسل با حفاظت از رمز عبور
** راه حل:** گزینه های بار را تغییر دهید تا مدیریت رمز عبور شامل شود:
// For password-protected Excel files
LowCodeLoadOptions loadOptions = new LowCodeLoadOptions();
loadOptions.InputFile = excelFile;
loadOptions.Password = "YourPassword"; // Supply the password
// Then proceed with conversion as normal
PdfConverter.Process(loadOptions, pdfOptions);
چالش 2: حفظ فرمت اکسل در خروجی PDF
** راه حل:** اطمینان حاصل کنید که گزینه های PDF به درستی تنظیم شده اند تا فرمت را حفظ کنند:
PdfSaveOptions pdfOpts = new PdfSaveOptions();
pdfOpts.OnePagePerSheet = true;
pdfOpts.PrintingPageType = PrintingPageType.ActualSize;
pdfOpts.DefaultFontName = "Arial"; // Specify a fallback font
pdfOpts.Compliance = PdfCompliance.PdfA1b; // For archival quality
چالش 3: مدیریت فایل های بسیار بزرگ اکسل
** راه حل:** برای فایل های بسیار بزرگ، بهینه سازی حافظه را اجرا کنید:
LowCodeLoadOptions loadOptions = new LowCodeLoadOptions();
loadOptions.InputFile = largeExcelFile;
loadOptions.MemorySetting = MemorySetting.MemoryPreference; // Optimize for memory usage
// Consider file-specific optimizations
PdfSaveOptions pdfOpts = new PdfSaveOptions();
pdfOpts.OptimizationType = OptimizationType.MinimumSize;
بررسی عملکرد
- برای عملکرد مطلوب با بسته های بزرگ، از رویکرد پردازش موازی با یک روش معقول استفاده کنید.
MaxDegreeOfParallelism
بر اساس قابلیت های سرور شما - در نظر گرفتن پردازش فایل ها در بسته های کوچکتر هنگام برخورد با کتاب های کار بسیار بزرگ اکسل برای جلوگیری از فشار حافظه
- اجرای مکانیزم نظارت برای ردیابی پیشرفت تبدیل و استفاده از منابع
- برای فرستادن تولید، در نظر داشته باشید که فرآیند تبدیل را در یک سرور اختصاص داده شده یا در ساعات خارج از پکن اجرا کنید.
بهترین شیوهها
- پیش تایید فایل های اکسل قبل از پردازش بسته برای شناسایی مشکلات بالقوه
- استفاده از مدیریت خطای قوی برای اطمینان از این که فرآیند در صورت شکست یک فایل متوقف نمی شود
- ** ایجاد سوابق دقیق** از فرآیند تبدیل برای حل مشکلات و حسابرسی
- نمایش فایل های خروجی در یک سلسله مراتب پوشه ساختاری برای مدیریت آسان تر
- نمایش یک سیستم نظارت که مدیران را از شکست های تبدیل هشدار می دهد
- تست با انواع مختلف فایل های اکسل (XLSX، XLS و XLSM) برای اطمینان از سازگاری
سناریوهای پیشرفته
برای نیازهای پیچیده تر، این پیاده سازی های پیشرفته را در نظر بگیرید:
سناریو 1: نام PDF سفارشی بر اساس محتوای سلول اکسل
شما می توانید مقدار خاصی از سلول ها را برای استفاده در نام فایل PDF استخراج کنید:
// Advanced naming based on cell content
private string GetCustomPdfName(string excelFilePath)
{
try
{
// Load the workbook
Workbook workbook = new Workbook(excelFilePath);
// Get report date from cell A1
string reportDate = workbook.Worksheets[0].Cells["A1"].StringValue;
// Get report type from cell B1
string reportType = workbook.Worksheets[0].Cells["B1"].StringValue;
// Create a custom name
string customName = $"{reportType}_{reportDate}";
// Sanitize the filename
foreach (char invalidChar in Path.GetInvalidFileNameChars())
{
customName = customName.Replace(invalidChar, '_');
}
return customName + ".pdf";
}
catch
{
// Fallback to default naming if extraction fails
return Path.GetFileNameWithoutExtension(excelFilePath) + ".pdf";
}
}
سناریو ۲: تبدیل برگ انتخابی
تبدیل فقط صفحات خاص از هر فایل اکسل:
// Configure PDF options to convert only specific sheets
private LowCodePdfSaveOptions ConfigureSelectiveSheetsOptions(string[] sheetNames)
{
PdfSaveOptions pdfOpts = new PdfSaveOptions();
pdfOpts.OnePagePerSheet = true;
// Create a worksheet name collection for selective conversion
WorksheetCollection worksheets = new WorksheetCollection();
foreach (string sheetName in sheetNames)
{
worksheets.Add(sheetName);
}
// Set sheet selection
SheetOptions sheetOptions = new SheetOptions();
sheetOptions.SheetNames = worksheets;
pdfOpts.SheetOptions = sheetOptions;
// Create low code PDF save options
LowCodePdfSaveOptions lcsopts = new LowCodePdfSaveOptions();
lcsopts.PdfOptions = pdfOpts;
return lcsopts;
}
نتیجه گیری
با پیاده سازی Aspose.Cells LowCode PDF Converter برای پردازش بسته، تحلیلگران کسب و کار و توسعه دهندگان گزارش می توانند زمان صرف شده بر روی دستورالعمل Excel به تبدیل PDF را به طور چشمگیری کاهش دهند. این رویکرد به میزان قابل توجهی بهره وری را بهبود می بخشد و هماهنگی را در سراسر تمام PDF های تولید شده در حالی که حفظ کیفیت و فرمت فایل های اصلی Excel تضمین می کند.
برای اطلاعات بیشتر و نمونه های بیشتر، به Aspose.Cells.LowCode API ارجاع .