Comments 4
Подскажите, какая из них может писать генерируемый Excel файл в однонаправленный write-only поток, который, например, предоставляет ASP.NET в Request.Body? Ну то есть чтобы можно было начать отдавать файл в процессе генерации.
О, таких статей я прочитал достаточно, об этом пишут многие)) Но практически никто не заходит дальше. Например, как работать с OLE объектами? В случае с Interop.Excel всё просто (но для работы нужен офисный пакет на машине):
Application excel = new() { Visible = false };
Workbook book = excel.Workbooks.Open(fileName);
Worksheet sheet = book.Worksheets[1];
OLEObjects objects = sheet.OLEObjects();
objects.Delete();
book.SaveAs(fileName2);
book.Close();
excel.Quit();
Marshal.ReleaseComObject(sheet);
Marshal.ReleaseComObject(book);
Marshal.ReleaseComObject(excel);
В NPOI (она же Apache POI) вроде что-то есть, но документация какая-то дурацкая. В остальных библиотеках нагуглить не получилось.
Пользуясь случаем, задам вопрос: как в NPOI корректно удалить "встроенные объекты"? Например, юзеры вставляют pdfки в файлы экселя, и перед копированием на сервер эти файлы нужно почистить. Набросал код:
using FileStream file = new(fileName, FileMode.Open, FileAccess.Read);
POIFSFileSystem fs = new(file);
DirectoryNode root = fs.Root;
var mbds = root.Where(r => r.Name.StartsWith("MBD")).ToList();
List<DocumentEntry> docs = [];
foreach (var mbd in mbds.Cast<DirectoryEntry>())
{
var entries = mbd.Entries;
while (entries.MoveNext())
{
var entry = (DocumentEntry)entries.Current;
docs.Add(entry);
}
}
docs.ForEach(doc => doc.Delete());
mbds.ForEach(mbd => mbd.Delete());
using FileStream _out = new(fileName2, FileMode.Create, FileAccess.Write);
fs.WriteFileSystem(_out);
fs.Close();
При вызове метода Delete()
изменения в root
происходят, но в конечном файле ничего не меняется. Как всё-таки нужно фиксировать эти изменения?
Документация: https://poi.apache.org/components/poifs/how-to.html
Самый простой способ импорта из БД в Excell это в самом Excell использовать вкладку Данные, создать подключение к БД и его настроить, создав SQL запрос. Без всяких языков прораммирования, только через SQL. А в общем я использую Excell в своих системах через OLE Automation вместо генератора отчетов. Это в общем несложно (если знаешь как рулить командами Excell ) и дает большую свободу для работы с шаблонами отчетов, к тому же отчет получается редактируемым и пользователи могут сохранять его куда им надо.
Экспорт данных из базы данных в Excel на C#: 5 проверенных методов