C# - 不使用Office组件将xls文件转换为xlsx

5
我有一台服务器,不能安装任何office软件,因此我正在使用ClosedXML对excel文件进行操作。 但是ClosedXML只能处理.xlsx文件,而我还需要处理.xls文件。 我花了将近一整天的时间寻找一种方法来将.xls文件转换为.xlsx文件,而不使用任何office库(因为我的指定服务器上没有安装office...) 请问有人可以告诉我如何将这些.xls文件转换为.xlsx文件吗? 我不能使用Microsoft.Office.Interop,因为它需要在服务器上安装office。

使用Microsoft.Office.Interop需要安装Office。您可以使用OleDb来读取,然后使用EPPlusOpenXml等库来编写xlsx文件。 - Tim Schmelter
我也是这么想的...你知道如何在没有安装Office的情况下将 .xls 转换为 .xlsx 吗? - Liran Friedman
要使用Office.Interop,您确实需要安装Office,但是还有其他库可供使用。这里有一个问题,其答案讨论了一个可能会满足您需求的库。 - CalebB
尝试使用以下链接:https://dev59.com/mFYN5IYBdhLWcg3wxqhu#49746655 - Yawar Murtaza
2个回答

9
对于使用 Microsoft.Office.Interop,你需要安装 Office。
你可以使用 OleDb 读取文件(例如到 DataTable。然后使用类似 EPPlus 或者 OpenXml 的库来写入 xlsx 文件。这两个库都不需要安装 Office。
使用 EPPlus 从 DataTable 创建 xlsx 文件很容易:
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。

@LiranFriedman:我已经展示了如何用EPPlus创建Excel文件,只要你有一个DataTable就很简单。第一个链接展示了如何从xls文件中提取DataTable - Tim Schmelter
@LiranFriedman:我认为我的回答已经很清楚了,因为我在回答的结尾提到了它。使用第一个链接从xls文件中获取DataTable,然后使用EPLus编写xlsx文件(类似上面的代码)。 - Tim Schmelter

8

感谢@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);
        }

1
Microsoft.ACE.OLEDB.12.0 未注册。 - Kiquenet
@Kiquenet 我也遇到了同样的问题...你需要安装以下内容 https://www.microsoft.com/en-us/download/details.aspx?id=13255 - TsTeaTime
Microsoft Access Database Engine 2010 Redistributable适用于32位(x86)还是64位(x64)? - Kiquenet

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接