C# 实现 XLS 与 XLSX 格式双向互转(无需依赖 Office)

日常 .NET 项目开发、数据对接、报表归档中,经常遇到新旧 Excel 格式不兼容的问题。XLS (Excel 97-2003)为二进制格式,兼容性广但单文件数据容量有限;而 XLSX(Excel 2007+)为开放式 XML 格式,体积更小、扩展性更强。

不同系统、老旧业务终端、第三方导出工具常生成不同后缀的表格文件,因此 XLS 与 XLSX 互相转换成为后端开发中的高频需求。本文将讲解如何使用 C# 快速完成双向格式转换,不依赖本地安装 Office 套件。


一、技术方案选型

原生 .NET 缺少直接解析、转换 Excel 新旧格式的内置 API。传统方案大多依赖 Office Interop 组件,存在以下弊端:

  • 必须在服务器/运行环境安装微软 Office,部署成本高
  • 进程容易残留,长期运行易造成内存泄漏
  • 权限配置复杂,容器化、Linux 环境无法适配

因此,本文采用轻量级第三方免费 Excel 处理类库,以独立解析引擎完成表格读取与另存导出,仅引入基础 NuGet 包,无额外环境依赖,代码轻量化、可直接集成至控制台、WinForm、ASP.NET 各类项目。

安装方式

通过 NuGet 包管理器安装:

bash 复制代码
Install-Package FreeSpire.XLS

⚠️ 免费版限制:Free Spire.XLS 在读写 XLS 格式时,每个工作簿最多处理 5 个工作表,且每个工作表最多 200 行数据。使用时需注意此限制,避免内容被截断。


二、了解 XLS 与 XLSX 的本质差异

特性 XLS (97-2003) XLSX (2007+)
底层格式 二进制复合文档 (BIFF) ZIP 压缩包 + XML
最大行数 65,536 1,048,576
最大列数 256 (IV) 16,384 (XFD)
工作表最大数量 约 255 无硬性限制(受内存限制)
单元格字符数 32,767 32,767
颜色支持 56 色调色板 1600 万色(24位)
条件格式 有限 丰富
图表 传统图表 新图表引擎
数据透视表 支持 增强版

由于旧格式的限制,XLSX → XLS 转换时,复杂图表、单元格样式、新公式等可能会丢失或降级。建议转换前对关键数据进行复核。


三、XLS 转 XLSX(旧格式转新格式)

加载旧版 XLS 文件,通过指定高版本 ExcelVersion 枚举,另存为 XLSX 格式。

csharp 复制代码
using Spire.Xls;
using System;

namespace ConvertXlsToXlsx
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                // 1. 创建 Workbook 对象
                using (Workbook workbook = new Workbook())
                {
                    // 2. 加载 .xls 文件
                    workbook.LoadFromFile("Input.xls");

                    // 3. 转换为 .xlsx 并保存
                    workbook.SaveToFile("ToXlsx.xlsx", ExcelVersion.Version2016);
                }

                Console.WriteLine("转换完成!");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"转换失败:{ex.Message}");
            }
        }
    }
}

💡 说明ExcelVersion 枚举提供了多种版本,如 Version97to2003(.xls)、Version2010Version2013Version2016 等。保存为 .xlsx 时推荐选最新版本,兼容性最好。。


四、XLSX 转 XLS(新格式转旧格式)

针对仅能识别 XLS 格式的老旧系统,将新版表格向下兼容转换。代码逻辑与反向转换一致,仅修改导出版本参数。

csharp 复制代码
using Spire.Xls;
using System;

namespace ConvertXlsxToXls
{
    class Program
    {
        static void Main(string[] args)
        {
            try
            {
                using (Workbook workbook = new Workbook())
                {
                    workbook.LoadFromFile("Input.xlsx");
                    workbook.SaveToFile("ToXls.xls", ExcelVersion.Version97to2003);
                }

                Console.WriteLine("转换完成!");
            }
            catch (Exception ex)
            {
                Console.WriteLine($"转换失败:{ex.Message}");
            }
        }
    }
}

五、批量转换与文件夹处理

实际项目中常需批量转换整个目录下的 Excel 文件。以下示例支持将指定文件夹内所有 .xls 转为 .xlsx(反之类似)。

批量 XLS → XLSX 示例

csharp 复制代码
using Spire.Xls;
using System;
using System.IO;

namespace BatchConvert
{
    class Program
    {
        static void Main(string[] args)
        {
            string sourceFolder = @"C:\ExcelFiles\XlsFiles";
            string destFolder = @"C:\ExcelFiles\XlsxFiles";

            if (!Directory.Exists(destFolder))
                Directory.CreateDirectory(destFolder);

            foreach (string xlsFile in Directory.GetFiles(sourceFolder, "*.xls"))
            {
                string fileName = Path.GetFileNameWithoutExtension(xlsFile);
                string xlsxPath = Path.Combine(destFolder, fileName + ".xlsx");

                try
                {
                    using (Workbook workbook = new Workbook())
                    {
                        workbook.LoadFromFile(xlsFile);
                        workbook.SaveToFile(xlsxPath, ExcelVersion.Version2016);
                    }
                    Console.WriteLine($"已转换: {xlsFile} → {xlsxPath}");
                }
                catch (Exception ex)
                {
                    Console.WriteLine($"转换失败 {xlsFile}: {ex.Message}");
                    // 可将错误写入日志文件
                }
            }

            Console.WriteLine("批量转换完成!");
        }
    }
}

类似地,将 *.xlsx 转为 *.xls 只需调整搜索模式与保存版本。


六、总结

C# 实现 XLS/XLSX 互转仅需 3 行核心代码:

创建 Workbook → 加载文件 → 指定版本保存

本文提供的代码可直接复制到项目中,稍作路径修改即可运行。无论是单个文件转换还是批量处理,这套方案均稳定高效。若需处理更复杂的 Excel 场景(如修改单元格、生成图表),该库的 API 同样可以满足。

🔗 相关资源:

相关推荐
水木流年追梦2 小时前
CodeTop Top 300 热门题目2-最长回文子串
开发语言·人工智能·python·算法·leetcode
良木生香2 小时前
【C++初阶】:STL——String从入门到应用完全指南(3)
c语言·开发语言·数据结构·c++·算法
fox_lht2 小时前
8.3.使用if let和let else实现简明的程序流控制
开发语言·后端·算法·rust
AI玫瑰助手3 小时前
Python基础:列表的定义、增删改查核心操作
android·开发语言·python
mOok ONSC3 小时前
对基因列表中批量的基因进行GO和KEGG注释
开发语言·数据库·golang
aini_lovee3 小时前
基于C#的三菱PLC串口通信实现方案
服务器·网络·c#
磊 子3 小时前
类模板与派生1
java·开发语言·c++
:1213 小时前
java面试基础2
java·开发语言·面试
光泽雨3 小时前
c#MVVM中的消息通知机制
服务器·c#