You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

不使用Interop.Excel将Excel(xlsx)文件保存为CSV格式的方案咨询

无需Microsoft.Office.Interop.Excel的Excel工作表转CSV实现方案

核心实现思路

低版本EPPlus(4.x系列,MIT许可可免费商用)已完整支持xlsx文件的单元格内容读取能力,你只需要自行按照CSV格式规范拼接读取到的单元格内容,即可完成xlsx转CSV的需求,无需依赖Office.Interop.Excel或高版本EPPlus的付费功能。

具体实现步骤

  • 加载目标xlsx文件,获取需要转换的工作表对象
  • 遍历工作表的有效数据范围,逐行读取所有列的单元格值
  • 对单元格内容做CSV规范转义:内容包含逗号、双引号、换行符时用双引号包裹,内容本身的双引号替换为两个连续双引号
  • 将单行所有字段用逗号拼接后写入输出文件,编码建议使用带BOM的UTF-8,避免Windows端Excel打开乱码

可直接运行的代码示例(C#,EPPlus 4.5.3.3版本验证通过)

using OfficeOpenXml;
using System;
using System.Collections.Generic;
using System.IO;
using System.Text;

public static class ExcelToCsvConverter
{
    /// <summary>
    /// 将xlsx文件的指定工作表转换为CSV文件
    /// </summary>
    /// <param name="excelInputPath">源xlsx文件的全路径</param>
    /// <param name="csvOutputPath">转换后CSV文件的输出全路径</param>
    /// <param name="sheetIndex">要转换的工作表索引,从0开始计数</param>
    /// <param name="exportHeader">是否导出工作表第一行作为CSV表头</param>
    public static void Convert(string excelInputPath, string csvOutputPath, int sheetIndex = 0, bool exportHeader = true)
    {
        if (!File.Exists(excelInputPath))
            throw new FileNotFoundException("源Excel文件不存在", excelInputPath);

        using (var excelPkg = new ExcelPackage(new FileInfo(excelInputPath)))
        {
            var targetSheet = excelPkg.Workbook.Worksheets[sheetIndex];
            if (targetSheet == null)
                throw new ArgumentOutOfRangeException(nameof(sheetIndex), "指定索引的工作表不存在");

            var dataRange = targetSheet.Dimension;
            if (dataRange == null)
            {
                // 工作表无数据时输出空文件
                File.Create(csvOutputPath).Dispose();
                return;
            }

            int startRow = exportHeader ? dataRange.Start.Row : dataRange.Start.Row + 1;
            int endRow = dataRange.End.Row;
            int colCount = dataRange.End.Column;

            // 带BOM的UTF-8编码,兼容Excel打开CSV不乱码
            using (var streamWriter = new StreamWriter(csvOutputPath, false, Encoding.UTF8))
            {
                for (int row = startRow; row <= endRow; row++)
                {
                    List<string> rowFields = new List<string>();
                    for (int col = 1; col <= colCount; col++)
                    {
                        string cellContent = targetSheet.Cells[row, col].Text;
                        // 按RFC4180标准转义CSV字段
                        if (!string.IsNullOrEmpty(cellContent) && 
                            (cellContent.Contains(',') || cellContent.Contains('"') || 
                             cellContent.Contains('\n') || cellContent.Contains('\r')))
                        {
                            cellContent = $"\"{cellContent.Replace("\"", "\"\"")}\"";
                        }
                        rowFields.Add(cellContent);
                    }
                    streamWriter.WriteLine(string.Join(",", rowFields));
                }
            }
        }
    }
}

扩展说明

  • 若需要自定义日期、数字等格式的输出,可以替换targetSheet.Cells[row, col].Text为targetSheet.Cells[row, col].Value,自行根据数据类型做格式化处理
  • 大文件转换场景下,该实现是逐行写入流,不会一次性加载全表数据到内存,性能可满足常规业务需求
  • EPPlus 4.x全版本采用MIT许可,无需支付任何费用即可用于商用、非商用场景

内容的提问来源于stack exchange,提问作者user11251276

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 08:54:03