"… и в каждой шутке есть доля шутки"

image

Не так давно я опубликовал маленькую заметку о небольшой программе, которую я разработал для приятеля. К моему удивлению, она получила неплохие отзывы и «пришлась ко двору» некоторым «хабровчанам».

Я подумал и решил поделиться ссылками на другие свои «крохотульки», маленькие разработки, опубликованные open source. Number #2 будет небольшая программа-шутка, превращающая картинку в формате jpeg в Excel spreadsheet;)

Идея данной программы-шутки родилась в процессе «пивной вечеринки» с друзьями-программистами. Речь зашла о нестандартных форматах хранения изображений; после обсуждения идеи хранения изображения (или любого «бинарника») в двоичном формате в виде распечатанного на лазерном или струйном принтере листе бумаги, с последующим сканированием и распознаванием, мне пришла в голову мысль об использовании фонового цвета ячеек таблицы Excel.

Сказано — сделано, реализация заняла чуть больше времени, нежели «гугление» работы с MS Excel. Программка не оптимизированна, работает достаточно медленно (потому, что рисует pixel by pixel), обрабатывает только jpeg формат. Я уверен, что умельцы — знатоки работы с MS Excel, смогут ускорить ее в разы (но, прежде чем заняться этим, подумайте — нужно ли? Ведь смысла и пользы от данной программки практически ноль!).

Саму программку, и ее простейший исходный код, вы можете скачать с Codeplex-а. Таблицу Excel, содержащую фотографию милой девушки (спасибо, гугл!) в заголовке, можно скачать вот тут (вирусов нет!).

Быть может, исходный код данной программки поможет кому-то в освоении взаимодействия с MS Excel из C#, ну, или просто даст вам небольшой повод улыбнуться, и вспомнить, что в нашей интереснейшей профессии всегда остается время для «нашенского», специфического юмора и шуток:)

Комментарии (10)

  • 22 января 2017 в 10:25 (комментарий был изменён)

    0

    Interop вроде же устаревший моветон? Open XML наше все. И работает быстрее на несколько порядков.
    • 22 января 2017 в 10:30

      0

      Уважаемый leremin, если Вам не лень — то «пример в студию» (благо open source). Сам с удовольствием поучусь — вдруг где-нибудь, да пригодится…
      • 22 января 2017 в 10:43

        0

        Честно, лень. Но вечером может напишу тоже самое на OpenXML и выложу. Там идея в том, что в Interop вы фактически эмулируете действия пользователя, которые обрабатываются Excel, а в случае OpenXML — вы просто создаете XML документ, т.е. хоть в 100 потоков на кластере это можно делать. Отсюда и скорость, нет накладных расходов на обработку событий в Excel.

        А по существу вопроса, в комплекте OpenXML SDK есть программа, которая по xlsx файлу может получить исходник на C#, который создаст этот документ. Да, там код адски перегружен, но учился я так.

        • 22 января 2017 в 10:53

          0

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

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

          Поскольку я в этой области на «искперта» ну никак не претендую, буду рад увидеть мастер-класс от вас, чисто ради интереса.

          • 22 января 2017 в 11:29

            0

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

            Я тоже не эксперт, но и Interop можно сильно ускорить, нужно минимизировать количество вызовов методов. Например, сгенирировать текстовый файл средствами C# и импортировать его в книгу средствами Excel вместо того, чтобы заполнять ячейки в цикле Но в данном случае это не то.

            • 22 января 2017 в 11:40

              0

              Ну, попробуйте, спортивного интереса ради, ведь за язык вас никто не тянул ;) Я прекрасно понимаю, как устроен OpenXML, да и любой, не имеющий представления, может переименовать , xlsx файл в .zip, открыть через архиватор/Far и посмотреть, что внутри архива.
  • 22 января 2017 в 10:29

    0

    Про пользу это вы зря.) Возможно кому нибудь нужно будет руками экспортировать данные в xsl (x) в изображениями
  • 22 января 2017 в 11:18 (комментарий был изменён)

    0

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

    Очень интересно наблюдать, в какой последовательности отрисовываются/рендерятся ячейки таблицы! Если при работе моей программки все понятно, то в случае MS я оказался в затруднении, честное слово…

    • 22 января 2017 в 11:56

      0

      Wow, что еще любопытнее, так это то, что Chrome отрисовывает все (хотя и по странной логике программистов MS, и довольно медленно), Firefox гордо пытается, но в конце практически «сдыхает», а IE и Edge тупо рендерят какую-то фигню с «мусором», после чего тупо «отваливаются» ;)
      • 22 января 2017 в 12:22

        0

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

© Habrahabr.ru