Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何在C中使用EPPlus关闭ExcelPackage?_C#_Excel_Epplus - Fatal编程技术网

C# 如何在C中使用EPPlus关闭ExcelPackage?

C# 如何在C中使用EPPlus关闭ExcelPackage?,c#,excel,epplus,C#,Excel,Epplus,我正在使用epplus在文件中写入excel模板中的大量信息,但是我需要关闭ExcelPackage以便与excel应用程序一起使用。它向我抛出以下异常:System.Runtime.InteropServices.COMException 0x800A03EC:来自HRESULT的异常:0x800A03EC private void FillCardsSheet() { xlPackage = new ExcelPackage(Template);

我正在使用epplus在文件中写入excel模板中的大量信息,但是我需要关闭ExcelPackage以便与excel应用程序一起使用。它向我抛出以下异常:System.Runtime.InteropServices.COMException 0x800A03EC:来自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();
    }

尝试在Using块中使用ExcelPackage:

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

如果没有关于连接和对象的更多详细信息,很难说。什么是“模板”?如果您说出哪一行生成了@mason提到的错误,可能会有所帮助。这是一个COM错误,你似乎得到了,所以它可能是与数据库连接或包本身。由于包是在方法外部管理的,请确保它未被锁定或关闭

这对连接到本地SQL Server db的我来说很好:

[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();
    }
} 

你从哪里得到例外?什么线路?EPPlus根本不使用COM。0x800A03EC=错误\无效\标志。我假设这是从OleDb的东西-EEPlus将不会自动Excel,不是吗?没有一个使用块或调用Dispose。我猜这是没有必要的,因为它完全在托管代码中,不使用任何外部资源。OP无论如何都在处理包。using块基本上与调用Dispose相同。@好吧,我从EPPlus得到的所有示例都有一个using块,即使是您提到的;Template是一个文件信息,带有我正在使用的excel模板的路径。哪一行导致代码中的错误?xlPackage.saveaTemplate;好的,这肯定是excel/com的问题。如果像我上面所做的那样创建一个全新的excel文件和工作表,问题会消失吗。模板文件-是真正的XLSX而不是XLS或XLTX吗?它是xlsm,因为稍后我需要运行宏来创建.fhx