工作中有一些2003版之前的Excel文件,现在想把他们批量转换成2007+的格式,这里总结3种方法,复杂度依次递增,完美度依次递增。
1. JavaScript
利用js-xlsx包 ,可以在NodeJs环境中进行xls到xlsx的转换,非常简单,示例代码如下:
先安装依赖npm install xlsx
const XLSX = require('xlsx');
var oldFile= XLSX.readFile('./test.xls');
XLSX.writeFile(oldFile, './test.xlsx');
优点
快,不依赖Office,易部署
缺点
只适合纯文字类的转换,无法转换公式、样式、图片、图表。
2. C# NPOI
NPOI是从Java的POI移植过来的,速度也非常快,需要在nuget安装NPOI依赖,Install-Package NPOI
using NPOI.HSSF.UserModel;
using NPOI.XSSF.UserModel;
void ConvertWorkbook()
{
using (var streamRead = new FileStream(@"./test.xls", FileMode.Open, FileAccess.Read))
using (var streamWrite = new FileStream(@"./test.xlsx", FileMode.OpenOrCreate, FileAccess.Write))
{
var book = new HSSFWorkbook(streamRead );
var newBook = new XSSFWorkbook();
var copiedSheets = Enumerable.Range(0, book.NumberOfSheets).Select(i => book.CloneSheet(i));
copiedSheets.Select((sheet, index) => new {sheet, index}).ToList()
.ForEach(item => newBook.Insert(item.index, item.sheet));
newBook.Write(streamWrite);
}
}
优点
速度非常快,不依赖Office
缺点
无法转换图片、图表。
3.C# Excel
这个是必杀技,100%成功率和兼容性,先安装nuget依赖,Install-Package Microsoft.Office.Interop.Excel
void ConvertWorkbook()
{
var app = new Microsoft.Office.Interop.Excel.Application {Visible = false};
var book = app.Workbooks.Open(@"./test.xls");
//注意,新的文件名没后缀
book.SaveAs(Filename: @"./test", FileFormat: Microsoft.Office.Interop.Excel.XlFileFormat.xlOpenXMLWorkbook);
book.Close();
app.Quit();
}
优点
各种格式、类型都兼容
缺点
需要在电脑上安装Excel,运行起来速度有点慢