package com.sincere.file.utils; import com.alibaba.fastjson.JSONArray; import com.alibaba.fastjson.JSONObject; import org.apache.poi.ooxml.POIXMLTypeLoader; import org.apache.poi.ooxml.util.DocumentHelper; import org.apache.poi.util.IOUtils; import org.apache.poi.xwpf.usermodel.*; import org.apache.xmlbeans.XmlObject; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.xml.sax.InputSource; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.*; import java.net.URL; import java.net.URLConnection; import java.util.HashSet; import java.util.Iterator; import java.util.Set; import java.util.regex.Matcher; import java.util.regex.Pattern; public class PoiUtils { static Logger logger = LoggerFactory.getLogger(PoiUtils.class); public static String createWord(JSONArray questions) { XWPFDocument doc = new XWPFDocument();//创建word文档 for (int i = 0; i < questions.size(); i++) { JSONObject question = questions.getJSONObject(i); String question_text = question.getString("question_text"); String channel_type_name = question.getString("channel_type_name"); JSONObject options = question.getJSONObject("options"); XWPFParagraph p = doc.createParagraph();//新建一个段落 p.setAlignment(ParagraphAlignment.LEFT);//设置对其方式 if (channel_type_name.contains("img")) { getImg(channel_type_name, doc, p); } else { writeP(HtmlUtil.delHTMLTag(channel_type_name) + "\r\n", p); } question_text = question_text.replaceAll(" ", " "); if (question_text.contains("img")) { writeP(question_text.replaceAll("]*/>", " "), p); getImg(question_text, doc, p); } else { writeP(HtmlUtil.delHTMLTag(question_text) + "\r\n", p); } if (null != options) { String A = options.getString("A"); if (A.contains("src")) { writeP("A." + A.replaceAll("]*/>", " "), p); getImg(A, doc, p); } else { writeP("A." + A + "\r\n", p); } String B = options.getString("B"); if (B.contains("src")) { writeP("B." + B.replaceAll("]*/>", " "), p); getImg(B, doc, p); } else { writeP("B." + B + "\r\n", p); } String C = options.getString("C"); if (C.contains("src")) { writeP("C." + C.replaceAll("]*/>", " "), p); getImg(C, doc, p); } else { writeP("C." + C + "\r\n", p); } String D = options.getString("D"); if (D.contains("src")) { writeP("D." + D.replaceAll("]*/>", " "), p); getImg(D, doc, p); } else { writeP("D." + D + "\r\n", p); } } } try { File file = new File("D://POI"); if (!file.exists()) file.mkdirs(); File file1 = new File(file.getAbsolutePath() + File.separator + System.currentTimeMillis() + ".doc"); if (!file1.exists()) file1.createNewFile(); FileOutputStream out = new FileOutputStream(file1); doc.write(out); out.close(); return file1.getAbsolutePath(); } catch (FileNotFoundException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return ""; } private static void writeP(String content, XWPFParagraph p) { XWPFRun r = p.createRun();//创建段落文本 r.setFontSize(14); r.setText(content); r.setColor("000000");//设置颜色 } private static void getImg(String imgHtml, XWPFDocument doc, XWPFParagraph paragraph) { // imgHtml = HtmlUtil.delHTMLTag(imgHtml); // imgHtml = imgHtml.substring(imgHtml.indexOf("src="), imgHtml.indexOf("style")); // imgHtml = imgHtml.replace("\"", ""); // imgHtml = imgHtml.replace("src=", ""); // logger.error("imgHtml:{}", imgHtml); Set imgSer = getImgStr(imgHtml); Iterator iterator = imgSer.iterator(); while (iterator.hasNext()) { String imgUrl = iterator.next(); String imgName = System.currentTimeMillis() + ".png"; String filePath = "D://POI//Img"; download(imgUrl, imgName, filePath); writeImg2Word(filePath + File.separator + imgName, doc, paragraph); } } private static String writeImg2Word(String s, XWPFDocument doc, XWPFParagraph paragraph) { try { XWPFRun run = paragraph.createRun(); // 获取图片 InputStream is = new FileInputStream(s); byte[] bs = IOUtils.toByteArray(is); BufferedImage image = ImageIO.read(new ByteArrayInputStream(bs)); // 获取组装图片宽高,单位pt StringBuffer dataSize = new StringBuffer(); dataSize.append("width:").append(image.getWidth()).append("pt;"); dataSize.append("height:").append(image.getHeight()).append("pt;"); // 添加图片到Word中 String rid = doc.addPictureData(bs, Document.PICTURE_TYPE_PNG); StringBuffer xml = new StringBuffer(); xml.append(""); xml.append(" \r\n"); xml.append(" \r\n"); xml.append(" "); xml.append("\r\n"); InputSource source = new InputSource(new StringReader(xml.toString())); org.w3c.dom.Document pictDoc = DocumentHelper.readDocument(source); // 将信息写入run中 run.setEmbossed(true); XmlObject xmlObject = XmlObject.Factory.parse(pictDoc.getDocumentElement(), POIXMLTypeLoader.DEFAULT_XML_OPTIONS); run.getCTR().set(xmlObject); run.setText("\r\n"); } catch (Exception e) { e.printStackTrace(); } return null; } public static void download(String urlString, String filename, String savePath) { try { // 构造URL URL url = new URL(urlString); // 打开连接 URLConnection con = url.openConnection(); //设置请求超时为5s con.setConnectTimeout(5 * 1000); // 输入流 InputStream is = con.getInputStream(); // 1K的数据缓冲 byte[] bs = new byte[1024]; // 读取到的数据长度 int len; // 输出的文件流 File sf = new File(savePath); if (!sf.exists()) { sf.mkdirs(); } // 获取图片的扩展名 String extensionName = filename.substring(filename.lastIndexOf(".") + 1); // 新的图片文件名 = 编号 +"."图片扩展名 OutputStream os = new FileOutputStream(sf.getPath() + "\\" + filename); // 开始读取 while ((len = is.read(bs)) != -1) { os.write(bs, 0, len); } // 完毕,关闭所有链接 os.close(); is.close(); } catch (Exception e) { e.printStackTrace(); } } /** * 得到网页中图片的地址 */ private static Set getImgStr(String htmlStr) { Set pics = new HashSet(); String img = ""; Pattern p_image; Matcher m_image; String regEx_img = "]*?>"; p_image = Pattern.compile(regEx_img, Pattern.CASE_INSENSITIVE); m_image = p_image.matcher(htmlStr); while (m_image.find()) { // 得到数据 img = m_image.group(); // 匹配中的src数据 Matcher m = Pattern.compile("src\\s*=\\s*\"?(.*?)(\"|>|\\s+)").matcher(img); while (m.find()) { pics.add(m.group(1)); } } return pics; } }