Файл Excel с несколькими листами из отчетов SSRS - PullRequest
1 голос
/ 08 декабря 2009

Допустим, у меня есть 3 байтовых массива, каждый из которых представляет собой файл .xls. Как я могу объединить их в один файл XLS с 3 листами. Отчеты SSRS очень богаты и включают диаграммы sp oledb не вариант.

Производительность не важна, поэтому я мог бы при необходимости сохранить их на диск, в качестве последнего средства я мог бы даже использовать макрос Excel (если бы я знал, как это сделать). Я пытался использовать microsodt.office.interop.excel, но мне удалось только добавить новый лист в файл, но я не смог добавить существующий лист.

Любая помощь будет оценена.

Ответы [ 3 ]

5 голосов
/ 08 декабря 2009

Мне кажется, что вам просто нужен способ программной записи байтовых массивов в рабочую книгу.
Вот метод, который записывает байт [] в виде листа в конкретную рабочую книгу:

public static void WriteToSheet(string targetBookPath, byte[] fileBytes)
{
    try {
        
        object x = Type.Missing;
        
        //Create a temp file to encapsulate Byte array
        string tmpPath = IO.Path.ChangeExtension(IO.Path.GetTempFileName(), ".xls");
        My.Computer.FileSystem.WriteAllBytes(tmpPath, fileBytes, false);
        
        //Start Excel Application (COM)
        Excel.Application xlApp = new Excel.Application();
        
        //Open target book
        Excel.Workbook targetBook = xlApp.Workbooks.Open(targetBookPath, x, x, x, x, x, x, x, x, x, 
        x, x, x, x, x);
        
        //Open temp file with Excel Interop
        Excel.Workbook sourceBook = xlApp.Workbooks.Open(tmpPath, x, x, x, x, x, x, x, x, x, 
        x, x, x, x, x);
        
        //Get a reference to the desired sheet 
        Excel.Worksheet sourceSheet = (Excel.Worksheet)sourceBook.Worksheets(1);
        
        //Copy the temp sheet into WorkBook specified as "Before" parameter
        Excel.Worksheet targetBefore = (Excel.Worksheet)targetBook.Worksheets(1);
        try {
            sourceSheet.Copy(targetBefore, x);
            
            //Save and Close
            sourceBook.Close(false, x, x);
            targetBook.Close(true, x, x);
            xlApp.Workbooks.Close();
                
            xlApp.Quit();
        }
        catch (Exception ex) {
            Debug.Fail(ex.ToString);
        }
        finally {
            
            //Release COM objects
            //   Source
            DESTROY(sourceSheet);
            DESTROY(sourceBook);
            
            //   Target
            DESTROY(targetBefore);
            DESTROY(targetBook);
            
            //   App
                
            DESTROY(xlApp);
        }
        
        //Kill the temp file
            
        My.Computer.FileSystem.DeleteFile(tmpPath);
    }
    catch (Exception ex) {
        Debug.Fail(ex.ToString);
    }
}

Метод DESTROY освобождает COM, что очень важно:

public static void DESTROY(object o)
{
    try {
        System.Runtime.InteropServices.Marshal.ReleaseComObject(o);
    }
    catch (Exception ex) {
        Debug.Fail(ex.ToString);
        ErrorLog.Write(ex.ToString);
    }
    finally {
        o = null;
    }
}

Если я правильно понимаю, все, что вам нужно сделать, это:

  1. Создание новой рабочей книги
  2. Цикл байтовых массивов
  3. Вызовите WriteToSheet для каждого байтового массива
1 голос
/ 22 декабря 2009

Должны ли листы быть сформированы как отдельные отчеты и затем объединены? SoftArtisans OfficeWriter может программно комбинировать несколько электронных таблиц из байтовых массивов, но у нас также есть SSRS интеграция , которая позволит вам создавать отчеты из нескольких листов напрямую. Используя надстройку OfficeWriter Designer Excel, вы можете создать отчет с 3 рабочими листами прямо в Excel и опубликовать его в SSRS.

Отказ от ответственности: я работаю на SoftArtisans

0 голосов
/ 08 декабря 2009

SpreadsheetGear for .NET может сделать это:

  • Загрузка исходных рабочих книг из байтовых массивов с помощью SpreadsheetGear.Factory.GetWorkbookSet (). Workbooks.OpenFromMemory (byte []). В зависимости от источника байтовых массивов, вы можете предпочесть загрузку непосредственно из потока с помощью GetWorkbookSet (). Workbooks.OpenFromStream (поток System.IO.Stream).
  • Создайте новую книгу назначения с помощью Factory.GetWorkbook () или откройте книгу назначения шаблона с помощью Factory.GetWorkbook (строковое имя файла).
  • Копирование листов из каждой из исходных книг с помощью SpreadsheetGear.ISheet.CopyAfter или ISheet.CopyBefore.
  • Сохраните целевую книгу с помощью IWorkbook.SaveAs (строковое имя файла, FileFormat fileFormat), IWorkbook.SaveToMemory (FileFormat fileFormat) или IWorkbook.SaveToStream (поток System.IO.Stream, FileFormat fileFormat).

Вы можете увидеть несколько примеров ASP.NET здесь и загрузить бесплатную пробную версию здесь .

Существует пример «Рабочий лист с диаграммой для нескольких рабочих листов с диаграммами», который может быть несколько полезен на нашей странице примеров отчетов Excel здесь .

Отказ от ответственности: я владею SpreadsheetGear LLC

...