java - apache-poi excel生成:多张纸上的不同图像大小
问题描述
我正在研究生成带有 2 张工作表的 Excel (*.xlsx) 工作簿的代码。在两者上,我将在左上角放置相同的logo.png图片(151x90px)。第一张纸仅在第一列宽度上与第二张不同。它在第一张纸上更宽。
生成 excel 文件后,第一张纸上的图片看起来不错,但第二张纸上的图片更宽(110%)
如何使图片在两张纸上都具有原始尺寸?
我正在使用 apache-poi 3.17
这是我的示例代码:
package mchodun.excel;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.ClientAnchor;
import org.apache.poi.ss.usermodel.CreationHelper;
import org.apache.poi.ss.usermodel.Drawing;
import org.apache.poi.ss.usermodel.Picture;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
import org.junit.Test;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.nio.file.Paths;
public class ExcelFileTest {
@Test
public void testImage() throws IOException {
Workbook workbook = new SXSSFWorkbook(100);
InputStream is = new FileInputStream(
"/Users/mchodun/Desktop/logo.png");
byte[] pictureBytes = IOUtils.toByteArray(is);
createSheet(workbook, pictureBytes, true);
createSheet(workbook, pictureBytes, false);
final File fileDest = Paths.get("/Users/mchodun/Desktop", "test.xlsx")
.toFile();
// gets output stream
final OutputStream out = new FileOutputStream(fileDest);
workbook.write(out);
out.flush();
out.close();
}
private void createSheet(Workbook workbook, byte[] pictureBytes,
boolean changeColumnWidth) {
final int pictureIdx = workbook.addPicture(pictureBytes,
Workbook.PICTURE_TYPE_PNG);
Sheet sheet = workbook.createSheet();
if (changeColumnWidth) {
sheet.setColumnWidth(0, 16000);
}
final CreationHelper helper = workbook.getCreationHelper();
final Drawing drawing = sheet.createDrawingPatriarch();
final ClientAnchor anchor = helper.createClientAnchor();
// create an anchor with upper left cell and bottom right cell
anchor.setCol1(0);
anchor.setRow1(0);
anchor.setCol2(0);
anchor.setRow2(0);
Picture picture = drawing.createPicture(anchor, pictureIdx);
Row row0 = sheet.createRow(0);
row0.setHeight((short) (picture.getImageDimension().getHeight() * 15));
Row row1 = sheet.createRow(1);
Cell cell10 = row1.createCell(0);
cell10.setCellValue("Value");
picture.resize();
}
}
解决方案
推荐阅读
- regex - 使用正则表达式匹配第 N 次出现
- javascript - 如何从 PHP 后端接收 JSON 对象并转换为前端的 JavaScript 数组
- c# - 如何在 C# 中查询 MongoDb 的 id 字段并列出 id 的列表
- javascript - 在.then上添加if条件时如何使用promise?
- locust - 如何解释 LocustIO 的输出/模拟短暂的用户访问
- r - Remove a character from all rows
- java - WCF MTOM/XOP 客户端反序列化错误
- matlab - fft 的不同绘图形状取决于时间样本间距
- html - div未按顺序显示
- php - 过滤查询无法通过 Laravel 查询生成器工作