C# - 将 xls 文件转换为不带 office 组件的 xlsx
Posted
技术标签:
【中文标题】C# - 将 xls 文件转换为不带 office 组件的 xlsx【英文标题】:C# - convert xls file to xlsx without office components 【发布时间】:2015-05-27 20:36:26 【问题描述】:我的服务器上不能安装任何办公室,所以我使用 ClosedXML 对 excel 文件进行一些操作。 但 ClosedXML 仅适用于 .xlsx 文件,我也有 xls 文件要处理。 我花了将近一整天的时间来寻找一种在不使用任何 office 库的情况下将 .xls 文件转换为 .xlsx 文件的方法(因为我指定的服务器上没有安装 office...)
谁能告诉我如何将这些 .xls 文件转换为 .xlsx 文件? 我无法使用 Microsoft.Office.Interop,因为它需要在服务器上安装 Office。
【问题讨论】:
对于 Microsoft.Office.Interop,您需要安装 Office。您可以使用OleDb
来读取它,然后使用EPPlus
或OpenXml
之类的库来编写xlsx 文件。
我是这么认为的...你知道如何在不安装 office 的情况下将 .xls 转换为 .xlsx 吗?
要使用 Office.Interop,您确实需要安装 office,但您可以使用其他库。 Here 是一个问题,谁的回答谈到了一个可能会满足您需求的库。
试试这个:***.com/questions/46937604/…
【参考方案1】:
对于Microsoft.Office.Interop
,您需要安装office。
您可以使用OleDb
to read it(f.e. into a 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
。
@LiranFriedman:我认为这很清楚,因为我在回答的最后提到了它。使用第一个链接从 xls 文件中获取DataTable
,然后使用EPLus
编写 xlsx 文件(代码如上)。【参考方案2】:
感谢@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);
【讨论】:
Microsoft.ACE.OLEDB.12.0
未注册
@Kiquenet 我遇到了同样的问题...您需要安装以下microsoft.com/en-us/download/details.aspx?id=13255
Microsoft Access 数据库引擎 2010 Redistributable 适用于 32 位 (x86) 或 64 位 (x64) ?以上是关于C# - 将 xls 文件转换为不带 office 组件的 xlsx的主要内容,如果未能解决你的问题,请参考以下文章
使用命令行使用 Libre Office 将 xls 转换为 dbf
在 Python 中将带 BOM 的 UTF-8 转换为不带 BOM 的 UTF-8
LibreOffice 停止工作,同时使用 C# 应用程序将 XLS 转换为 XHTML 文件
c#导出整个HTML页面到excel表格...汉字乱码,系统是win7,安装的office 07 导出的03(.xls)文件