- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我现在已经尝试从 XSSFSheet
中删除图像太久了。我找不到关于此的任何信息,但我认为这是可能的..
有什么方法可以从我的 XSSFSheet
中删除图像吗?甚至官方(?)apache poi 网站也没有提及除 creating and reading images 之外的任何内容。
我现在离放弃不远了,只是将除所述图像之外的所有内容复制到新工作表中。这显然不应该如何完成。如果我这样做的话,我想我一周都睡不好觉了。
我最后一次不成功的尝试是使用我的代码来移动图像(我在 this post 中共享了该代码),但我没有设置有效的行号,而是设置了 null
,但这是不可能的,因为 setRow()
的参数是 int (基本类型)。
然后我尝试为 anchor 行设置负值。虽然从技术上讲这会删除图像,但下次打开 Excel 文件时必须对其进行修复。图像未显示。
我相信我也必须从 XSSFDrawing
中删除关系才能完全删除图像(我认为这是在找到 this custom implementation of XSSFDrawing 之后),但我不知道那里发生了什么......
如果您能在这里提供任何帮助,我将不胜感激!
最佳答案
对于XSSF
来说,这并不像听起来那么简单。有 HSSFPatriarch.removeShape 但 XSSFDrawing 中没有可比的内容。
我们必须删除图片本身包含的关系。我们必须从绘图中删除形状的 anchor 。
示例:遍历工作表中的所有图片并删除形状名称为“Image 2”的图片:
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.*;
import org.apache.poi.hssf.usermodel.*;
import org.apache.xmlbeans.XmlCursor;
import java.io.*;
class ExcelDeleteImage {
public static void deleteCTAnchor(XSSFPicture xssfPicture) {
XSSFDrawing drawing = xssfPicture.getDrawing();
XmlCursor cursor = xssfPicture.getCTPicture().newCursor();
cursor.toParent();
if (cursor.getObject() instanceof org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTTwoCellAnchor) {
for (int i = 0; i < drawing.getCTDrawing().getTwoCellAnchorList().size(); i++) {
if (cursor.getObject().equals(drawing.getCTDrawing().getTwoCellAnchorArray(i))) {
drawing.getCTDrawing().removeTwoCellAnchor(i);
System.out.println("TwoCellAnchor for picture " + xssfPicture + " was deleted.");
}
}
} else if (cursor.getObject() instanceof org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTOneCellAnchor) {
for (int i = 0; i < drawing.getCTDrawing().getOneCellAnchorList().size(); i++) {
if (cursor.getObject().equals(drawing.getCTDrawing().getOneCellAnchorArray(i))) {
drawing.getCTDrawing().removeOneCellAnchor(i);
System.out.println("OneCellAnchor for picture " + xssfPicture + " was deleted.");
}
}
} else if (cursor.getObject() instanceof org.openxmlformats.schemas.drawingml.x2006.spreadsheetDrawing.CTAbsoluteAnchor) {
for (int i = 0; i < drawing.getCTDrawing().getAbsoluteAnchorList().size(); i++) {
if (cursor.getObject().equals(drawing.getCTDrawing().getAbsoluteAnchorArray(i))) {
drawing.getCTDrawing().removeAbsoluteAnchor(i);
System.out.println("AbsoluteAnchor for picture " + xssfPicture + " was deleted.");
}
}
}
}
public static void deleteEmbeddedXSSFPicture(XSSFPicture xssfPicture) {
if (xssfPicture.getCTPicture().getBlipFill() != null) {
if (xssfPicture.getCTPicture().getBlipFill().getBlip() != null) {
if (xssfPicture.getCTPicture().getBlipFill().getBlip().getEmbed() != null) {
String rId = xssfPicture.getCTPicture().getBlipFill().getBlip().getEmbed();
XSSFDrawing drawing = xssfPicture.getDrawing();
drawing.getPackagePart().removeRelationship(rId);
drawing.getPackagePart().getPackage().deletePartRecursive(drawing.getRelationById(rId).getPackagePart().getPartName());
System.out.println("Picture " + xssfPicture + " was deleted.");
}
}
}
}
public static void deleteHSSFShape(HSSFShape shape) {
HSSFPatriarch drawing = shape.getPatriarch();
drawing.removeShape(shape);
System.out.println("Shape " + shape + " was deleted.");
}
public static void main(String[] args) throws Exception {
String filename = "ExcelWithImages.xlsx";
//String filename = "ExcelWithImages.xls";
InputStream inp = new FileInputStream(filename);
Workbook workbook = WorkbookFactory.create(inp);
Sheet sheet = workbook.getSheetAt(0);
Drawing drawing = sheet.getDrawingPatriarch();
XSSFPicture xssfPictureToDelete = null;
if (drawing instanceof XSSFDrawing) {
for (XSSFShape shape : ((XSSFDrawing)drawing).getShapes()) {
if (shape instanceof XSSFPicture) {
XSSFPicture xssfPicture = (XSSFPicture)shape;
String shapename = xssfPicture.getShapeName();
int row = xssfPicture.getClientAnchor().getRow1();
int col = xssfPicture.getClientAnchor().getCol1();
System.out.println("Picture " + "" + " with Shapename: " + shapename + " is located row: " + row + ", col: " + col);
if ("Image 2".equals(shapename)) xssfPictureToDelete = xssfPicture;
}
}
}
if (xssfPictureToDelete != null) deleteEmbeddedXSSFPicture(xssfPictureToDelete);
if (xssfPictureToDelete != null) deleteCTAnchor(xssfPictureToDelete);
HSSFPicture hssfPictureToDelete = null;
if (drawing instanceof HSSFPatriarch) {
for (HSSFShape shape : ((HSSFPatriarch)drawing).getChildren()) {
if (shape instanceof HSSFPicture) {
HSSFPicture hssfPicture = (HSSFPicture)shape;
int picIndex = hssfPicture.getPictureIndex();
String shapename = hssfPicture.getShapeName().trim();
int row = hssfPicture.getClientAnchor().getRow1();
int col = hssfPicture.getClientAnchor().getCol1();
System.out.println("Picture " + picIndex + " with Shapename: " + shapename + " is located row: " + row + ", col: " + col);
if ("Image 2".equals(shapename)) hssfPictureToDelete = hssfPicture;
}
}
}
if (hssfPictureToDelete != null) deleteHSSFShape(hssfPictureToDelete);
FileOutputStream out = new FileOutputStream(filename);
workbook.write(out);
out.close();
workbook.close();
}
}
此代码使用 apache poi 4.0.1
进行测试,它需要 FAQ N10025 中提到的所有架构 ooxml-schemas-1.4.jar
的完整 jar
关于java - 如何在java中从Excel工作表(XSSF)中删除图像,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54769854/
private void cleaner(Integer columnsCount, Integer rowsCount, Object object){ int firstColumn=0;
我收到以下代码的NullPointerException。有人可以帮忙解决这个问题吗?我正在尝试将数据库值获取到现有的 Excel 工作表。 Statement statement = connect
我正在尝试编写一个函数,该函数读取 Excel 模板并开始在某个行索引处写入。但是,我发现编号会跳过模板中的空白行。有没有办法在迭代期间计算空白行? 我试图找到相当于 missing cell pol
我尝试使用 apache poi xssf 将 excel 文件解析为 XML。现在有了一个单元格,但不知道里面有什么,我只想从中获取一个字符串。但是当我使用 cell.getStringCellVa
我正在尝试读取由网络应用程序生成的 Excel 文件。但我无法访问任何列或行,因为 XSSF 工具一直告诉我没有工作表。单个工作表称为“MySheet”,但当我按名称搜索它时,得到 -1。当我搜索工作
这是我到目前为止的代码,它从查询中获取数据,然后将其导出到 Excel 文档中: oArray = CreateObject("java", "java.util.Arrays"); wor
我现在已经尝试从 XSSFSheet 中删除图像太久了。我找不到关于此的任何信息,但我认为这是可能的.. 有什么方法可以从我的 XSSFSheet 中删除图像吗?甚至官方(?)apache poi 网
我在保存新的 Excel 文件时遇到问题。我希望它在保存时公式会自行计算,但目前它只是在 excel 文件中返回一个字符串。公式是正确的。我不知道如何让 FormulaEvaluator 工作。 这里
我有一个 HSSF 工作簿,其中包含我的自定义颜色,但现在我需要使用 XSSF 来创建 xslx 文件。 我已经相应地改变了一切,但唯一让我难过的是如何在这样的事情中使用定制的 XSSFColor :
我想为使用 poi 3.14 创建的 xlsx 文件添加密码保护。文档声称,这是可能的: http://poi.apache.org/encryption.html 使用我这样尝试的示例: p
我正在使用 Apache POI 3.12: org.apache.poi poi 3.12 org.apache.poi poi-ooxml 3
我目前正在使用 Apache POI 库在 Java 中生成 excel 文件。 这就是我想知道的:在 Excel 中,可以创建新的单元格样式并将其添加到工作簿中。这些样式是可重复使用的,并且可以从样
几年前,我遇到了使用 jXLS 和 POI XSSF 创建大型 excel 文件的问题。如果我没记错的话,我认为 XSSF 会在磁盘上创建类似 1GB+ 的临时文件来创建 10mb 的 excel 文
有没有办法确定单元格是否为日期?我知道 style.get DataFormatString() 但这对我没有帮助,因为我无法确定格式是否适用于日期。 最佳答案 如果您使用的是 XSSF 用户模型,那
我使用下面的代码在 XSSF 工作表中设置默认列样式?但这不起作用任何人都可以建议错误修复。 format = workbook.createDataFormat(); style = workboo
如何将现有列数据和格式复制到 Apache POI 中的下一列并将下一列向右移动。 我试过了。假设我的代码是这样的...... XSSFCell oldCell = worksheet.getRow(
无法将“STYLE”从 .xlsx 文件复制到另一个文件。 这是我正在使用的代码。 public static void copyCell(XSSFCell oldCell, XSSFCell ne
单元格 A1 具有 公式“=A2”并被格式化为显示 1 个小数点 单元格 A2 具有 值 4.23 单元格 A1 显示 4.2(格式化显示值) 单元格 A2 显示 4.23(格式化显示值) 我的 XS
有没有办法不读取整个 Excel 文档行,我正在读取文档中定义的单元格,但是,它拉入了整个工作表的列??? 我正在将 Excel 文档转换为 CSV 文档。我得到了这个结果。 Aircraft ID
我已经使用 XLS,但今天我正在尝试新的 - xlsx。对于 XLS,我只需要一个库,而 XLSX(四个库)则相反。我还得到整个包错误。为什么会发生这种情况? 主要: public class
我是一名优秀的程序员,十分优秀!