Может ли документ Excel быть загружен в память, заполнен и возвращен в байтах? - PullRequest
1 голос
/ 07 февраля 2012

Ранее я работал с Excel Interop с целью открытия файла Excel, записи в него некоторых данных и его сохранения. Примерно так:

public void WriteAFile()
{
    var xlApp = new Excel.ApplicationClass();
    var xlWorkbook = xlApp.Workbooks.Add(Missing.Value);
    var xlWorksheet = (Excel.Worksheet)xlWorkbook.Worksheets.get_Item(1);

    xlWorksheet.Name = "Some Name";

    // Write some contrived data
    for (var i = 0; i < 10; i++)
    {
        xlWorksheet.Cells[i + 1, 1] = i;
        xlWorksheet.Cells[i + 1, 2] = i + 1;
        //... and so on...
    }
    //... and so on...

    // Save the file
    xlWorkbook.SaveAs(
      @"",
      Excel.XlFileFormat.xlWorkbookNormal,
      Missing.Value,
      Missing.Value,
      false,
      false,
      Microsoft.Office.Interop.Excel.XlSaveAsAccessMode.xlNoChange,
      Excel.XlSaveConflictResolution.xlLocalSessionChanges,
      false,
      Missing.Value,
      Missing.Value,
      Missing.Value
    );

    xlWorkbook.Close(true, Missing.Value, Missing.Value);
    xlApp.Quit();

    // release other resources, etc.
}

Это работает достаточно хорошо для записи приложения в файл на локальной рабочей станции. Однако сейчас я работаю над веб-приложением, которому нужно вернуть файл пользователю. Проблема в том, что файл в файловой системе не может быть изменен. Итак, что мне нужно сделать, это:

  1. Загрузить известный файл Excel в память (обратите внимание, что файл .xlsm содержит макрос-код, который будет запускаться на рабочей станции пользователя при загрузке).
  2. Записать известные данные в известное место в файле (ради аргумента, некоторые числовые значения в первые несколько ячеек на листе 99).
  3. Потоковая передача этого файла из памяти через веб-приложение (потоковая часть тривиальна, в первую очередь она получает массив байтов, что мне кажется более хитрым).

Я гуглил вокруг, но ничего не нашел. В основном только инструкции и примеры, которые делают то, что я уже делаю в моем коде выше. Также неудивительно, что при работе с COM-взаимодействием мой приведенный выше код (который довольно старый) и другой код, который я нахожу в сети, немного устарели. Мы используем .NET 4.0, поэтому все, что доступно там, подходит нам.

Степень моего опыта работы с COM в значительной степени показана в приведенном выше коде. Я бы предпочел вообще не использовать COM для этого, если это вообще возможно. Но сейчас у меня просто проблемы с отрывом от земли. Кто-нибудь может указать мне правильное направление? Может быть, ссылаться на некоторые классы или методы, которые будут здесь особенно полезны? Спасибо.

PS Еще одна вещь, которая меня пугает, - это необходимость использования Excel на веб-сервере, а также возможность открытия приложения Excel на консоли веб-сервера и зависания пользователя. какая-то невидимая ошибка Так что любой совет там очень ценится.

Ответы [ 4 ]

3 голосов
/ 10 февраля 2012

Я использовал библиотеку ClosedXML .(Сам по себе OpenXML был ... громоздким.) В качестве простого доказательства концепции открытия файла, записи части данных и возврата байтового массива:

public byte[] GetExcelApplication(Guid sessionKey)
{
    // Input checking

    using (var workbook = new XLWorkbook(_excelFile))
    {
        var worksheets = workbook.Worksheets.Where(w => w.Name == "Session Key");
        if (worksheets.Count() < 1)
            throw new Exception("Excel file does not contain a worksheet called: Session Key");
        if (worksheets.Count() > 1)
            throw new Exception("Excel file contains multiple worksheets called: Session Key");

        var worksheet = worksheets.Single();
        var cell = worksheet.Cell("A1").Value = sessionKey.ToString();

        using (var ms = new MemoryStream())
        {
            workbook.SaveAs(ms);
            return ms.ToArray();
        }
    }
}
1 голос
/ 07 февраля 2012

С c # 4.0 COM должно быть немного проще, так как вы можете использовать динамический.Но это тогда еще COM.Я использую продукт вечеринки для вечеринок, который называется aspose cell .Я не работаю на них, но мне действительно нравится этот продукт (даже если он не бесплатный).Это избавит меня от многих проблем при работе с Excel.

0 голосов
/ 08 февраля 2012

Старая школа, но Я написал это очень давно , которая создает книгу на лету и экспортирует ее.Может быть, это поможет вам выбрать правильный путь?

0 голосов
/ 08 февраля 2012

Делая что-то похожее с COM, я прибег к сохранению сгенерированной книги Excel во временную папку, ее отправке и последующему удалению.Не использовать COM на самом деле не вариант для меня, так как рабочей книге также нужны сводные таблицы и созданные графики.

...