【问题标题】:How to close ExcelPackage using EPPlus in C#?如何在 C# 中使用 EPPlus 关闭 ExcelPackage?
【发布时间】:2014-11-27 06:33:03
【问题描述】:

我正在使用 epplus 在一个文件中写入一个 excel 模板中的大量信息,但是我需要关闭 ExcelPackage 才能与 Excel 应用程序一起使用。它向我抛出了这个异常:“System.Runtime.InteropServices.COMException (0x800A03EC): Exception from HRESULT: 0x800A03EC”

    private void FillCardsSheet()
    {
        xlPackage = new ExcelPackage(Template);

        wsCards = xlPackage.Workbook.Worksheets[4];

        string command = "SELECT * FROM dbo_serial_cards WHERE type <> 'EXT' AND LEFT([device_tag], 2) <> '!!'";
        OleDbCommand cmd = new OleDbCommand(command, CON);
        OleDbDataReader reader = cmd.ExecuteReader();
        int row = 1;
        while (reader.Read())
        {
            row++;
            for (int col = 1; col <= 16; col++)
            {
                wsCards.Cells[row, col].Value = reader.GetValue(col - 1);
            }
        }

        xlPackage.SaveAs(Template);
        xlPackage.Dispose();
    }

【问题讨论】:

  • 你从哪里得到异常?什么线? EPPlus 根本不使用 COM。
  • 0x800A03EC = ERROR_INVALID_FLAGS。我认为这是来自 OleDb 的东西 - EEPlus 不会自动化 Excel 吧?

标签: c# excel epplus


【解决方案1】:

很难说没有有关您的连接和对象的更多详细信息。什么是“模板”?如果您说哪一行产生了错误(如提到的@mason),可能会有所帮助。那是您似乎遇到的 COM 错误,因此它可能与 db 连接或程序包本身有关。由于包是在方法之外进行管理的,请确保它没有被锁定或关闭。

这对我连接到本地 SQL Server 数据库很有效:

[TestMethod]
public void SQL_Reader_Test()
{
    var Template = new FileInfo(@"c:\temp\temp.xlsx");
    if (Template.Exists)
        Template.Delete();

    var xlPackage = new ExcelPackage(Template);

    //var wsCards = xlPackage.Workbook.Worksheets[4];
    var wsCards = xlPackage.Workbook.Worksheets.Add("Cards");

    //const string constring = @"Provider=Microsoft.ACE.OLEDB.12.0;Data Source=C:\temp\northwind.mdb;Persist Security Info=False;";
    const string constring = @"Provider=SQLNCLI11;Data Source=MYMACHINENAME\SQLEXPRESS;Initial Catalog=AdventureWorks;UID=AdventureWorks; Pwd=AdventureWorks";

    using (var CON = new OleDbConnection(constring))
    {
        CON.Open();

        //string command = "SELECT * FROM dbo_serial_cards WHERE type <> 'EXT' AND LEFT([device_tag], 2) <> '!!'";
        const string command = "SELECT * FROM Person.Address";
        var cmd = new OleDbCommand(command, CON);
        var reader = cmd.ExecuteReader();

        int row = 1;
        while (reader.Read())
        {
            row++;
            //for (int col = 1; col <= 16; col++)
            for (int col = 1; col <= reader.FieldCount; col++)
            {
                wsCards.Cells[row, col].Value = reader.GetValue(col - 1);
            }
        }

        xlPackage.SaveAs(Template);
        xlPackage.Dispose();
    }
} 

【讨论】:

  • Template 是一个 FileInfo,其中包含我正在使用的 excel 模板的路径
  • 哪一行导致代码中的错误?
  • xlPackage.SaveAs(模板);
  • 好的,所以肯定是excel/com的问题。如果您像我上面那样创建一个全新的 Excel 文件和工作表,问题会消失吗?模板文件 - 是真正的 XLSX 而不是 XLS 或 XLTX?
  • 它是一个 xlsm,因为稍后我需要运行一个宏来创建一个 .fhx
【解决方案2】:

尝试在 Using-Block 中使用 ExcelPackage:

using (ExcelPackage xlsPackage = new ExcelPackage(Template))
{
    // Your Code
    xlPackage.SaveAs(Template);
}

【讨论】:

  • EPPlus examples 都没有using 块或调用Dispose()。我猜这没有必要,因为它纯粹是托管代码,不使用任何外部资源。
  • EPPlus 不使用 COM。 OP 无论如何都会处理这个包。
  • 使用块本质上与调用 Dispose() 相同。
  • @mason 好吧,我从 EPPlus 获得的所有示例都有一个 using-Block,即使是您所指的 ;)
猜你喜欢
  • 1970-01-01
  • 2016-05-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-03
  • 2017-08-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多