Время на прочтение
4 мин
Количество просмотров 18K
Некоторое время тому на хабре появилась статья о художнике, который рисует картины в MS Excel, используя его векторные возможности. Но задолго до этого я натыкался на истории о феноменальных растровых рисунках в том же экселе, идея которых базируется на пиксель-арте. Т.е. кто-то попросту уменьшает размеры ячеек и использует заливку цветом для получения своеобразной мозаики. Выглядит довольно впечатляюще, хотя до векторных рисунков по качеству, конечно, не дотягивает.
Увидев такие картины я, конечно же, усомнился в том, что кому-то хватит усидчивости для создания их в ручном режиме и решил поискать способ автоматизировать «офисное творчество». Задача оказалась несложной для реализации на языке Java при условии использования библиотеки Apache POI, предназначенной для работы с проприетарными форматами Microsoft Office. Подробности под катом.
Итак, что мы имеем. Я поставил себе задачу создать приложение для конвертирования самой обыкновенной картинки JPG (или, в принципе, любого другого распространенного формата) в документ Excel. Сразу стоит упомянуть существующие ограничения:
ширина «картинки» не должна превышать 255 точек (максимальное количество столбцов на листе)
максимальное количество стилей оформления (в нашем случае это количество цветов) равно 4000
Таким образом либо придется предварительно найти и подготовить картинку (уменьшить размеры и глубину цвета) или же делать это программно. Мы пойдем вторым путем 
Для начала набросаем Main-класс нашей программы, содержащий единственный метод:
public class Main {
public static void main(String[] args) {
IMGRead ir = new IMGRead();
Map<String, Object[]> data = ir.read("C:\picture.jpg");
POIWrite pw = new POIWrite();
pw.write(data);
}
}
Конечно, убого и хардкод, но для демонстрации сойдет.
Рассмотрим класс для чтения картинки из файла. Он содержит метод для собственно чтения картинки и возвращает результат в виде карты, содержащей объекты типа RGBColor, в которых хранится информация о трех составляющих цвета точки:
public Map<String, Object[]> read(String fileName) {
File file = new File(fileName);
BufferedImage source, image;//source and resized images
Map<String, Object[]> data = new TreeMap<String, Object[]>();
try {
source = ImageIO.read(file);//read picture from file
int type = source.getType() == 0? BufferedImage.TYPE_INT_ARGB : source.getType();//get type
image = resizeImage(source, type);//resize
source = convert8(image);
image = source; // :)
// Getting pixel color for every pixel
for (Integer y = 0; y < image.getHeight(); y++) {
Object[] line = new Object[image.getWidth()];
for (int x = 0; x < image.getWidth(); x++) {
int clr = image.getRGB(x, y);
int red = (clr & 0x00ff0000) >> 16;
int green = (clr & 0x0000ff00) >> 8;
int blue = clr & 0x000000ff;
line[x] = new RGBColor(red, green, blue);
}
data.put(String.format("%03d", y), line);
}
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return data;
}
Так же мы имеем метод для ресайза картинки:
private static BufferedImage resizeImage(BufferedImage originalImage, int type) {
BufferedImage resizedImage = new BufferedImage(IMG_WIDTH, IMG_HEIGHT, type);
Graphics2D g = resizedImage.createGraphics();
g.drawImage(originalImage, 0, 0, IMG_WIDTH, IMG_HEIGHT, null);
g.dispose();
return resizedImage;
}
И метод для уменьшения цветности (я использую восьмибитный цвет, для других вариантов смотрите источник):
public static BufferedImage convert8(BufferedImage src) {
BufferedImage dest = new BufferedImage(src.getWidth(), src.getHeight(),
BufferedImage.TYPE_BYTE_INDEXED);
ColorConvertOp cco = new ColorConvertOp(src.getColorModel()
.getColorSpace(), dest.getColorModel().getColorSpace(), null);
cco.filter(src, dest);
return dest;
}
Переходим к классу, реализующему запись «картинки» в документ экселя. Тут у нас 2 метода, в первом из них осуществляется запись в файл:
public void write(Map<String, Object[]> data) {
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = workbook.createSheet("Picture");
Map<String, HSSFCellStyle> colorToStyle = new HashMap<String, HSSFCellStyle>();
HSSFCellStyle style;
Set<String> keyset = data.keySet();
int rownum = 0;
for (String key : keyset) {
Row row = sheet.createRow(rownum++);
row.setHeight((short) 50);
Object[] objArr = data.get(key);
int cellnum = 0;
for (Object obj : objArr) {
sheet.setColumnWidth(cellnum, 100);
Cell cell = row.createCell(cellnum++);
RGBColor rgb = (RGBColor) obj;
try {
style = colorToStyle.get(rgb.toString());
cell.setCellStyle(style);
} catch (Exception e) {
style = workbook.createCellStyle();
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
style.setFillForegroundColor(setColor(workbook, rgb.getR(), rgb.getG(), rgb.getB()).getIndex());
colorToStyle.put(rgb.toString(), style);
cell.setCellStyle(style);
}
}
}
try {
FileOutputStream out =
new FileOutputStream(new File("C:\picture.xls"));
workbook.write(out);
out.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
Карта colorToStyle служит для хранения стилей оформления ячеек. Создавая новый стиль, мы ассоциируем его с определенным цветом и каждый раз при закраске новой ячейки проверяем существует ли для нужного цвета готовый стиль, или же необходимо его создать.
Ну и, наконец, метод для преобразования RGB-цвета в формат HSSFColor, используемый в Apache POI. Обратите внимание на то, что используется метод findSimilarColor(), который пытается автоматически подобрать похожий цвет в палитре.
public HSSFColor setColor(HSSFWorkbook workbook, byte r, byte g, byte b) {
HSSFPalette palette = workbook.getCustomPalette();
HSSFColor hssfColor = null;
try {
hssfColor = palette.findSimilarColor(r, g, b);
if (hssfColor == null) {
System.err.println("null " + r + " " + g + " " + b);
palette.setColorAtIndex(HSSFColor.RED.index, r, g, b);
hssfColor = palette.getColor(HSSFColor.RED.index);
}
} catch (Exception e) {
e.printStackTrace();
}
return hssfColor;
}
Результаты «творчества»:
- Иконка файрфокса
- Картинка побольше (Google Docs ее отображает как 2 части, но при скачивании получается нормальная картина)
- Исходники проекта на GitHub
Конечно, до шедевра таким мозаикам далеко, но при правильном подборе цветов в изображении и его размера можно получить довольно симпатичные «рисунки». Умеет ли Apache POI (или какая-либо другая либа) работать с веркторными рисунками в офисных документах я не знаю 
Для многих пользователей Microsoft Excel ассоциируется с обилием скучных таблиц и утомительных графиков. Но есть человек, который сломал все стереотипы об этой программе. Знакомьтесь: Тацуо Хориучи (Tatsuo Horiuchi), 77-летний художник из Страны восходящего солнца, «рисующий» в Excel детальные японские ландшафты.

Уже 15 лет японский художник Тацуо Хориучи создает тонкие детали горных пейзажей и цветущих сакур с помощью невероятного инструмента — электронных таблиц Microsoft Excel.
Когда Тацуо Хориучи вышел на пенсию, чтобы не скучать, он решил заняться компьютерной графикой. Но почему именно в Excel?
«Графическое программное обеспечение обычно достаточно дорогое, а Excel предустановлен на большинстве компьютеров, — объяснил господин Хориучи. — В нем больше функций, и его проще использовать, чем Paint».
Используя простые векторные инструменты, разработанные в первую очередь для построения графиков, Хориучи вместо этого рисует панорамы японской сельской жизни.
«Я никогда не пользовался Excel на работе, но видел, как другие люди делают в нем довольно красивые диаграммы и графики, и подумал, что, наверное, смогу рисовать с его помощью».
Тацуо купил компьютер и стал создавать картины с традиционными японскими мотивами: сакура в цвету, Фудзияма, сосны, карпы в водопаде… С годами они стали невероятно сложными. Сегодня Тацуо Хориучи — признанный мастер цифрового искусства, его «полотна» побеждают на конкурсах и демонстрируются на выставках, а сам он открыл курсы рисования в Excel.
Смотрите также: Японская бабушка стала фотографом в 72 и теперь делает смешные автопортреты
А вы знали, что у нас есть Telegram и Instagram?
Подписывайтесь, если вы ценитель красивых фото и интересных историй!

А вот японский дедушка Horiuchi так не считает 
Его работы можно увидеть на этом сайте (на японском)…
А в Excel_е рисуют даже арты из Аниме и Манги…:)
< Предыдущая публикация — Следующая публикация >
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.
Рисование в Excel – крайне редко встречается. Но, с другой стороны, красивые рисунки очень украшают отчетные таблицы. Особенно, если рисунки и фотографии подобраны по теме таблицы. Рисование в Excel – это очень просто. Умеете рисовать в Word – умеете рисовать в Excel. Тут я могу отправить вас на статьи по Word:
- Урок 69. Рисунок в тексте
- Урок 70. Рисунок в Word
- Урок 71. Изображение в Word
- Урок 72. Рисование в Word
- Урок 73. Рисование Word
Так что повторяться не буду. Но рисование в Excel имеет свои особенности, которые мы рассмотрим в этой статье.
По окончании этого урока вы сможете:
- Привязать рисунок к ячейке двумя способами
- «Разыскать» потерянный рисунок
1. Два способа привязки рисунка к ячейке
Шаг 1. Предлагаю покрасить ячейку, к которой будем привязывать рисунок, в желтый цвет:
Не снимаем выделение с ячейки
Шаг 2. Вставляем рисунок (лента Вставка → группа команд Иллюстрации → команда Значки → рабочее окно с библиотекой значков → значок Яблоко):
Вы можете загрузить рисунок или фотографию, без разницы. Просто лучше отработать на небольшом рисунке.
Шаг 3. Открываем рабочее окно «Форматировать рисунок» (ПМ на выделенном объекте → команда Форматировать рисунок из контекстного меню):
Рабочее окно «Форматировать рисунок» нельзя вызвать другим способом, только при выделенном объекте. Но теперь это окно будет висеть постоянно вне зависимости от того, есть ли у нас объекты или нет, до тех пор, пока мы его сами не закроем.
Шаг 4. В рабочем окне «Форматировать рисунок» переходим на закладку «Размер и свойства» и открываем выпадающее меню «Свойства»:
Нас интересуют три режима:
- Перемещать и изменять размеры вместе с ячейками
- Перемещать вместе с ячейками, но не изменять размеры
- Не перемещать вместе с ячейками и не изменять размеры
С третьим режимом все понятно: объект в любом случае живет своей жизнью, не зависящей от ячеек. А вот первые два интересны. Второй режим задан по умолчанию. Но вот беда: добраться до ячейки и потаскать её по таблице не получится – вся ячейка перекрыта нашим объектом.
Шаг 5. Отведем объект в сторону, чтобы освободить ячейку, и подвигаем нашу желтую ячейку:
Ничего не происходит! А теперь сделаем так, как задумывали создатели Microsoft Office.
Шаг 6. Делаем как на скриншоте:
- Увеличиваем размер нашей желтой ячейки
- Вставляем значок «Яблоко» (Шаг 2) и устанавливаем режим (1) «Перемещать и изменять размеры вместе с ячейками»
- Вставляем (можно скопировать и вставить из буфера обмена) значок «Яблоко» и устанавливаем режим (2) «Перемещать вместе с ячейками, но не изменять размеры»
Шаг 7. Уменьшаем высоту ячейки (курсор изменения высоты ячейки (нажимаем ЛМ и тащим) – статья «Excel 3. Введение в Excel»:
Шаг 8. Совершаем манипуляции с жёлтой ячейкой:
- Я перетащила ячейку B6 на место ячейки C6 – оба яблока послушно переместились на новое место
- Я скопировала ячейку C6 и вставила на ячейку E2 – оба яблока переместились, но яблоко 1 уменьшилось в размерах в соответствии с размерами ячейки, а яблоко 2, не изменив размеры, оказалось за пределами ячейки
- Я скопировала ячейку E2 и вставила на ячейку A6 – яблоко 1 увеличилось в размерах в соответствии с размерами ячейки, а вот яблоко 2 потеряли
| Вывод | Режимы 1. «Перемещать и изменять размеры вместе с ячейками» и 2. «Перемещать вместе с ячейками, но не изменять размеры» работают только в том случае, если объект практически не выходит за пределы ячейки. |
Так что будьте внимательны при работе с рисунками. Иначе вы рискуете потерять рисунки. Поэтому моделируем такую ситуацию.
2. Восстановление объекта
Мне часто приходится работать с формулами.
Шаг 1. Лента Вставка → группа команд Символы → команда πУравнение:
Я не буду подробно останавливаться на возможностях редактора формул – они велики! Формулам и уравнениям я посвящу отдельную статью в рубрике «Тонкости Word» (и может не одну).
Шаг 2. Я выбрала обычную дробь «три пятых» ⅗:
Шаг 3. Совершаем три действия:
- Помещаем свою дробь в желтую ячейку С2
- Устанавливаем режим «Перемещать и изменять размеры вместе с ячейками»
- Копируем ячейку С2 и вставляем на ячейку D4 – и теряем формулу! А может она не скопировалась?
Чтобы найти потерянный объект вспоминаем статью «Excel 25. Диаграмма»
Шаг 4. Открываем Область выделения (лента Главная → группа команд Редактирование → команда Найти и выделить → команда Область выделения из выпадающего меню)
В списке объектов смотрим по порядку, поскольку объектов всего два, то находим быстро:
Вон какой маленький объект! Правильно, мы же назначили режим «Перемещать и изменять размеры вместе с ячейками», поэтому наша формула так сжалась!
Шаг 5. Корректируем размер объекта
- Лента Формат фигуры → группа команд Размер → корректируем высоту объекта или …
- Рабочее окно Формат фигуры (которое достаем из контекстного меню или с Боковой панели) → режим «Подгонять размер фигуры под текст» – это предпочтительней
Не теряйте рисунки! В статье «Excel 25. Диаграмма» я рассказала, что несколько раз мне пришлось бороться с последствиями такой невнимательностью.
Теперь вы сможете:
- Привязать рисунок к ячейке двумя способами
- «Разыскать» потерянный рисунок
Вчера одноклассник попросил меня нарисовать простую картину с Excel. Я смеялся над своим сердцем. Кто все еще использовал Excel, чтобы рисовать картинки в эту эпоху и готовился использовать Matlab или Python для рисования картинок.
Одноклассник показал мне складывающую диаграмму, нарисованную Excel. Я был шокирован, и Excel мог нарисовать такую картину, поэтому я сразу же попросил одноклассника попросить одноклассника организовать настройки рисунка Excel, которые я узнал, и поделиться им через пример.
Цель: Нарисуйте изменения в точках звезды (спутниковая информация).
(1) Выберите координаты XY и нарисуйте эскизы.
- Выберите набор данных по желанию, а затем нажмите«вставлять», Выберите нужный тип значка, здесьКарта рассеянияНапример. Как показано на рисунке, вы можете получить эскиз.
- Затем нажмите на эскиз, который появится выше, появится выше, появится выше«Инструмент диаграммы»,выбирать«дизайн», Затем щелкните вправо«Выберите данные»Как показано на рисунке ниже, следующий выбор«редактировать»Мы можем выбрать необходимые данные о оси x и y.
- Дайте имя рисунка (эквивалентно влиянию легенды) и выберите требуемые данные о оси x и даты оси Y одновременно, как показано на рисунке ниже, а затем нажмите OK.
- Вы можете нарисовать несколько графиков на одном графике, вы можете выбрать на рисунке ниже«Добавить к», А затем продолжить«редактировать», Выберите оси x и оси y графики и, наконец, нажмите OK, чтобы завершить эскиз.
(2) Измените графику, чтобы украсить графику.
- Двойной щелкните данные по оси координат, и правая сторона появится«Установите формат оси координат», Сначала выберите«Координировать параметры оси»,существует«линия»Часть цвета до«Черный»Ширина изменена на«1 фунт»Сущность (Как правило, рисовать картинки, черные линии и 1 фунт, конечно, вы также можете измениться в соответствии со своими собственными предпочтениями), как показано на рисунке ниже:
- Затем выберите четвертый ниже, второй и третий, как правило, не нужно менять. Мы здесь «Координировать варианты вала «Вам нужно изменить здесьМинимальное и максимальное значениеВ дополнение к первымГлавный и вторичныйЭто также может быть изменено. Здесь в основном относится к интервалу координат 30, а вторичная точка относится к подразделению между основной координатой на 10.Перекрестный перекресток осиЭто означает, что значение вертикальной координаты, пересекающиеся с горизонтальными координатами
- Затем измените нижнюю часть опции оси координат«Шкала»,выбирать«Основной тип»а также«Вторичный типЭто отобразит линию шкалы, я обычно выбираю«внешний»。
- Измените цвет значения на оси координат, выберите «Параметры текста» и измените цвет шрифта. Как правило, выберите«Черный»,Как показано ниже:
- Точно так же модифицируется координата x. Помните, что если вертикальные координаты находятся в крайнем правом правом, то значение вертикальной оси необходимо изменить, как показано ниже: (другие операции)
- Измените промежуточную сетку, в соответствии с требованиями графики в книге, мы сохраняем только горизонтальные линии. Мы нажимаем на сеткуВертикальная линияПосле отбора,удалить удалить, Выберите прямые линии, щелкните справа«Установите параметры линии сетки»,Изменять«цвет»а также»Тип строки разделения «,Как показано ниже:
- Затем нажмите на край рамки провода, чтобы сделатьНастройки линии сетки, Ниже«Рамка»Выбирать«Сплошная линия»,ЗатемОтрегулируйте цвета такжеширинаЭффект согласованности является наилучшим эффектом с настройками оси координат.
- Затем мы устанавливаем конкретные линии в графическом поле, двойной щелчок, появляются справа«Установить формат серии данных»Выберите первое«линия», Изменить строкиЦвет, ширина, тип линии секции(Вы можете настроить в соответствии с фактической ситуацией), а затем выбрать«отметка», Изменить рассеянную точку, вы можете изменитьцвет,так же какНет края,Выберите черный и безграничный здесь. Это почти более красивая графика.
(3) Добавьте информацию о оси координат и легенду.
- Как показано на рисунке, нажмите«Добавить элементы графика»Вы можете получить соответствующую информацию, и вы можете добавить ее. Здесь добавлен только заголовок оси.
- в конце концовДважды -щелкните заголовок оси, К названию осиЦвет шрифта и размерПросто измените его, если вы добавите егоФигура и заголовокВы также можете удвоить -щелкнуть, чтобы изменить. Окончательная графика показана на рисунке ниже:
Получите больше сухих товаров, пожалуйста, обратите внимание на общественный счет «Happy Research».





































