我正在使用最新的 apache poi 依赖项,并且想要调整图像大小(工作簿打开后不要让它那么大):
<dependencies>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>5.2.3</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>5.2.3</version>
</dependency>
</dependencies>
import org.apache.commons.compress.utils.IOUtils;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.*;
public class ImageResizer {
public static void main (String[] args) throws IOException {
ImageResizer resizer = new ImageResizer();
}
public ImageResizer() throws IOException {
InputStream inputStream;
XSSFWorkbook workbook = null;
XSSFSheet sheet = null;
Cell cell = null;
XSSFRow sheetRow = null;
try {
File myFile = new File("C:\\Users\\Luke\\Downloads\\TestWorkbook_AddingImage.xlsm");
FileInputStream fis = new FileInputStream(myFile);
workbook = new XSSFWorkbook (fis);
fis.close();
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
sheet = workbook.getSheetAt(0);
FileInputStream stream = null;
try {
stream = new FileInputStream( "C:\\Users\\Luke\\Downloads\\pexels-yura-forrat-12850802.jpg" );
} catch (FileNotFoundException e) {
throw new RuntimeException(e);
}
CreationHelper helper = workbook.getCreationHelper();
Drawing drawing = sheet.createDrawingPatriarch();
ClientAnchor anchor = helper.createClientAnchor();
final int pictureIndex = workbook.addPicture( stream, Workbook.PICTURE_TYPE_JPEG);
stream.close();
anchor.setCol1( 0 );
anchor.setRow1( 0);
final Picture pict = drawing.createPicture( anchor, pictureIndex );
pict.resize(0.1,0.1);
FileOutputStream os = new FileOutputStream("C:\\Users\\Luke\\Downloads\\TestWorkbook_AddingImage_Saved.xlsm");
workbook.write(os);
os.close();
System.out.println("Done!");
}
}
pict.resize(0.1, 0.1) 方法使我的图片非常非常小(单元格内几乎看不到点)。我也尝试过 0.5、0.9 甚至 2.0,但结果都是一样的。 为什么?我可以做什么来调整图片大小?
最好的, 米哈尔
当ClientAnchor.Col1
或ClientAnchor.Row1
或两者都为0时,这似乎是
Picture.resize(doublescaleX, doublescaleY)和
Picture.resize(doublescale)中的错误。当两个都为0时,它会起作用。左上角锚单元索引大于 0。
解决方法是先使用
Picture.resize()
,然后再按比例调整大小。 Picture.resize()
首先计算右下锚点位置以适应完整的原生图片尺寸。之后Picture.resize(double scaleX, double scaleY)
就可以正常工作了。
...
anchor.setCol1(0);
anchor.setRow1(0);
final Picture pict = drawing.createPicture( anchor, pictureIndex );
pict.resize();
pict.resize(0.1, 0.1);
...
pict.resize(); 图片. 调整大小(0.1, 0.1); 问题: 当图片的左上角位于第一行(Row1 = 0)或第一列(Col1 = 0)时,调整大小逻辑会变得混乱,无法正确计算图片的大小。
为什么 Picture.resize() 可以修复它? 当您首先调用 Picture.resize() 时,它会确保图片正确放置在其单元格中并正确计算右下位置。此步骤“修复”了有关图片位置的任何混乱。
为什么缩放(调整大小(双倍scaleX,双倍scaleY))之后起作用? 一旦图片具有正确的起始位置和右下角,缩放逻辑就有正确的参考点来调整图片的大小。