# 使用C#将CSV数据转换为PDF

下面我将提供一个完整的解决方案,使用C#将CSV文件内容转换为PDF格式。这个方案使用了iTextSharp库来处理PDF生成,这是.NET生态中常用的PDF处理库之一。

图片[1]_# 使用C#将CSV数据转换为PDF_知途无界

准备工作

首先,你需要通过NuGet安装iTextSharp包:

Install-Package itext7

或者使用iTextSharp.LGPLv2.Core(LGPL许可版本):

Install-Package iTextSharp.LGPLv2.Core

完整代码实现

using System;
using System.Collections.Generic;
using System.Globalization;
using System.IO;
using iText.Kernel.Colors;
using iText.Kernel.Font;
using iText.Kernel.Geom;
using iText.Kernel.Pdf;
using iText.Layout;
using iText.Layout.Borders;
using iText.Layout.Element;
using iText.Layout.Properties;

public class CsvToPdfConverter
{
    public void ConvertCsvToPdf(string csvFilePath, string pdfOutputPath)
    {
        try
        {
            // 读取CSV文件
            var csvData = ReadCsvFile(csvFilePath);
            
            // 创建PDF文档
            using (PdfWriter writer = new PdfWriter(pdfOutputPath))
            {
                PdfDocument pdf = new PdfDocument(writer);
                Document document = new Document(pdf);
                
                // 设置页面大小和边距
                document.SetMargins(30, 30, 30, 30);
                
                // 添加标题
                Paragraph title = new Paragraph(Path.GetFileNameWithoutExtension(csvFilePath))
                    .SetTextAlignment(TextAlignment.CENTER)
                    .SetFontSize(18)
                    .SetBold()
                    .SetMarginBottom(20);
                document.Add(title);
                
                if (csvData == null || csvData.Count == 0)
                {
                    document.Add(new Paragraph("CSV文件为空或无法读取数据").SetFontSize(12));
                }
                else
                {
                    // 处理CSV数据并添加到PDF
                    AddCsvDataToPdf(document, csvData);
                }
                
                document.Close();
            }
            
            Console.WriteLine($"PDF已成功生成: {pdfOutputPath}");
        }
        catch (Exception ex)
        {
            Console.WriteLine($"转换过程中发生错误: {ex.Message}");
            throw;
        }
    }
    
    private List<List<string>> ReadCsvFile(string filePath)
    {
        var data = new List<List<string>>();
        
        try
        {
            using (var reader = new StreamReader(filePath))
            {
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    if (!string.IsNullOrWhiteSpace(line))
                    {
                        // 简单的CSV解析,处理逗号分隔的值
                        // 注意:对于包含逗号的引用字段,这个简单方法可能不适用
                        var values = ParseCsvLine(line);
                        data.Add(values);
                    }
                }
            }
        }
        catch (Exception ex)
        {
            Console.WriteLine($"读取CSV文件时出错: {ex.Message}");
            return null;
        }
        
        return data;
    }
    
    private List<string> ParseCsvLine(string line)
    {
        var values = new List<string>();
        bool inQuotes = false;
        string current = "";
        
        foreach (char c in line)
        {
            if (c == '"')
            {
                inQuotes = !inQuotes;
            }
            else if (c == ',' && !inQuotes)
            {
                values.Add(current.Trim());
                current = "";
            }
            else
            {
                current += c;
            }
        }
        
        // 添加最后一个字段
        values.Add(current.Trim());
        
        return values;
    }
    
    private void AddCsvDataToPdf(Document document, List<List<string>> csvData)
    {
        if (csvData == null || csvData.Count == 0)
            return;
        
        // 获取所有可能的列数(处理可能的不规则行)
        int maxColumns = 0;
        foreach (var row in csvData)
        {
            if (row.Count > maxColumns)
                maxColumns = row.Count;
        }
        
        // 创建字体
        PdfFont font = PdfFontFactory.CreateFont(iText.IO.Font.Constants.StandardFonts.HELVETICA);
        PdfFont boldFont = PdfFontFactory.CreateFont(iText.IO.Font.Constants.StandardFonts.HELVETICA_BOLD);
        
        // 表格将占据页面宽度的100%
        float tableWidth = UnitValue.CreatePercentValue(100);
        
        // 创建表格,带有最大列数
        Table table = new Table(UnitValue.CreatePercentArray(maxColumns)).UseAllAvailableWidth();
        
        // 设置表格属性
        table.SetWidth(tableWidth);
        
        // 添加表头(假设第一行是表头)
        if (csvData.Count > 0)
        {
            var headerRow = csvData[0];
            for (int i = 0; i < headerRow.Count; i++)
            {
                Cell cell = new Cell()
                    .Add(new Paragraph(headerRow[i]))
                    .SetFont(boldFont)
                    .SetBackgroundColor(new DeviceRgb(220, 220, 220)) // 浅灰色背景
                    .SetTextAlignment(TextAlignment.CENTER)
                    .SetBorder(new SolidBorder(0.5f));
                
                table.AddCell(cell);
            }
            
            // 添加数据行
            for (int i = 1; i < csvData.Count; i++)
            {
                var row = csvData[i];
                for (int j = 0; j < row.Count; j++)
                {
                    // 对于空单元格,添加一个空段落以保持表格结构
                    var cellContent = string.IsNullOrEmpty(row[j]) ? "" : row[j];
                    
                    Cell cell = new Cell()
                        .Add(new Paragraph(cellContent))
                        .SetFont(font)
                        .SetTextAlignment(GetTextAlignment(j, row.Count))
                        .SetBorder(new SolidBorder(0.5f));
                    
                    // 如果是数字,右对齐
                    if (IsNumeric(cellContent) && j < row.Count - 1) // 假设最后一列通常是文本
                    {
                        cell.SetTextAlignment(TextAlignment.RIGHT);
                    }
                    
                    table.AddCell(cell);
                }
            }
        }
        
        document.Add(table);
    }
    
    private TextAlignment GetTextAlignment(int columnIndex, int totalColumns)
    {
        // 简单的对齐方式:第一列左对齐,中间列居中,最后一列右对齐
        if (columnIndex == 0)
            return TextAlignment.LEFT;
        else if (columnIndex == totalColumns - 1)
            return TextAlignment.RIGHT;
        else
            return TextAlignment.CENTER;
    }
    
    private bool IsNumeric(string value)
    {
        return double.TryParse(value, NumberStyles.Any, CultureInfo.InvariantCulture, out _);
    }
}

// 使用示例
class Program
{
    static void Main(string[] args)
    {
        var converter = new CsvToPdfConverter();
        
        // 输入CSV文件路径和输出PDF文件路径
        string csvFilePath = "data.csv";  // 替换为你的CSV文件路径
        string pdfOutputPath = "output.pdf";  // 替换为你想要的PDF输出路径
        
        converter.ConvertCsvToPdf(csvFilePath, pdfOutputPath);
    }
}

代码说明

  1. CsvToPdfConverter类​:主类,包含将CSV转换为PDF的核心逻辑。
    • ConvertCsvToPdf:主方法,协调整个转换过程
    • ReadCsvFile:读取CSV文件内容
    • ParseCsvLine:解析单行CSV数据,处理引号和逗号
    • AddCsvDataToPdf:将CSV数据添加到PDF文档中,以表格形式展示
    • 辅助方法:处理文本对齐和数字检测
  2. PDF生成​:
    • 使用iText 7库创建PDF文档
    • 将CSV的第一行作为表格标题
    • 自动调整表格列数以适应数据
    • 对数字进行右对齐,提高可读性
    • 表头使用灰色背景和粗体字突出显示
  3. 使用示例​:
    • 在Main方法中指定输入CSV文件和输出PDF文件路径
    • 创建转换器实例并调用转换方法

高级选项和改进建议

  1. 处理复杂CSV​:
    • 当前实现使用简单的CSV解析器,对于包含转义逗号或换行符的复杂CSV可能不适用
    • 可考虑使用专门的CSV解析库,如CsvHelper
  2. 样式定制​:
    • 可以添加更多样式选项,如字体大小、颜色、表格边框样式等
    • 支持自定义页面大小、页眉页脚
  3. 分页处理​:
    • 对于大型CSV文件,可能需要处理分页,确保表格不会被截断
  4. 性能优化​:
    • 对于非常大的CSV文件,考虑流式处理和分批写入PDF
  5. 错误处理​:
    • 增强错误处理,处理格式错误的CSV行

替代方案

如果你不想使用iText 7,也可以考虑以下替代库:

  1. PdfSharp​:另一个流行的PDF生成库
  2. QuestPDF​:一个现代、声明式的PDF生成库,有免费的个人使用许可
  3. Syncfusion Essential PDF​:商业库,功能强大

希望这个解决方案能帮助你轻松地将CSV数据转换为PDF格式!

© 版权声明
THE END
喜欢就点个赞,支持一下吧!
点赞55 分享
评论 抢沙发
头像
欢迎您留下评论!
提交
头像

昵称

取消
昵称表情代码图片

    暂无评论内容