JoJo82 Ответов: 3

Загрузите книгу excel из потока памяти.


Привет,

Я пытаюсь выполнить некоторую обработку excel с помощью excel interop, а затем отобразить ее в winform. Мой источник данных-memorystream.

Почему excel interop? Чтобы позже я мог отобразить его в winform с помощью edraw office viewer.

После нескольких дней поиска в интернете по загрузке книги excel и рабочего листа из memorystream я обнаружил, что могу использовать для этого epplus. Ссылка находится от http://stackoverflow.com/questions/5738123/using-epplus-with-a-memorystream[^]

Если я правильно понимаю, epplus-это office open xml, а не excel interop. Как преобразовать тип книги epplus в тип книги excel interop, чтобы я мог выполнять обработку excel?

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

Кстати, я использую .net 4.0, а мой memorystream-из excel 2007.

3 Ответов

Рейтинг:
2

Vali Maties

Вместо использования

Path.GetTempPath()
и
Path.GetFileNameWithoutExtension(Path.GetRandomFileName())
лучше использовать
TempFileCollection()
от
System.CodeDom.Compiler
:

using (var tempfile = new TempFileCollection())
{
    string filePath = tempfile.AddExtension("temp"); // or whatever you want to use
    using (FileStream fs = new FileStream(filePath, FileMode.OpenOrCreate))
    {
        fs.Write(YourByteArray, 0, YourByteArray.Length);
    }
    // Here is your code of what you want to do with this file, fill it, print it, or whatever
}
// Here the file is deleted automatically


Рейтинг:
1

Matej Hlatky

Почему бы вам просто не сохранить содержимое вашего потока памяти во временный файл и нормально обработать этот файл с помощью приложения Excel?
Смотрите мой пример кода:

// Get content of your Excel file
var ms = new MemoryStream(...);

// Get temp file name
var temp = Path.GetTempPath(); // Get %TEMP% path
var file = Path.GetFileNameWithoutExtension(Path.GetRandomFileName()); // Get random file name without extension
var path = Path.Combine(temp, file + ".xlsx"); // Get random file path

using (var fs = new FileStream(path, FileMode.Create, FileAccess.Write))
{
    // Write content of your memory stream into file stream
    ms.WriteTo(fs);
}

// Create Excel app
Excel.Application excel = new Excel.Application();

// Open Workbook
excel.Workbooks.Open(path, ReadOnly: true);


JoJo82

Я действительно думал об этом. Однако из-за чувствительности информации, содержащейся в потоке памяти, я предпочитаю не сохранять ее в файл, если это возможно.

Matej Hlatky

Вместо временной папки вы можете использовать свою собственную рабочую папку, например C:\top-secret с правильно установленными разрешениями безопасности.
После обработки файла перепишите его содержимое случайно сгенерированными байтами и удалите его.

JoJo82

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

Matej Hlatky

Привет, к сожалению, у меня нет опыта работы с такого рода сценариями... это была только основная идея.
Просто посмотри в справочнике.Метод CreateDirectory (String, DirectorySecurity).

Member 12080968

может быть, нужна эта ссылка
https://stackoverflow.com/questions/15285880/how-to-reference-microsoft-office-interop-excel-dll