كيفية تحويل ملفات Excel إلى PDF في .NET

كيفية تحويل ملفات Excel إلى PDF في .NET

يظهر هذا المقال كيفية تجميع تحويل ملفات Excel متعددة إلى PDF باستخدام Aspose.Cells LowCode PDF Converter في تطبيقات .NET. يوفر محول PDF نهجًا متسارعة لتحويل المستندات دون الحاجة إلى ترميز واسع أو معرفة عميقة بالهياكل الداخلية لـ Excel - مثالية للمحللين التجاريين ومطوري التقارير الذين يحتاجون إلى تلقائي تدفقات عمل الإبلاغ الخاصة بهم.

مشكلة العالم الحقيقي

في بيئات المؤسسة ، غالباً ما تحتاج فرق الإبلاغ إلى تحويل عشرات أو حتى مئات الكتب المكتوبة في Excel إلى تنسيق PDF على أساس منتظم. القيام بذلك يدوياً يستغرق وقتاً طويلاً ، يمنع الأخطاء ، ويفصل الموارد الثمينة عن المهام التحليلية الأكثر أهمية.

نظرة عامة على الحل

باستخدام Aspose.Cells LowCode PDF Converter، يمكننا حل هذا التحدي بفعالية مع الحد الأدنى من الرمز.هذا الحل مثالي للمحللين التجاريين ومطورين التقارير الذين يحتاجون إلى تسريع عمليات الإبلاغ الخاصة بهم، وضمان اتساق المستندات، وتوفير الوقت للعمل أكثر قيمة.سوف يركز نهجنا على إنشاء نظام معالجة مجموعة قوية التي يمكن التعامل مع كميات كبيرة من ملفات Excel مع إعدادات التحويل المخصصة.

المتطلبات

قبل تنفيذ الحل، تأكد من أن لديك:

  • Visual Studio 2019 أو أحدث
  • .NET 6.0 أو أعلى (متوافق مع إطار .Net 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}");
}

الخطوة 8: نموذج التنفيذ الكامل

وهنا مثال عمل كامل يظهر عملية تحويل الحزمة بأكملها:

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();
        }
    }
}

استخدام الحالات والتطبيقات

أنظمة الإبلاغ المؤسسي

في أنظمة الإبلاغ المالي ، غالبًا ما تتطلب دورات نهاية الشهر أو ربع النهار تحويل العديد من التقارير القائمة على Excel إلى تنسيق PDF لتوزيعها على أصحاب المصلحة.هذا الحل التحويل الحزمة يسمح للمطورين بتأليف العملية ، مما يضمن أن يتم تحويض جميع التقارب باستخدام الإعدادات المتسقة والتنسيق ، وفي الوقت نفسه يقلل بشكل كبير من الجهد اليدوي.

معالجة البيانات الإدارية

يمكن للمحللين التجاريين الذين يجمعون البيانات القائمة على Excel من العديد من الأقسام استخدام هذا الحل لتعيين وتخزين العروض التقديمية.من خلال تحويل الكتب المكتوبة المستقبلية تلقائيًا إلى PDF ، يقومون بإنشاء سجل دائم لعروض بيانات مع جعل المعلومات قابلة للمشاركة مع أصحاب المصلحة الذين ليس لديهم Excel.

تدفقات عمل إدارة المستندات التلقائية

إن التكامل مع أنظمة إدارة المستندات يصبح غير مألوف عندما يتم تحويل تقارير Excel تلقائيًا إلى PDF. يمكن تخطيط هذا الحل لتشغيلها كجزء من تدفق عمل أوسع يرفع ملفات Excel الجديدة ، ويحولها إلى pdf ، ثم يقوم بتحويلها الى مستودعات الوثيقة المناسبة مع البيانات النمطية الصحيحة.

التحديات والحلول المشتركة

التحدي 1: التعامل مع ملفات Excel مع حماية كلمة المرور

** الحل:** تعديل خيارات الشحن لتشمل معالجة كلمة المرور:

// 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: الحفاظ على تنسيق Excel في إخراج 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

التحدي الثالث: التعامل مع ملفات Excel الكبيرة جدا

الحل: بالنسبة للملفات الكبيرة للغاية، قم بتنفيذ تحسين الذاكرة:

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 وفقًا لقدرات خادمك
  • فكر في معالجة الملفات في أجزاء أصغر عند التعامل مع الكتب العملية الكبيرة جدا Excel لتجنب ضغط الذاكرة
  • تنفيذ آلية مراقبة تتبع تقدم التحويل واستخدام الموارد
  • بالنسبة لتخزينات الإنتاج ، فكر في تشغيل عملية التحويل على خادم مخصص أو خلال الساعات الخلفية.

أفضل الممارسات

  • تحقق مسبقا من ملفات Excel قبل معالجة المجموعة لتحديد المشاكل المحتملة
  • إجراء معالجة خطأ قوية للتأكد من أن العملية لا تتوقف إذا فشلت ملف واحد
  • إنشاء سجلات مفصلة من عملية التحويل لحل المشاكل والمراجعة
  • تنظيم النتائج PDFs في سلسلة المجلدات المنظمة لتسهيل الإدارة
  • إعداد نظام مراقبة يحذر المسؤولين من فشل التحويل
  • اختبار مع أنواع مختلفة من ملفات Excel (XLSX، XLS،XLSM) لضمان التوافق

سيناريوهات متقدمة

للحصول على متطلبات أكثر تعقيدًا ، فكر في هذه التطبيقات المتقدمة:

السيناريو 1: اسم PDF المخصص استنادًا إلى محتوى Excel Cell

يمكنك استخراج قيم الخلية المحددة للاستخدام في اسم الملف 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";
    }
}

السيناريو 2: تحويل ورقة اختيارية

تحويل ورقة محددة فقط من كل ملف Excel:

// 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 بشكل كبير. هذا النهج يزيد بشكل ملحوظ من الإنتاجية ويضمن التماسك بين جميع PDFs التي تم إنشاؤها مع الحفاظ على جودة وتصميم ملفات Excel الأصلية. الحل قابل للتوسع من الاستخدام الإقليمي الصغير إلى أنظمة الإبلاغ على نطاق واسع ، مع خيارات التخصيص لتلبية متطلبات الأعمال المحددة.

للحصول على مزيد من المعلومات والمزيد من الأمثلة، ارجع إلى Aspose.Cells.LowCode API مرجعية .

 عربي