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;
}
}