C#實現(xiàn)XLS與XLSX格式雙向互轉(zhuǎn)(無需依賴?Office)
日常 .NET 項目開發(fā)、數(shù)據(jù)對接、報表歸檔中,經(jīng)常遇到新舊 Excel 格式不兼容的問題。XLS(Excel 97-2003)為二進制格式,兼容性廣但單文件數(shù)據(jù)容量有限;XLSX(Excel 2007+)為開放式 XML 格式,體積更小、擴展性更強。
不同系統(tǒng)、老舊業(yè)務(wù)終端、第三方導(dǎo)出工具常生成不同后綴的表格文件,因此 XLS 與 XLSX 互相轉(zhuǎn)換成為后端開發(fā)中的高頻需求。本文將講解如何使用 C# 快速完成雙向格式轉(zhuǎn)換,不依賴本地安裝 Office 套件。
一、技術(shù)方案選型
原生 .NET 缺少直接解析、轉(zhuǎn)換 Excel 新舊格式的內(nèi)置 API。傳統(tǒng)方案大多依賴 Office Interop 組件,存在以下弊端:
- 必須在服務(wù)器/運行環(huán)境安裝微軟 Office,部署成本高
- 進程容易殘留,長期運行易造成內(nèi)存泄漏
- 權(quán)限配置復(fù)雜,容器化、Linux 環(huán)境無法適配
因此,本文采用輕量級第三方免費 Excel 處理類庫,以獨立解析引擎完成表格讀取與另存導(dǎo)出,僅引入基礎(chǔ) NuGet 包,無額外環(huán)境依賴,代碼輕量化、可直接集成至控制臺、WinForm、ASP.NET 各類項目。
安裝方式
通過 NuGet 包管理器安裝:
Install-Package FreeSpire.XLS
免費版限制:Free Spire.XLS 在讀寫 XLS 格式時,每個工作簿最多處理 5 個工作表,且每個工作表最多 200 行數(shù)據(jù)。使用時需注意此限制,避免內(nèi)容被截斷。
二、了解 XLS 與 XLSX 的本質(zhì)差異
| 特性 | XLS (97-2003) | XLSX (2007+) |
|---|---|---|
| 底層格式 | 二進制復(fù)合文檔 (BIFF) | ZIP 壓縮包 + XML |
| 最大行數(shù) | 65,536 | 1,048,576 |
| 最大列數(shù) | 256 (IV) | 16,384 (XFD) |
| 工作表最大數(shù)量 | 約 255 | 無硬性限制(受內(nèi)存限制) |
| 單元格字符數(shù) | 32,767 | 32,767 |
| 顏色支持 | 56 色調(diào)色板 | 1600 萬色(24位) |
| 條件格式 | 有限 | 豐富 |
| 圖表 | 傳統(tǒng)圖表 | 新圖表引擎 |
| 數(shù)據(jù)透 視表 | 支持 | 增強版 |
由于舊格式的限制,XLSX → XLS 轉(zhuǎn)換時,復(fù)雜圖表、單元格樣式、新公式等可能會丟失或降級。建議轉(zhuǎn)換前對關(guān)鍵數(shù)據(jù)進行復(fù)核。
三、XLS 轉(zhuǎn) XLSX(舊格式轉(zhuǎn)新格式)
加載舊版 XLS 文件,通過指定高版本 ExcelVersion 枚舉,另存為 XLSX 格式。
using Spire.Xls;
using System;
namespace ConvertXlsToXlsx
{
class Program
{
static void Main(string[] args)
{
try
{
// 1. 創(chuàng)建 Workbook 對象
using (Workbook workbook = new Workbook())
{
// 2. 加載 .xls 文件
workbook.LoadFromFile("Input.xls");
// 3. 轉(zhuǎn)換為 .xlsx 并保存
workbook.SaveToFile("ToXlsx.xlsx", ExcelVersion.Version2016);
}
Console.WriteLine("轉(zhuǎn)換完成!");
}
catch (Exception ex)
{
Console.WriteLine($"轉(zhuǎn)換失?。簕ex.Message}");
}
}
}
}
說明:ExcelVersion 枚舉提供了多種版本,如 Version97to2003(.xls)、Version2010、Version2013、Version2016 等。保存為 .xlsx 時推薦選最新版本,兼容性最好。。
四、XLSX 轉(zhuǎn) XLS(新格式轉(zhuǎn)舊格式)
針對僅能識別 XLS 格式的老舊系統(tǒng),將新版表格向下兼容轉(zhuǎn)換。代碼邏輯與反向轉(zhuǎn)換一致,僅修改導(dǎo)出版本參數(shù)。
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("轉(zhuǎn)換完成!");
}
catch (Exception ex)
{
Console.WriteLine($"轉(zhuǎn)換失?。簕ex.Message}");
}
}
}
}
五、批量轉(zhuǎn)換與文件夾處理
實際項目中常需批量轉(zhuǎn)換整個目錄下的 Excel 文件。以下示例支持將指定文件夾內(nèi)所有 .xls 轉(zhuǎn)為 .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($"已轉(zhuǎn)換: {xlsFile} → {xlsxPath}");
}
catch (Exception ex)
{
Console.WriteLine($"轉(zhuǎn)換失敗 {xlsFile}: {ex.Message}");
// 可將錯誤寫入日志文件
}
}
Console.WriteLine("批量轉(zhuǎn)換完成!");
}
}
}
類似地,將 *.xlsx 轉(zhuǎn)為 *.xls 只需調(diào)整搜索模式與保存版本。
六、總結(jié)
C# 實現(xiàn) XLS/XLSX 互轉(zhuǎn)僅需 3 行核心代碼:
創(chuàng)建 Workbook → 加載文件 → 指定版本保存
本文提供的代碼可直接復(fù)制到項目中,稍作路徑修改即可運行。無論是單個文件轉(zhuǎn)換還是批量處理,這套方案均穩(wěn)定高效。若需處理更復(fù)雜的 Excel 場景(如修改單元格、生成圖表),該庫的 API 同樣可以滿足。
到此這篇關(guān)于C#實現(xiàn)XLS與XLSX格式雙向互轉(zhuǎn)(無需依賴 Office)的文章就介紹到這了,更多相關(guān)C# XLS與XLSX互轉(zhuǎn)內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

