Pull to refresh

Comments 37

Interop вроде же устаревший моветон? Open XML наше все. И работает быстрее на несколько порядков.
Уважаемый leremin, если Вам не лень — то «пример в студию» (благо open source). Сам с удовольствием поучусь — вдруг где-нибудь, да пригодится…
Честно, лень. Но вечером может напишу тоже самое на OpenXML и выложу. Там идея в том, что в Interop вы фактически эмулируете действия пользователя, которые обрабатываются Excel, а в случае OpenXML — вы просто создаете XML документ, т.е. хоть в 100 потоков на кластере это можно делать. Отсюда и скорость, нет накладных расходов на обработку событий в Excel.

А по существу вопроса, в комплекте OpenXML SDK есть программа, которая по xlsx файлу может получить исходник на C#, который создаст этот документ. Да, там код адски перегружен, но учился я так.
Когда-то, давным давно, у меня была задача достаточно оперативно передавать в Excel довольно большие объемы достаточно часто (2.5 Msp ADC PCI board), и я с ней справился. Правда, тогда был задействован C++ (или C-шный) «bridge», native API Excel-а. Работало достаточно «живенько», считало средствами Excel FFT в real time практически, и было очень востребовано «непродвинутыми» учеными (которым чем проще, тем лучше).

В этой крохотной программке я столкнулся с тем, что иначе, чем «попиксельно» (cell by cell) не получается, подробностей, к сожалению, не помню.

Поскольку я в этой области на «искперта» ну никак не претендую, буду рад увидеть мастер-класс от вас, чисто ради интереса.
Вечером, возможно, не до этого. Но надо понимать, что Interop и OpenXML — это две большие разницы. В первом случае вы работаете с Word/Excel/PowerPoint, а во-втором — с xml иерархией. Например, для автоподбора ширины столбцов в таблице — нужно нажать одну кнопку в Word, соответственно — один метод в Interop. А в OpenXML вы должны будете этот метод сами реализовать, т.е. посчитать оптимальную ширину и задать всем столбцам.

Я тоже не эксперт, но и Interop можно сильно ускорить, нужно минимизировать количество вызовов методов. Например, сгенирировать текстовый файл средствами C# и импортировать его в книгу средствами Excel вместо того, чтобы заполнять ячейки в цикле Но в данном случае это не то.
Ну, попробуйте, спортивного интереса ради, ведь за язык вас никто не тянул ;) Я прекрасно понимаю, как устроен OpenXML, да и любой, не имеющий представления, может переименовать ,xlsx файл в .zip, открыть через архиватор/Far и посмотреть, что внутри архива.
Зачем переименовывать? Ctrl+PgDn
Там ошибка с индексами стиля была. Вот так вроде без артефактов рисуется.
Спасибо, идея понятна, только у вас код с ошибкой — крешится на не квадратных картинках (но для простоты и так сойдет), и результат для изображения 1024x1024 не открывается в MS Excel.

Может быть, я это написал на коленке. И половину времени гуглил, как цвет ячейки задать — никогда не приходилось.

Да понятно, я без претензий (собственно, это и было одним из «условий» «задачи» — чтобы «на коленке и не напрягаясь»). Действительно, через OpenXml намного быстрее, по понятным причинам (через interop могло бы быть тоже быстро, если бы можно было задавать цвета Range-ем — но тогда что-то не получилось с этим).

Непонятно только, почему Excel ругается на большие «картинки»-таблицы. Вы в Excel-е проверяли, или только в Open Office?

Открывал только в Excel 2016.

Угу, я именно в Excel 2016 и пробовал. А вот результат обработки 512x512 открывается отлично. Ну да это мелочи, фиг с ним, непринципиально.

Довольно удобно работать через OpenXml; добавлю в «копилку», на случай, если придется столкнуться. Спасибо за хорошую идею!
leremin имплеменировал non-SAX style (думаю, кто работает с XML знаком термин), если перейти на него + немного пооптимизировать, то получится в разы быстрее, выйти на время <1 сек вполне реально, попробую поучаствовать в челлендже вечерком.

К примеру, у нас на сервере задача генерировать >1M записей таблицы (без формул, чисто репорты) с минимальным потреблением памяти и максимальной производительностью. На простеньком i7 devstation OpenXML (SAX) дает ~600k cells per second (1М ячеек где-то за ~1.6 секунды).
Интересно, что на больших файлах Excel ругается на стили: 128x128 открывается, 256x256 — уже нет. Надо будет посмотреть что там в вашем случае.
Может не проходит по каким-то из ограничений?
Там для Excel 2013\2016 ограничение на 64000 уникальных стиля ячейки. А 256х256 — это несколько больше уже. И тут уже надо оптимизировать — создавать таблицу стилей и привязывать к ячейке строго определённые, чтобы не выходить за пределы.
Но цветов-то меньше. Я дубликаты цветов убирал, но вообще — да, скорее всего что-то такое и есть.
Мне кажется, когда к каждой ячейке применяют форматирование отдельно, пусть даже одинаковое — это всё равно считается за уникальный стиль. Применять надо диапазонами, скорее всего.

Предлагаю потестировать на одноцветном изображении — когда каждой ячейке индивидуально присваивается цвет и когда на весь диапазон он применяется.
Ну можно в части случаев совместить подходы: заполнять OpenXML, а потом украшать/форматировать — Interop

Кстати был еще и третий вариант — плевать из clipboard (понятно, что с кучей оговорок, нюансов и ограничений)…

Ну на практике я их и комбинирую. Если нужно бланк заполнить, то естественно проще сбацать шаблон и по закладкам вставить нужный текст через Interop, например.
Про пользу это вы зря.) Возможно кому нибудь нужно будет руками экспортировать данные в xsl(x) в изображениями
Что любопытно: проверил линк из статьи на демонстрационный xlsx, который открывается через online-овый Excel — очень любопытно Microsoft отрисовывает ;) Даже на моем Lumia 950 получается гораздо быстрее. Вот так, получился неплохой тестовый case для MS ;)

Очень интересно наблюдать, в какой последовательности отрисовываются/рендерятся ячейки таблицы! Если при работе моей программки все понятно, то в случае MS я оказался в затруднении, честное слово…
Wow, что еще любопытнее, так это то, что Chrome отрисовывает все (хотя и по странной логике программистов MS, и довольно медленно), Firefox гордо пытается, но в конце практически «сдыхает», а IE и Edge тупо рендерят какую-то фигню с «мусором», после чего тупо «отваливаются» ;)

У меня FF нормально отрисовал

LibreOffice 5.0 начал открывать, ушел в себя и не вернулся
Эх… Несколько минут назад попытался открыть файлик в OpenOffice и LibreOffice.
Всё ещё жду результата. Каждый забрал себе целиком по ядру процессора и активно прогревают воздух в комнате.
Если всё-таки откроется, хочу попробовать пересохранить в ODT и открыть снова :)
Пользуйтесь ONLYOFFICE). И десктоп и онлайн открывает запросто)
Я таки открыл и в Либре и в Опен.
Первый даже смог отобразить фото, второй — только серый фон.
Либре изрядно тормозил и зависал.
Сохранил в ODT — открывает чуть быстрее, но так же тормозит.

За предложение спасибо, но меня либре вполне устраивает.
А еще можно яичеки заполнить текстом того же цвета, что и заполнение. Получится стеганография.
Хехе, мне данная статья напомнила о моих потугах с рисованием BMP файла в html5 canvas попиксельно (через js), гдето даже код валяется))
По-моему через это в том или ином виде прошли почти все.
Не умеет правильно считать пропорции :(
попробуйте фотку 2x3
Не дай бог это попадёт к бухгалтерам. Пусть лучше в Word картинки вставляют.
Вариант когда заказчик, который задерживает выплату, просит выслать исходники таблицы в электронном виде:
1. Из экселя делаем принтсрин или печатаем на виртуальный принтер в виде картинки
2. Конвертируем картинку таблицы с помощью программы автора в эксель в «удобном» для редактирования виде.
3. Ждем выплат >:$
Sign up to leave a comment.

Articles