Pull to refresh

Comments 4

Подскажите, какая из них может писать генерируемый Excel файл в однонаправленный write-only поток, который, например, предоставляет ASP.NET в Request.Body? Ну то есть чтобы можно было начать отдавать файл в процессе генерации.

Из-за того как устроен сам формат xlsx - такие вряд-ли существуют.

Возможно вам стоит посмотреть в сторону других форматов

О, таких статей я прочитал достаточно, об этом пишут многие)) Но практически никто не заходит дальше. Например, как работать с 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 ) и дает большую свободу для работы с шаблонами отчетов, к тому же отчет получается редактируемым и пользователи могут сохранять его куда им надо.

Sign up to leave a comment.

Articles