質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

0回答

13061閲覧

Apache POIで,縦横比を固定して画像を貼り付ける方法

yuji38kwmt

総合スコア437

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

1グッド

1クリップ

投稿2016/08/31 15:42

実現したいこと

Apache POIで画像を貼り付けたいです。
貼り付け先は、以下の通りです。

  • 画像の左上位置は、A1セルの左上
  • 画像の幅はA列の幅
  • 画像の高さは、画像の縦横比が1:1になるような値

問題

画像を、セルA1にぴったり合うように挿入することはできました。
しかし、列幅に合わせて縦横比を1:1にする方法が分かりませんでした。
Picture#resizeメソッドを使えばよいのだと思うのですが、resizeメソッドに渡す値が分かりませんでした。

以下、ソースコードです。

java

1package mytest.gui; 2 3import java.awt.image.BufferedImage; 4import java.io.FileInputStream; 5import java.io.FileOutputStream; 6import java.io.IOException; 7import java.nio.file.Files; 8import java.nio.file.Path; 9import java.nio.file.Paths; 10 11import javax.imageio.ImageIO; 12 13import org.apache.poi.ss.usermodel.ClientAnchor; 14import org.apache.poi.ss.usermodel.Drawing; 15import org.apache.poi.ss.usermodel.Picture; 16import org.apache.poi.ss.usermodel.Sheet; 17import org.apache.poi.ss.usermodel.Workbook; 18import org.apache.poi.ss.usermodel.WorkbookFactory; 19public class Console { 20 21 public static void main(String[] args) throws Exception { 22 String fileName = "sample.xls"; 23 Workbook workbook = WorkbookFactory.create(new FileInputStream("sample.xls")); 24 addPicture(workbook); 25 workbook.write(new FileOutputStream("sample1.xls")); 26 } 27 28 29 private static void addPicture(Workbook workbook) throws IOException { 30 Path path = Paths.get("input/sample1.jpg"); 31 BufferedImage image = ImageIO.read(path.toFile()); 32 byte[] bytes = Files.readAllBytes(path); 33 //画像をworkbookに追加 34 int pictureIndex = workbook.addPicture(bytes, Workbook.PICTURE_TYPE_JPEG); 35 Sheet sheet = workbook.getSheetAt(0); 36 Drawing drawing = sheet.createDrawingPatriarch(); 37 38 //セルA1にぴったり合うように画像を貼り付ける 39 int col1 = 0; 40 int row1 = 0; 41 int col2 = 1; 42 int row2 = 1; 43 ClientAnchor anchor = drawing.createAnchor(0,0,0,0, col1, row1, col2, row2); 44 Picture picture = drawing.createPicture(anchor, pictureIndex); 45 46// picture.resize(0.5, 2.0); 47 } 48}

以下、mavenのdependency部分です。

xml

1<!-- https://mvnrepository.com/artifact/org.apache.poi/poi --> 2<dependency> 3 <groupId>org.apache.poi</groupId> 4 <artifactId>poi</artifactId> 5 <version>3.14</version> 6</dependency> 7 8<!-- https://mvnrepository.com/artifact/org.apache.poi/poi-ooxml --> 9<dependency> 10 <groupId>org.apache.poi</groupId> 11 <artifactId>poi-ooxml</artifactId> 12 <version>3.14</version> 13</dependency> 14 15 <dependency> 16 <groupId>org.apache.poi</groupId> 17 <artifactId>poi-scratchpad</artifactId> 18 <version>3.14</version> 19 </dependency> 20 <dependency> 21 <groupId>org.apache.poi</groupId> 22 <artifactId>poi-ooxml-schemas</artifactId> 23 <version>3.14</version> 24 </dependency>

質問1: Picture#resizeメソッドの動き

resizeメソッドに渡す引数の単位は、何でしょうか?

公式サイトには次のように書かれています。
https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/Picture.html#resize(double,%20double)

Resize the image.
Please note, that this method works correctly only for workbooks with the default font size (Arial 10pt for .xls and Calibri 11pt for .xlsx). If the default font is changed the resized image can be streched vertically or horizontally.
resize(1.0,1.0) keeps the original size,
resize(0.5,0.5) resize to 50% of the original,
resize(2.0,2.0) resizes to 200% of the original.
resize(Double.MAX_VALUE,Double.MAX_VALUE) resizes to the dimension of the embedded image.

「デフォルトフォントサイズのときのみ、正しく動く」と書かれています。
デフォルトフォントサイズとは、どこで定義されているのでしょうか?

また、新規作成時のシートに対して、picture.resize(2.0, 2.0);を実行したら、セルA1:B2にぴったり収まる画像が挿入されました。
A1セルを基準にして2倍されたのだと思いますが、公式サイトにある「元画像に対して200%でリサイズする」動きとは異なりました。
なぜでしょうか?
※新規作成時のシートなので、「フォントはデフォルトサイズ」という考えです。
※列幅72px, 行高さ18pxです。

質問2: 余白を調整してリサイズ

ClientAnchorクラスの余白部分を調整して、リサイズは可能でしょうか?

https://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/ClientAnchor.html

環境

  • Java8
  • Apache POI 3.14
A-pZ👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問