错误情况
POI生成的word文档包含图片时用office打开失败,提示错误。但是用wps却可以打开。
原因分析
这是因为poi本身的问题,单纯的插入图片是不显示的,可以使用如下处理方式createPicture:
public class CustomXWPFDocument extends XWPFDocument {
public CustomXWPFDocument(InputStream in) throws IOException {
super(in);
}
public CustomXWPFDocument() {
super();
}
public CustomXWPFDocument(OPCPackage pkg) throws IOException {
super(pkg);
}
/**
* @param ind
* @param width 宽
* @param height 高
* @param paragraph 段落
*/
public void createPicture(String blipId, int ind, int width, int height, XWPFParagraph paragraph) {
final int EMU = 9525;
width *= EMU;
height *= EMU;
CTInline inline = paragraph.createRun().getCTR().addNewDrawing().addNewInline();
String picXml = ""
+ "<a:graphic xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">"
+ " <a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">"
+ " <pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">"
+ " <pic:nvPicPr>" + " <pic:cNvPr id=\""
+ ind
+ "\" name=\"Generated\"/>"
+ " <pic:cNvPicPr/>"
+ " </pic:nvPicPr>"
+ " <pic:blipFill>"
+ " <a:blip r:embed=\""
+ blipId
+ "\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>"
+ " <a:stretch>"
+ " <a:fillRect/>"
+ " </a:stretch>"
+ " </pic:blipFill>"
+ " <pic:spPr>"
+ " <a:xfrm>"
+ " <a:off x=\"0\" y=\"0\"/>"
+ " <a:ext cx=\""
+ width
+ "\" cy=\""
+ height
+ "\"/>"
+ " </a:xfrm>"
+ " <a:prstGeom prst=\"rect\">"
+ " <a:avLst/>"
+ " </a:prstGeom>"
+ " </pic:spPr>"
+ " </pic:pic>"
+ " </a:graphicData>" + "</a:graphic>";
inline.addNewGraphic().addNewGraphicData();
XmlToken xmlToken = null;
try {
xmlToken = XmlToken.Factory.parse(picXml);
} catch (XmlException xe) {
xe.printStackTrace();
}
inline.set(xmlToken);
inline.setDistT(0);
inline.setDistB(0);
inline.setDistL(0);
inline.setDistR(0);
CTPositiveSize2D extent = inline.addNewExtent();
extent.setCx(width);
extent.setCy(height);
CTNonVisualDrawingProps docPr = inline.addNewDocPr();
docPr.setId(ind);
docPr.setName("图片" + ind);
docPr.setDescr("测试");
}
}
使用
public void setCellImg(CustomXWPFDocument doc,XWPFTableCell cell, String urls) throws Exception {
try{
String[] url = urls.split(",");
//添加段落
for(int i=0;i<url.length-1;i++){
cell.addParagraph();
}
int index=0;
for(String path:url){
File image = new File(path);
if(!image.exists()){
continue;
}
int format=0;
if (path.endsWith(".emf")) {
format = XWPFDocument.PICTURE_TYPE_EMF;
} else if (path.endsWith(".wmf")) {
format = XWPFDocument.PICTURE_TYPE_WMF;
} else if (path.endsWith(".pict")) {
format = XWPFDocument.PICTURE_TYPE_PICT;
} else if (path.endsWith(".jpeg") || path.endsWith(".jpg")) {
format = XWPFDocument.PICTURE_TYPE_JPEG;
} else if (path.endsWith(".png")) {
format = XWPFDocument.PICTURE_TYPE_PNG;
} else if (path.endsWith(".dib")) {
format = XWPFDocument.PICTURE_TYPE_DIB;
} else if (path.endsWith(".gif")) {
format = XWPFDocument.PICTURE_TYPE_GIF;
} else if (path.endsWith(".tiff")) {
format = XWPFDocument.PICTURE_TYPE_TIFF;
} else if (path.endsWith(".eps")) {
format = XWPFDocument.PICTURE_TYPE_EPS;
} else if (path.endsWith(".bmp")) {
format = XWPFDocument.PICTURE_TYPE_BMP;
} else if (path.endsWith(".wpg")) {
format = XWPFDocument.PICTURE_TYPE_WPG;
} else {
MyLog.e("TbTestReportService","Unsupported picture: " + url +
". Expected emf|wmf|pict|jpeg|png|dib|gif|tiff|eps|bmp|wpg");
continue;
}
FileInputStream is = new FileInputStream(path);
XWPFParagraph paragraphs = cell.getParagraphs().get(index);
XWPFRun run = paragraphs.getRuns().isEmpty() ? paragraphs.createRun() : paragraphs.getRuns().get(0);
run.setText(" ");
doc.createPicture(doc.addPictureData(is,format),doc.getNextPicNameNumber(format),500,500,paragraphs);
is.close();
index++;
}
}catch (Exception e){
throw e;
}
}