Как перевести файлы 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 Framework 4.6.2+)
- Aspose.Cells для пакета .NET, установленного через NuGet
- Основное понимание C# программирования
PM> Install-Package Aspose.Cells
Step-by-Step реализация
Шаг 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: Логика обнаружения файлов
Создайте метод для обнаружения всех файлов 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
Проблема 3: Управление очень большими файлами 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 перед обработкой комплекта для выявления потенциальных проблем
- Введение прочной обработки ошибок, чтобы убедиться, что процесс не прекращается, если один файл провалится
- Создайте подробные записи процесса конверсии для решения проблем и аудита
- Организируйте выходные PDF-файлы в структурированной иерархии папки для легкого управления
- Настройка системы мониторинга, которая предупреждает администраторов об ошибках конверсии
- Тест с различными типами файлов 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: Selective Sheet Conversion
Конвертировать только конкретные листы из каждого файла 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. Этот подход значительно улучшает производительность и обеспечивает консистенцию во всех генерируемых PDF-файлах при сохранении качества и форматирования оригинальных файлов Excel. Решение скалируется от небольшого департаментального использования к корпоративным системам отчета, с возможностями персонализации для удовлетворения конкретных требований бизнеса.
Для получения дополнительной информации и дополнительных примеров см. Aspose.Cells.LowCode API ссылка .