如何在未安装Excel的情况下创建一个Excel实例

26
在我的C#应用程序中,我通过Excel Interop dll(作为引用)读取/写入Excel文件。如果我将此程序移动到未安装Office/Excel的系统上(考虑干净的机器),我会遇到以下错误。

System.Runtime.InteropServices.COMException (0x80040154):由于以下错误无法检索具有CLSID {00024500-0000-0000-C000-000000000046}的组件的COM类工厂:80040154 类未注册(来自HRESULT的异常:0x80040154 (REGDB_E_CLASSNOTREG))。

由于目标机器上没有安装Excel,因此会出现上述错误。
我的问题是,除了在目标机器上注册Interop dll之外,是否还有其他使用程序的方法?
4个回答

26
我的问题是,除了在目标计算机上注册Interop dll之外,是否有其他使用我的程序的方法?
您正在询问是否有任何方法可以在运行程序的计算机上没有安装Excel的情况下使用使用Excel interop的程序。简短的答案是否定的。更长的答案是,如果您愿意重构程序以不使用interop,则可以使用。
如果您要针对的Excel版本是2007及以上版本,则可以使用Microsoft提供的OOXml SDK。如果您愿意花一点钱,也可以使用第三方库,例如Aspose
microsoft docs中可以找到使用OOXml SDK将电子表格插入到Excel文件中的示例。
// Given a document name, inserts a new worksheet.
public static void InsertWorksheet(string docName)
{
    // Open the document for editing.
    using (SpreadsheetDocument spreadSheet = SpreadsheetDocument.Open(docName, true))
    {
        // Add a blank WorksheetPart.
        WorksheetPart newWorksheetPart = spreadSheet.WorkbookPart.AddNewPart<WorksheetPart>();
        newWorksheetPart.Worksheet = new Worksheet(new SheetData());

        Sheets sheets = spreadSheet.WorkbookPart.Workbook.GetFirstChild<Sheets>();
        string relationshipId = spreadSheet.WorkbookPart.GetIdOfPart(newWorksheetPart);

        // Get a unique ID for the new worksheet.
        uint sheetId = 1;
        if (sheets.Elements<Sheet>().Count() > 0)
        {
            sheetId = sheets.Elements<Sheet>().Select(s => s.SheetId.Value).Max() + 1;
        }

        // Give the new worksheet a name.
        string sheetName = "Sheet" + sheetId;

        // Append the new worksheet and associate it with the workbook.
        Sheet sheet = new Sheet() { Id = relationshipId, SheetId = sheetId, Name = sheetName };
        sheets.Append(sheet);
    }
}

1
感谢提供详细信息。我理解转向OpenXML的原因,但不幸的是,由于其他原因,我必须留在Interop上。为了解决问题,我正在安装Excel(作为先决条件)来运行我的程序。 - Mahender

16

即使Microsoft也不建议在服务器上使用Interop库。所以最好找一些替代框架来处理Excel。我过去成功地使用Npoi来实现这个目的。

我知道这不是你异常的答案。但老实说,Interop是一条通往无尽麻烦和晦涩异常信息的路。

更新于2017年:我已经有一段时间没有使用NPOI了,并且把所有的项目都转移到了EPPlus——一个基于OpenXML的库,可以创建现代的xlsx文件。


3
+1 for Npoi. 我发现它是处理Excel文档最好的免费库。可以处理 .xls 和 .xlsx 格式的文件。 - burnttoast11
2
+1 for Npoi,"Interop是一条通往无尽麻烦和神秘异常消息的道路。" 是的,它真的很伤人。 - NeverHopeless
EPPlus 5及以上版本需要商业使用许可证,之前的版本可以免费使用。 - Sumia

1

从我之前进行的所有研究来看,当我需要在服务器上与Excel文件交互时,您必须安装Office。


0

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