C# – 将xls文件转换为xlsx而不使用office组件

我有一台服务器不能安装任何办公室,所以我使用ClosedXML来对Excel文件进​​行一些操作。 但是ClosedXML只适用于.xlsx文件,我也有xls文件来处理。 我花了几乎整整一天的时间寻找一种方法来将.xls文件转换为.xlsx文件,而无需使用任何办公室库(因为我的指定服务器上没有安装任何办公软件)

可以有人请告诉我如何将这些.xls文件转换为.xlsx文件? 我无法使用Microsoft.Office.Interop,因为它需要在服务器上安装Office。

对于Microsoft.Office.Interop您需要安装Office。

你可以使用OleDb来读取它(到一个DataTable ) 。 然后使用像EPPlusOpenXml这样的库来编写xlsx文件。 两者都不需要安装办公室。

使用EPPLus从DataTable创buildxlsx文件非常简单:

 using (ExcelPackage pck = new ExcelPackage(newFile)) { ExcelWorksheet ws = pck.Workbook.Worksheets.Add("Name of Worksheet"); ws.Cells["A1"].LoadFromDataTable(dataTable, true); pck.Save(); } 

上面的第一个链接显示了如何从xls文件获取DataTable

感谢@Tim Schmelter。 以下是我从链接中获得的代码:

 private static string GetConnectionString() { Dictionary<string, string> props = new Dictionary<string, string>(); // XLSX - Excel 2007, 2010, 2012, 2013 props["Provider"] = "Microsoft.ACE.OLEDB.12.0;"; props["Extended Properties"] = "Excel 12.0 XML"; props["Data Source"] = @"D:\data\users\liran-fr\Desktop\Excel\Received\Orbotech_FW__ARTEMIS-CONTROL-AG__223227__0408141043__95546.xls"; // XLS - Excel 2003 and Older //props["Provider"] = "Microsoft.Jet.OLEDB.4.0"; //props["Extended Properties"] = "Excel 8.0"; //props["Data Source"] = "C:\\MyExcel.xls"; StringBuilder sb = new StringBuilder(); foreach (KeyValuePair<string, string> prop in props) { sb.Append(prop.Key); sb.Append('='); sb.Append(prop.Value); sb.Append(';'); } return sb.ToString(); } private static DataSet ReadExcelFile() { DataSet ds = new DataSet(); string connectionString = GetConnectionString(); using (OleDbConnection conn = new OleDbConnection(connectionString)) { conn.Open(); OleDbCommand cmd = new OleDbCommand(); cmd.Connection = conn; // Get all Sheets in Excel File DataTable dtSheet = conn.GetOleDbSchemaTable(OleDbSchemaGuid.Tables, null); // Loop through all Sheets to get data foreach (DataRow dr in dtSheet.Rows) { string sheetName = dr["TABLE_NAME"].ToString(); //if (!sheetName.EndsWith("$")) // continue; // Get all rows from the Sheet cmd.CommandText = "SELECT * FROM [" + sheetName + "]"; DataTable dt = new DataTable(); dt.TableName = sheetName; OleDbDataAdapter da = new OleDbDataAdapter(cmd); da.Fill(dt); ds.Tables.Add(dt); } cmd = null; conn.Close(); } return ds; } using (ExcelPackage epackage = new ExcelPackage()) { ExcelWorksheet excel = epackage.Workbook.Worksheets.Add("ExcelTabName"); DataSet ds = ReadExcelFile(); DataTable dtbl = ds.Tables[0]; excel.Cells["A1"].LoadFromDataTable(dtbl, true); System.IO.FileInfo file = new System.IO.FileInfo(@"D:\data\users\liran-fr\Desktop\Excel\Received\test.xlsx"); epackage.SaveAs(file); }