実現したいこと
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
あなたの回答
tips
プレビュー