Пустой лист - Microsoft.Office.Interop.Excel - PullRequest
0 голосов
/ 05 марта 2012

Я уже давно борюсь с этим. Я использую Microsoft.Office.Interop.Excel и пытаюсь сделать следующее:

У меня есть шаблон, который я сделал в Excel с 4 рабочими листами. Когда я пытаюсь заполнить рабочие листы, всегда остается один пустой лист, хотя при отладке я вижу, что выбран правильный рабочий лист, и каждому объекту Range присваивается значение без каких-либо ошибок.

В этом методе есть 2 итерации. Если я закомментирую одну из итераций, другая итерация будет работать отлично. Так что в основном я всегда получаю один пустой лист.

Есть идеи, где я ошибаюсь?

Заранее спасибо!

public void generateReport()
    {
        Excel.Application xlApp;
        Excel.Workbook xlWorkBook;
        Excel.Worksheet xlWorkSheet;
        object misValue = System.Reflection.Missing.Value;
        Excel.Range range;
        int row = 3;
        xlApp = new Excel.Application();
        if (xlApp == null)
        {
            MessageBox.Show("Kon Excel niet starten, kijk uw softwareinstelling na !");
            return;
        }

        string workbookPath = Path.Combine(Environment.CurrentDirectory, @"..\report.xlsx");
        xlWorkBook = xlApp.Workbooks.Open(workbookPath,
            0, false, 5, "", "", false, Excel.XlPlatform.xlWindows, "",
            true, false, 0, true, false, false);


        xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(1);
        ArrayList dossiers = DossierDao.Instance.getDossiers("SELECT * FROM dossier ORDER BY referentie;");
        foreach (Object o in dossiers)
        {
            File f = (File)o;
            range = xlWorkSheet.get_Range("A" + row);
            range.Value = d.Reference;
            range = xlWorkSheet.get_Range("B" + row);
            range.Value = d.Info;
            row++;
        }

        xlWorkSheet = (Excel.Worksheet)xlWorkBook.Worksheets.get_Item(3);
        ArrayList facturen = FactuurDao.Instance.getAllFacturen();
        foreach (Object o in facturen)
        {
            Invoice i = (Invoice)o;
            range = xlWorkSheet.get_Range("A" + row);
            range.Value = f.InvoiceNumber;
            range = xlWorkSheet.get_Range("B" + row);
            range.Value = f.Amount;
            row++;
        }
        try
        {
            xlApp.Visible = true;
        }
        catch

           //...
        }

        releaseObject(xlApp);
        releaseObject(xlWorkBook);
        releaseObject(xlWorkSheet);
        releaseObject(xlWorkSheet);
    }

    private void releaseObject(object obj)
    {
        try
        {
            System.Runtime.InteropServices.Marshal.ReleaseComObject(obj);
            obj = null;
        }
        catch (Exception ex)
        {
            obj = null;
            MessageBox.Show("Unable to release the Object " + ex.ToString());
        }
        finally
        {
            GC.Collect();
        }
    }
}

1 Ответ

1 голос
/ 05 марта 2012

Вы не реинициализируете row между обработкой досье и фактурена. Таким образом, если у вас есть 50 досье в строках с 3 по 52, код начнет размещать фактурен в строке 53 следующего листа.

...