Hvordan man konverterer Excel-filer til PDF i .NET

Hvordan man konverterer Excel-filer til PDF i .NET

Denne artikel viser, hvordan man kombinerer konvertering af flere Excel-filer til PDF ved hjælp af Aspose.Cells LowCode PDF Converter i .NET-applikationer.PDF Converteren giver en smidig tilgang til dokumentkonvertering uden at kræve omfattende kodning eller dybt kendskab til Excel’s interne strukturer - perfekt for forretningsanalytikere og rapporterende udviklere, der har brug for at automatisere deres rapportering arbejdsprocesser.

Det virkelige problem

I virksomhedsmiljøer skal rapporteringsteams ofte konvertere tusindvis eller endda hundredvis af Excel-arbejdsbøger til PDF-format på en regelmæssig basis. At gøre dette manuelt er tidskrævende, fejlfrit og adskiller værdifulde ressourcer fra mere vigtige analytiske opgaver. Derudover er det udfordrende at sikre konsekvent formatering og layout over alle rapporter, når man konverterer filer individuelt.

Oversigt over løsning

Ved hjælp af Aspose.Cells LowCode PDF Converter kan vi løse denne udfordring effektivt med minimal kode. Denne løsning er ideel for forretningsanalytikere og rapporterende udviklere, der har brug for at rationalisere deres rapporteringsprocesser, sikre konsistens over dokumenter og frigive tid til mere værdifuldt arbejde. Vores tilgang vil fokusere på at skabe et robust batch-behandlingssystem, som kan håndtere store mængder Excel-filer med tilpassede konverteringsindstillinger.

Forudsætninger

Før du gennemfører løsningen, sørg for at du har:

  • Visual Studio 2019 eller senere
  • .NET 6.0 eller nyere (kompatibel med .Net Framework 4.6.2+)
  • Aspose.Cells for .NET-pakke installeret via NuGet
  • Grundlæggende forståelse af C# programmering
PM> Install-Package Aspose.Cells

Step-by-Step gennemførelse

Trin 1: Installation og konfiguration af Aspose.Cells

Tilføj pakken Aspose.Cells til dit projekt og inkluderer de nødvendige navneområder:

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

Trin 2: Skab en katalogstruktur til batchbehandling

Indstille en katalogstruktur til at organisere dine input Excel filer og output PDF-filer:

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

Trin 3: Implementation af File Discovery Logic

Skab en metode til at finde alle Excel-filer, der skal konverteres:

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

Trin 4: Konfigurer PDF Converter-mulighederne

Skab en metode til at indstille PDF-konverteringsmulighederne for konsekvent udgang:

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

Trin 5: Implementation af en enkelt fil konvertering logik

Skab en metode til at konvertere en enkelt Excel-fil til 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;
    }
}

Steg 6: Implementation Batch Processing Logic

Nu skaber du den vigtigste metode, der vil behandle flere filer:

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

Trin 7: Implementation af parallel behandling for bedre ydeevne

For store pakker implementeres parallelbehandling for at fremskynde konverteringen:

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

Steg 8: Fuld gennemførelseseksempel

Her er et fuldstændigt arbejde eksempel, der viser hele batch konverteringsprocessen:

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

Brug af tilfælde og applikationer

Enterprise rapporteringssystemer

I finansielle rapporteringssystemer, måned-end eller kvartal cyklus ofte kræver konvertering af mange Excel-baserede rapporter til PDF-format til distribution til interessenter. Denne batch konverteringsløsning giver rapporter udviklere mulighed for at automatisere processen, der sikrer, at alle rapporter konverteres med konsekvente indstillinger og formatering, mens dramatisk reducerer manuelle anstrengelser. rapporter kan automatisk arkiveres i et standardiseret format, hvilket gør tilbagetrækning og overensstemmelse lettere.

Afdelingsdatabehandling

Forretningsanalytikere, der indsamler Excel-baserede data fra flere afdelinger, kan bruge denne løsning til at standardisere og arkivere indsendelser. Ved automatisk at konvertere modtaget arbejdsbøger til PDF, opretter de en permanent registrering af dataindsender, samtidig med at oplysningerne kan deles med interessenter, som ikke har Excel.

Automatisk dokumentstyring Workflows

Integration med dokumentstyringssystemer bliver usædvanlig, når Excel-rapporter automatisk konverteres til PDF. Denne løsning kan planlægges til at køre som en del af en større arbejdsproces, der optager nye Excel filer, konverterer dem til pdf, og derefter ruterer de til de relevante dokumentrepositorier med de rigtige metadata. Den konsekvente formatering og arkivkvalitet PDF-udgang sikrer langsiktig adgang til forretningsdata.

Fælles udfordringer og løsninger

Udfordring 1: Behandling af Excel-filer med adgangskodebeskyttelse

Løsning: Ændre ladetilbudene til at inkludere adgangskodebehandling:

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

Udfordring 2: Vedligeholdelse af Excel-formatering i PDF-udgang

Løsning: Sørg for, at PDF-mulighederne er korrekt konfigureret for at bevare formatering:

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

Udfordring 3: Håndtering af meget store Excel-filer

Løsning: For ekstremt store filer implementeres hukommelsesoptimering:

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 overvejelser

  • For optimal ydeevne med store partier, brug den parallelle behandlingsmetode med en rimelig MaxDegreeOfParallelism Baseret på servers kapacitet
  • Overveje at behandle filer i mindre pakker, når du håndterer meget store Excel-værksbøger for at undgå hukommelsestryk
  • Implementering af en overvågningsmekanisme for at spore konverteringsprocessen og ressourceanvendelsen
  • For produktionsoptagelser skal du overveje at køre konverteringsprocessen på en dedikeret server eller under off-peak timer.

Bedste praksis

  • ** Forvalider Excel-filer** før batchbehandling for at identificere potentielle problemer
  • Implementer robust fejlbehandling for at sikre, at processen ikke stopper, hvis en fil fejler
  • ** Skab detaljerede loger** af konverteringsprocessen til problemløsning og revision
  • Organiser uddata PDF’er i en struktureret mappehierarki for nemmere forvaltning
  • Installere et overvågningssystem, der advarer administratorer om konverteringsfejl
  • Test med forskellige Excel-filtyper (XLSX, XLS og XLSM) for at sikre kompatibilitet

Avancerede scenarier

For mere komplekse krav, overveje disse avancerede implementeringer:

Scenario 1: Tilpasset PDF-navn baseret på Excel Cell-indhold

Du kan udveksle specifikke celleværdier til brug i PDF-filnavnet:

// 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: Selektiv blade konvertering

Konverter kun specifikke blade fra hver Excel-fil:

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

Konklusion

Ved at implementere Aspose.Cells LowCode PDF Converter til batchbehandling kan forretningsanalytikere og rapportudviklere drastisk reducere tiden brugt på manuelle Excel til PDF konverteringer. Denne tilgang forbedrer betydeligt produktiviteten og sikrer konsistens over alle genererede PDF’er samtidig med at opretholde kvaliteten og formatering af de oprindelige Excel-filer. Løsningen er skalbar fra lille afdelingsanvendelse til virksomhedens rapporteringssystemer, med muligheder for tilpasning til at imødekomme specifikke forretningsmæssige krav.

For yderligere oplysninger og eksempler henvises til Aspose.Cells.LowCode API Reference .

 Dansk