Apache poi POI-Excel单元格中图像的固定宽度

Apache poi POI-Excel单元格中图像的固定宽度,apache-poi,Apache Poi,我按照命令添加了一个带有POI的新图像 cell.getRow().setHeight(img.getHeightForExcel()); sheet.setColumnWidth(cell.getColumnIndex(), img.getWidthForExcel()); final int picID = workBook.addPicture(bytes, Workbook.PICTURE_TYPE_PNG); /* Create the drawing

我按照命令添加了一个带有POI的新图像

    cell.getRow().setHeight(img.getHeightForExcel());
    sheet.setColumnWidth(cell.getColumnIndex(), img.getWidthForExcel());

    final int picID = workBook.addPicture(bytes, Workbook.PICTURE_TYPE_PNG);
    /* Create the drawing container */
    final XSSFDrawing drawing = (XSSFDrawing) sheet.createDrawingPatriarch();

    // ========adding image START
    final XSSFClientAnchor myAnchor = new XSSFClientAnchor();
    myAnchor.setAnchorType(AnchorType.DONT_MOVE_AND_RESIZE);
    /* Define top left corner, and we can resize picture suitable from there */
    myAnchor.setCol1(cell.getColumnIndex()); // Column start
    myAnchor.setRow1(rowNum - 1); // Row start
    myAnchor.setCol2(cell.getColumnIndex() + 2); // Column end (covers two columns)
    myAnchor.setRow2(rowNum); // Row end

    /* Invoke createPicture and pass the anchor point and ID */
    final XSSFPicture myPicture = drawing.createPicture(myAnchor, picID);
原则上,这很有效。我以图像的宽度开始指定列的宽度。(高度也一样)

我面临的主要问题是,只要我运行
autoadjust
like

    for (; i < max; i++) {
        xlsWorkbook.getSheet().autoSizeColumn(i);
    }
(;i{ xlsWorkbook.getSheet().autoSizeColumn(i); } 我遇到的问题是前两列的大小也被调整了。但这样一来,图像的宽度也会随之调整。由于宽度可能相当长(或相当窄),我不想影响图像大小


是否有一种方法可以在不考虑列宽的情况下设置图像的宽度?

如果您不想在列宽发生变化时调整图像的大小,则无法使用该方法。这种方法明确地告诉我们,图像的大小应与其定位到的单元格大小相同。因此,如果单元格大小改变,图片大小也会改变

您可能认为
ClientAnchor.AnchorType.DONT\u MOVE\u和\u RESIZE
应该可以防止图像调整大小。但这只有在
Excel
GUI
中打开时才有价值
ApachePOI
在自动调整列大小时不考虑
ClientAnchor.AnchorType
。这可能会在以后的版本中发生变化。但在当前版本中,ApachePOI5.0.0不支持

因此,为了满足您的需求,您只设置了一个单细胞锚。这只是
anchor.setCol1
anchor.setRow1
作为图片的左上位置。然后,您需要稍后调整图片的大小以设置右下角的位置。在设置了所有列宽和行高后,必须调整大小。因此,自动调整列大小之后。否则,调整列的大小将再次调整图片的大小

完整示例:

import org.apache.poi.xssf.usermodel.*;
导入org.apache.poi.ss.usermodel.*;
导入org.apache.poi.util.IOUtils;
导入java.io.InputStream;
导入java.io.FileInputStream;
导入java.io.FileOutputStream;
类图像测试{
公共静态void main(字符串[]args)引发异常{
工作簿wb=新XSSFWorkbook();
Sheet Sheet=wb.createSheet(“我的示例Excel”);
//FileInputStream从图像文件获取输入字节
InputStream InputStream=新文件InputStream(“./logo.png”);
//以字节[]的形式获取InputStream的内容。
byte[]bytes=IOUtils.toByteArray(inputStream);
//将图片添加到工作簿中
int pictureIdx=wb.addPicture(字节,工作簿.PICTURE\u TYPE\u PNG);
//关闭输入流
inputStream.close();
//返回处理实例化具体类的对象
CreationHelper=wb.getCreationHelper();
//创建顶级图形父对象。
Drawing=sheet.createDrawingParhical();
//创建附着到工作表的定位点
ClientAnchor anchor=helper.createClientAnchor();
//设置锚类型;仅在Excel GUI中有价值
anchor.setAnchorType(ClientAnchor.AnchorType.MOVE\u不调整大小);
//仅使用左上角单元格创建定位
anchor.setCol1(1);//列B
anchor.setRow1(2);//第3行
//创作一幅画
Picture pict=drawing.createPicture(锚定,pictureIdx);
//将图像重置为原始大小
//pict.resize();//在自动调整列大小之前不要执行此操作
//在列B中创建单元格以自动调整该列的大小
Cell Cell=sheet.createRow(0).createCell(1);
cell.setCellValue(“123456789001234567890”);
表1.autoSizeColumn(1);
//将图像重置为原始大小
//pict.resize();
//将图像重置为原始大小的一半
图像大小(0.5);
//编写Excel文件
FileOutputStream fileOut=null;
fileOut=newfileoutputstream(“./myFile.xlsx”);
wb.写入(文件输出);
fileOut.close();
}
}

如果您不想在列宽更改时调整图像大小,则无法使用该方法。这种方法明确地告诉我们,图像的大小应与其定位到的单元格大小相同。因此,如果单元格大小改变,图片大小也会改变

您可能认为
ClientAnchor.AnchorType.DONT\u MOVE\u和\u RESIZE
应该可以防止图像调整大小。但这只有在
Excel
GUI
中打开时才有价值
ApachePOI
在自动调整列大小时不考虑
ClientAnchor.AnchorType
。这可能会在以后的版本中发生变化。但在当前版本中,ApachePOI5.0.0不支持

因此,为了满足您的需求,您只设置了一个单细胞锚。这只是
anchor.setCol1
anchor.setRow1
作为图片的左上位置。然后,您需要稍后调整图片的大小以设置右下角的位置。在设置了所有列宽和行高后,必须调整大小。因此,自动调整列大小之后。否则,调整列的大小将再次调整图片的大小

完整示例:

import org.apache.poi.xssf.usermodel.*;
导入org.apache.poi.ss.usermodel.*;
导入org.apache.poi.util.IOUtils;
导入java.io.InputStream;
导入java.io.FileInputStream;
导入java.io.FileOutputStream;
类图像测试{
公共静态void main(字符串[]args)引发异常{
工作簿wb=新XSSFWorkbook();
Sheet Sheet=wb.createSheet(“我的示例Excel”);
//FileInputStream从图像文件获取输入字节
InputStream InputStream=新文件InputStream(“./logo.png”);
//以字节[]的形式获取InputStream的内容。
byte[]bytes=IOUtils.toByteArray(inputStream);
//将图片添加到工作簿中
int pictureIdx=wb.addPicture(字节,工作簿.PICTURE\u TYPE\u PNG);
//关闭输入流
inputStream.close();
//返回处理实例化具体类的对象
CreationHelper=wb.getCreationHelper();
//创建顶级图形父对象。
图纸=sh