日常 .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)、Version2010、Version2013、Version2016 等。保存为 .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 同样可以满足。
🔗 相关资源: