Вставьте изображение в файл excel с помощью JXL, не растягивая его

Я могу вставить изображение в свой файл excel, используя jxl, используяsheet.addImage(WritableImage obj). Моя проблема в том, что он растягивается на основе аргументов WritableImage. Мне интересно, есть ли способ, чтобы изображение, которое я вставляю, не растягивалось, например, если я вставляю изображение размером 200x200, оно будет отображаться на листе как 200x200.


person Jemp    schedule 15.11.2011    source источник
comment
@king14nyr, ты нашел решение, пожалуйста, опубликуй его, спасибо   -  person shareef    schedule 15.07.2012


Ответы (2)


Как бы это ни беспокоило меня в отношении jxl, я так и не нашел способа вставить изображение без привязки соотношения сторон к ячейкам вместо пикселей/дюймов/любой стандартной единицы измерения, и в прошлом я провел приличное исследование при этом.

Лучшее, что вы можете сделать, это адаптировать изображения к высоте/ширине ячеек, в которые вы их вставляете, или, что еще лучше, установить ширину/высоту ячеек для ячеек, в которые вы вставляете изображение.

Из часто задаваемых вопросов по JExcel - http://jexcelapi.sourceforge.net/resources/faq/

private static final double CELL_DEFAULT_HEIGHT = 17;
private static final double CELL_DEFAULT_WIDTH = 64;

File imageFile = new File(GIF_OR_JPG_IMAGE_FILE);
BufferedImage input = ImageIO.read(imageFile);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(input, "PNG", baos);
sheet.addImage(new WritableImage(1,1,input.getWidth() / CELL_DEFAULT_WIDTH,
    input.getHeight() / CELL_DEFAULT_HEIGHT,baos.toByteArray()));

Чтобы сохранить соотношение сторон, вам также нужно настроить WritableImage так, чтобы он не изменял размер, если пользователь изменит высоту строки или ширину столбца. Сделайте это одним из следующих способов (ваши предпочтения зависят от того, хотите ли вы, чтобы якорь изображения был заблокирован или перемещался с изменением размера):

WritableImage.MOVE_WITH_CELLS;
WritableImage.NO_MOVE_OR_SIZE_WITH_CELLS;
person king14nyr    schedule 15.11.2011
comment
Спасибо за ваш ответ! Я думаю, что не могу применить это к моей текущей ситуации, поскольку ширина и высота столбца зависят от длины самого длинного слова в том же столбце, где мне нужно поместить изображение. Но я очень ценю твой ответ. - person Jemp; 16.11.2011
comment
Ничего страшного, такая ситуация уже была и у меня. Вышеупомянутое работает, ЕСЛИ вы можете исправить ширину/высоту ячеек, но в случае, когда вы не можете (например, когда вы устанавливаете AUTOSIZE в true для столбцов), я не нашел способ сделать это. Если вы найдете способ сделать это в jxl, обязательно напишите здесь, так как это может помочь другим. - person king14nyr; 16.11.2011
comment
@shareef Если вам нужно, чтобы ваши столбцы имели динамическую ширину, например, при использовании AUTOSIZE, я до сих пор не нашел способа сделать это правильно. Я давно не занимался этой проблемой, поэтому, возможно, jxl обработал ее в обновлении, но я не знаю. Это был бы ваш лучший выбор, так как я не нашел хорошего решения в случае, когда размеры строк/столбцов являются динамическими. :( - person king14nyr; 16.07.2012
comment
спасибо за ответ, но мне нужно установить размер изображения как пиксели 50,50, кстати, это логотип, и кажется, что его сложно добавить в excel, потому что он растягивается в соответствии с ячейкой, как установить какие-либо идеи - person shareef; 17.07.2012

На самом деле это возможно. Предположим, что ширина изображения, которое вы хотите включить, составляет 4000. Затем вы делаете следующее:

CellView cv = excelSheetTemp.getColumnView(0);
//get the width of the column where you want to insert the picture
int width = forLogo.getSize();
//if the width is less than the size you want, set the column width to
//the width. This will ensure that your image does not shrink
if (width < 4000) {
    forLogo.setSize(4000);
    excelSheetTemp.setColumnView(0, cv);
    width = 4000;
}
double c = 4000/width;
WritableImage im = new WritableImage(0, 1, c, 3, the image file);
excelSheetTemp.addImage(im);
person user3245747    schedule 15.08.2016