簡體   English   中英

如何在C#中使用EPPlus關閉ExcelPackage?

[英]How to close ExcelPackage using EPPlus in C#?

我正在使用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();
    }

如果沒有有關連接和對象的更多詳細信息,很難說。 什么是“模板”? 如果您說哪一行會產生錯誤,可能會有所幫助(例如提到的@mason)。 那是您似乎正在得到的COM錯誤,所以它可能與數據庫連接或程序包本身有關。 由於包是在方法外部進行管理的,因此請確保未鎖定或關閉它。

這對我連接到本地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();
    }
} 

嘗試在Using-Block中使用ExcelPackage:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM