日常 .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 包管理器安装:
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 格式。
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 格式的老旧系统,将新版表格向下兼容转换。代码逻辑与反向转换一致,仅修改导出版本参数。
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 示例
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 同样可以满足。
到此这篇关于c#实现xls与xlsx格式双向互转(无需依赖 office)的文章就介绍到这了,更多相关c# xls与xlsx互转内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论