Hoe om Excel-bestanden in PDF te converteren in .NET

Hoe om Excel-bestanden in PDF te converteren in .NET

In dit artikel wordt aangetoond hoe u meerdere Excel-bestanden in PDF kunt converteren met behulp van de Aspose.Cells LowCode PDF Converter in .NET-toepassingen.De PDF-converteraar biedt een soepele benadering van documentconversie zonder uitgebreide codering of diepgaand kennis van Excel interne structuren - ideaal voor zakelijke analisten en rapportageontwikkelaars die hun verslagwerkstromen moeten automatiseren.

Real-wereld probleem

In bedrijfsomgevingen moeten rapportage teams vaak tientallen of zelfs honderden Excel-werkboeken regelmatig in PDF-formaat omzetten. Dit handmatig doen is tijdverbruikend, fouten veroorzaakt en verwijdert waardevolle middelen van belangrijke analytische taken. Bovendien is het garanderen van consistente formatting en layout over alle rapporten uitdagend bij het converteren van bestanden individueel.

Overzicht oplossingen

Met behulp van Aspose.Cells LowCode PDF Converter, kunnen we deze uitdaging efficiënt oplossen met minimale code. Deze oplossing is ideaal voor zakelijke analisten en rapportageontwikkelaars die hun verslagprocessen moeten streamlineren, consistentheid in documenten te garanderen en tijd vrij te maken voor meer waardevolle werk. Onze benadering zal zich richten op het creëren van een robust batch verwerkingssysteem dat grote volumes Excel-bestanden kan beheren met aangepaste conversie-instellingen.

Voorwaarden

Voordat u de oplossing uitvoert, zorg ervoor dat u:

  • Visual Studio 2019 of later
  • .NET 6.0 of hoger (compatibel met .Net Framework 4.6.2+)
  • Aspose.Cells voor het .NET-pakket geïnstalleerd via NuGet
  • Basiskennis van C# programmering
PM> Install-Package Aspose.Cells

Stap voor stap implementatie

Stap 1: Installeren en configureren Aspose.Cells

Voeg het Aspose.Cells-pakket toe aan uw project en bevat de nodige naamruimten:

using Aspose.Cells;
using Aspose.Cells.LowCode;
using System;
using System.IO;
using System.Collections.Generic;
using System.Threading.Tasks;

Stap 2: Creëren van een Directory Structure voor Batch Processing

Stel een directory-structuur op om uw invoer Excel-bestanden en output PDF bestanden te organiseren:

// 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);

Stap 3: Implementatie File Discovery Logic

Creëer een methode om alle Excel-bestanden te ontdekken die moeten worden omgezet:

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

Stap 4: Configureer de PDF Converter-opties

Creëer een methode om de PDF-conversie-opties voor consistente output te instellen:

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

Stap 5: Het implementeren van een enkel bestand conversie logica

Creëer een methode om een enkele Excel-bestand naar PDF te converteren:

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

Stap 6: Implementatie Batch Processing Logic

Maak nu de belangrijkste methode die meerdere bestanden zal verwerken:

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

Stap 7: Het implementeren van parallelle verwerking voor betere prestaties

Voor grote sets wordt parallelle verwerking geïmplementeerd om de conversie te versnellen:

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

Stap 8: Complete implementatie voorbeeld

Hier is een complete werkende voorbeeld die het hele batch conversieproces demonstreert:

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

Gebruik Cases en Applicaties

Enterprise rapportage systemen

In financiële rapportage-systemen vereisen eind- of kwartaalcycli vaak het converteren van talrijke Excel-gebaseerde rapporten in PDF-formaat voor distributie aan belanghebbenden. Deze batch-conversie-oplossing stelt rapporteurs in staat om het proces te automatiseren, ervoor te zorgen dat alle rapports worden geconverteerd met consistente instellingen en formatting, terwijl dramatisch de handmatige inspanning vermindert.

Departmentale gegevensverwerking

Bedrijfsanalisten die Excel-gebaseerde gegevens van meerdere afdelingen verzamelen, kunnen deze oplossing gebruiken om subsidies te standaardiseren en te archiveren. Door automatisch ontvangen werkboeken in PDF te converteren, creëren ze een permanente record van submissies terwijl ze de informatie delen met belanghebbenden die geen Excel hebben.

Automatische documentbeheer Workflows

Integratie met documentbeheerssystemen wordt onbeleefd wanneer Excel-rapporten automatisch worden omgezet in PDF. Deze oplossing kan worden gepland om uit te voeren als onderdeel van een grotere workflow die nieuwe Excel bestanden opneemt, ze converteert naar PDF, en vervolgens hen riet naar de juiste document repositories met passende metadata. De consistente formatting en archiefkwaliteit PDF-uitgang zorgt voor de langetermijntoegang van zakelijke gegevens.

Gemeenschappelijke uitdagingen en oplossingen

Challenge 1: Het beheren van Excel-bestanden met wachtwoordbescherming

Oplossing: Wijzigen van de opties voor het opladen om de wachtwoordbehandeling in te voeren:

// 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);

Challenge 2: Worden Excel in PDF-uitput

Oplossing: Zorg ervoor dat de PDF-opties correct zijn geconfigureerd om de vormgeving te behouden:

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

Challenge 3: Het beheren van zeer grote Excel-bestanden

Solutie: Voor uiterst grote bestanden, implementeren geheugenoptimalisatie:

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;

Performance overwegingen

  • Voor optimale prestaties met grote sets, gebruik de parallelle verwerkingsmethode met een redelijke MaxDegreeOfParallelism Gebaseerd op de mogelijkheden van uw server
  • Overweeg het verwerken van bestanden in kleinere stukken bij het omgaan met zeer grote Excel-werkboeken om geheugendruk te vermijden
  • Het implementeren van een monitoringsmechanisme om de conversieprocedure en het gebruik van hulpbronnen te volgen
  • Voor productielocaties, overweeg het uitvoeren van het conversieproces op een toegewijde server of tijdens off-peak uur.

Beste praktijken

  • ** Voorvalideer Excel-bestanden** vóór de verwerking van de set om potentiële problemen te identificeren
  • Implementeren robuste foutbehandeling om ervoor te zorgen dat het proces niet stopt als een bestand faalt
  • ** Maak gedetailleerde logs** van het conversieproces voor probleemoplossing en audit
  • Organiseren van output PDF’s in een gestructureerde maphierarchie voor gemakkelijker beheer
  • Installeer een monitoringssysteem dat beheerders waarschuwt over conversiefouten
  • Test met verschillende Excel-bestandtypes (XLSX, XLS en XLSM) om compatibiliteit te garanderen

Geavanceerde scenario’s

Voor meer complexe vereisten, overweeg deze geavanceerde implementaties:

Scenario 1: aangepaste PDF-namen op basis van Excel Cell-inhoud

U kunt specifieke celwaarden extraheren om te gebruiken in de PDF-bestandnaam:

// 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";
    }
}

Scenario 2: Selectieve bladconversie

Converteer alleen specifieke bladeren uit elke Excel-bestand:

// 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;
}

Conclusie

Door het implementeren van Aspose.Cells LowCode PDF Converter voor de verwerking van de set, kunnen zakelijke analisten en rapportageontwikkelaars de tijd die wordt besteed aan manuele Excel-to-PDF-conversies dramatisch verminderen. Deze benadering verbetert de productiviteit aanzienlijk en garandeert consistentie over alle geproduceerde PDF’s terwijl de kwaliteit en vormgeving van originele excel-bestanden wordt behouden. De oplossing is schaalbaar van kleine afdelinggebruik tot bedrijfswijde rapporteringssystemen, met opties voor aanpassing om aan specifieke zakelijk vereisten te voldoen.

Voor meer informatie en aanvullende voorbeelden, raadpleeg de Aspose.Cells.LowCode API Referentie .

 Nederlands