package com.cmos.ngqss.action;
import java.io.BufferedInputStream;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigInteger;
import java.net.URL;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.zip.ZipEntry;
import java.util.zip.ZipOutputStream;
import javax.servlet.http.HttpServletRequest;
import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
import org.apache.poi.util.Units;
import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy;
import org.apache.poi.xwpf.usermodel.ParagraphAlignment;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFParagraph;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.poi.xwpf.usermodel.XWPFTable;
import org.apache.poi.xwpf.usermodel.XWPFTable.XWPFBorderType;
import org.apache.poi.xwpf.usermodel.XWPFTableCell;
import org.apache.poi.xwpf.usermodel.XWPFTableCell.XWPFVertAlign;
import org.apache.poi.xwpf.usermodel.XWPFTableRow;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTBorder;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSectPr;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblBorders;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTblWidth;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STBorder;
import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTblWidth;
import com.cmos.core.bean.InputObject;
import com.cmos.core.bean.OutputObject;
import com.cmos.core.util.JsonUtil;
import com.cmos.core.util.StringUtil;
import com.cmos.ngqss.exeption.NgqssException;
import com.cmos.ngqss.util.Constants;
import com.cmos.ngqss.util.CustomXWPFDocument;
import com.cmos.ngqss.util.DateUtil;
import com.cmos.ngqss.util.DateUtil.DATE_PATTERN;
import com.cmos.ngqss.util.NGConstants;
import com.cmos.cache.util.PropertiesUtil;
import com.cmos.onest.ONestUtil;
import sun.misc.BASE64Decoder;
public class DowAction extends BaseAction {
private static final String String = null;
//word文件
CustomXWPFDocument document= new CustomXWPFDocument();
//题号
int t = 1 ;
public void index() throws Exception {
InputObject inputObject = super.getInputObject();
OutputObject out = new OutputObject();
String title = (String) inputObject.getParams().get("title");
String str =(String) inputObject.getParams().get("beans");
List> beansList = new ArrayList();
if(StringUtil.isNotEmpty(str)){
beansList= JsonUtil.convertJson2Object(str, List.class);
}
/********************生成word***********************/
//添加标题
XWPFParagraph titleParagraph = document.createParagraph();
//设置段落居中
titleParagraph.setAlignment(ParagraphAlignment.CENTER);
XWPFRun titleParagraphRun = titleParagraph.createRun();
titleParagraphRun.setText(title);
titleParagraphRun.setColor("000000");
titleParagraphRun.setFontSize(20);
XWPFParagraph p = document.createParagraph(); //每一个表格内容设置为一个段落,便于设置样式,字体
//原本是在方法内写,但每个段落好像自动会有
//一个换行,导致有多少表格 下边就有多少空行
for (Map beanMap : beansList){
String quTypeCd = (String)beanMap.get("quTypeCd");
//图片题
if(quTypeCd.equals(NGConstants.QU_TYPE_CD.QU_TYPE_CD_IMAGE)){
//添加题目
addPicQueNam(beanMap);
//创建表格
XWPFTable ComTable1 = document.createTable();
//外边框样式
setBorders(ComTable1);
// 设置上下左右四个方向的距离
ComTable1.setCellMargins(20, 20, 20, 20);
//列宽自动分割
CTTblWidth comTableWidth = ComTable1.getCTTbl().addNewTblPr().addNewTblW();
comTableWidth.setType(STTblWidth.DXA);
comTableWidth.setW(BigInteger.valueOf(9072));
//去除单元格间的竖线
ComTable1.setInsideVBorder(XWPFBorderType.NONE, 0, 0, "");
//横线颜色
ComTable1.setInsideHBorder(XWPFBorderType.SINGLE , 0, 0, "F4F4F4");
//表格第一行
XWPFTableRow comTableRowOne = ComTable1.getRow(0);
setCell(comTableRowOne.getCell(0),"选项",p);
comTableRowOne.getCell(0).setColor("F4F4F4"); //设置表格颜色
setCell( comTableRowOne.addNewTableCell(),"小计",p);
comTableRowOne.getCell(1).setColor("F4F4F4");
setCell(comTableRowOne.addNewTableCell(),"百分比",p);
comTableRowOne.getCell(2).setColor("F4F4F4");
List> childrenList = (List>) beanMap.get("children");
for(Map childMap : childrenList ){
XWPFTableRow comTableRow = ComTable1.createRow();
setPicCell( comTableRow.getCell(0),(String)childMap.get("aswrNm"),(String)childMap.get("picUrlAddr"),p);
setCell(comTableRow.getCell(1),(String)childMap.get("count").toString(),p);
setCell(comTableRow.getCell(2),(String)childMap.get("percent"),p);
}
//存放图片
String base64Info = (String)beanMap.get("base64Info");
if(base64Info != null){
addPicture(beanMap);
}
//换行
huanhang();
}
//填空题
if(quTypeCd.equals(NGConstants.QU_TYPE_CD.QU_TYPE_CD_BLANK) || quTypeCd.equals(NGConstants.QU_TYPE_CD.QU_TYPE_CD_BLANK_MULTI)
|| quTypeCd.equals(NGConstants.QU_TYPE_CD.QU_TYPE_CD_MATRIX_BLANK)
){
//添加题目
addQueNam(beanMap);
//换行
huanhang();
}
//单选 多选 单项评分题 单项投票 多项投票 NPS题
if(quTypeCd.equals(NGConstants.QU_TYPE_CD.QU_TYPE_CD_CHOOSE_SINGLE) || quTypeCd.equals(NGConstants.QU_TYPE_CD.QU_TYPE_CD_CHOSSE_MULTI)
|| quTypeCd.equals(NGConstants.QU_TYPE_CD.QU_TYPE_CD_SCORE_CHOOSE_SINGLE) || quTypeCd.equals(NGConstants.QU_TYPE_CD.QU_TYPE_CD_VOTE_SINGLE)
|| quTypeCd.equals(NGConstants.QU_TYPE_CD.QU_TYPE_CD_VOTE_MULTI) || quTypeCd.equals(NGConstants.QU_TYPE_CD.QU_TYPE_CD_SCORE_NPS)
){
//添加题目
addQueNam(beanMap);
//创建表格
XWPFTable ComTable1 = document.createTable();
//外边框样式
setBorders(ComTable1);
// 设置上下左右四个方向的距离
ComTable1.setCellMargins(20, 20, 20, 20);
//列宽自动分割
CTTblWidth comTableWidth = ComTable1.getCTTbl().addNewTblPr().addNewTblW();
comTableWidth.setType(STTblWidth.DXA);
comTableWidth.setW(BigInteger.valueOf(9072));
//去除单元格间的竖线
ComTable1.setInsideVBorder(XWPFBorderType.NONE, 0, 0, "");
//横线颜色
ComTable1.setInsideHBorder(XWPFBorderType.SINGLE , 0, 0, "F4F4F4");
//表格第一行
XWPFTableRow comTableRowOne = ComTable1.getRow(0);
setCell(comTableRowOne.getCell(0),"选项",p);
comTableRowOne.getCell(0).setColor("F4F4F4"); //设置表格颜色
setCell( comTableRowOne.addNewTableCell(),"小计",p);
comTableRowOne.getCell(1).setColor("F4F4F4");
setCell(comTableRowOne.addNewTableCell(),"百分比",p);
comTableRowOne.getCell(2).setColor("F4F4F4");
List> childrenList = (List>) beanMap.get("children");
for(Map childMap : childrenList ){
XWPFTableRow comTableRow = ComTable1.createRow();
setCell( comTableRow.getCell(0),(String)childMap.get("aswrNm"),p);
setCell(comTableRow.getCell(1),childMap.get("count").toString(),p);
setCell(comTableRow.getCell(2),(String)childMap.get("percent"),p);
}
//存放图片
String base64Info = (String)beanMap.get("base64Info");
if(base64Info != null){
addPicture(beanMap);
}
//换行
huanhang();
}
//矩阵单选,矩阵多选 多项评分提
if(quTypeCd.equals(NGConstants.QU_TYPE_CD.QU_TYPE_CD_MATRIX_CHOOSE_SINGLE) || quTypeCd.equals(NGConstants.QU_TYPE_CD.QU_TYPE_CD_MATRIX_CHOOSE_MULTI)
|| quTypeCd.equals(NGConstants.QU_TYPE_CD.QU_TYPE_CD_SCORE_CHOOSE_MULTI)){
//添加题目
addQueNam(beanMap);
//创建表格
XWPFTable ComTable5 = document.createTable();
//外边框样式
setBorders(ComTable5);
// 设置上下左右四个方向的距离
ComTable5.setCellMargins(20, 20, 20, 20);
//列宽自动分割
CTTblWidth comTableWidth11 = ComTable5.getCTTbl().addNewTblPr().addNewTblW();
comTableWidth11.setType(STTblWidth.DXA);
comTableWidth11.setW(BigInteger.valueOf(9072));
//去除单元格间的竖线
ComTable5.setInsideVBorder(XWPFBorderType.NONE, 0, 0, "");
//横线颜色
ComTable5.setInsideHBorder(XWPFBorderType.SINGLE , 0, 0, "F4F4F4");
//表格第一行
XWPFTableRow comTableRowOne11 = ComTable5.getRow(0);
comTableRowOne11.getCell(0).setText(" ");
comTableRowOne11.getCell(0).setColor("F4F4F4"); //设置表格颜色
List> childrenList11 = (List>) beanMap.get("children");
List> childrenList12 =(List>) childrenList11.get(0).get("children");
int b = 1;
for(Map map : childrenList12){
setCell(comTableRowOne11.addNewTableCell(),(String)map.get("aswrNm"),p);
//comTableRowOne11.addNewTableCell().setText((String)map.get("aswrNm"));
comTableRowOne11.getCell(b).setColor("F4F4F4");
b++;
}//标题行结束
for(Map map : childrenList11){
XWPFTableRow comTableRow = ComTable5.createRow();
setCell(comTableRow.getCell(0),(String)map.get("quNm"),p);
// comTableRow.getCell(0).setText((String)map.get("quNm"));//每行第一个为矩阵题目
List> map11 =(List>) map.get("children");
int c = 1;
for(Map map12 : map11){
setCell(comTableRow.getCell(c),map12.get("count").toString()+"("+(String)map12.get("percent")+")",p);
// comTableRow.getCell(c).setText((String)map12.get("count")+"("+(String)map12.get("percent")+")");
c++;
}
}
String base64Info = (String)beanMap.get("base64Info");
if(base64Info != null){
addPicture(beanMap);
}
//换行
huanhang();
}
}
CTSectPr sectPr = document.getDocument().getBody().addNewSectPr();
XWPFHeaderFooterPolicy policy = new XWPFHeaderFooterPolicy(document, sectPr);
sendOnest(document,out);
// System.out.println("create_table document written success.");
//下载地址传到页面
}
//添加图片 //base64Info为前台传过来的图片信息
private void addPicture(Map map) throws IOException, InvalidFormatException {
String base64Info = (String)map.get("base64Info");
base64Info = base64Info.replaceAll(" ", "+");
String pictureInfo = (String)base64Info.split("base64,")[1];
BASE64Decoder decoder = new BASE64Decoder();
byte[] a = decoder.decodeBuffer(pictureInfo);// Base64解码
for (int i = 0; i < a.length; ++i) {
if (a[i] < 0) {// 调整异常数据
a[i] += 256;
}
}
String picId1 = document.addPictureData(a, XWPFDocument.PICTURE_TYPE_JPEG);
document.createPicture(picId1, document.getNextPicNameNumber(XWPFDocument.PICTURE_TYPE_PNG), 660, 180);
}
//换行
private void huanhang(){
XWPFParagraph paragraph = document.createParagraph();
XWPFRun paragraphRun = paragraph.createRun();
paragraphRun.setText("");
XWPFParagraph paragraph1 = document.createParagraph();
XWPFRun paragraphRun1 = paragraph1.createRun();
paragraphRun.setText("");
}
//添加图片题题目
private void addPicQueNam(Map map) throws InvalidFormatException, IOException{
XWPFParagraph paragraph = document.createParagraph();
XWPFRun queNum = paragraph.createRun();
queNum.setText(String.valueOf(t));
queNum.setColor("87CEFF");
queNum.setFontSize(12);//每一个creatRun是一个样式
XWPFRun paragraphRun = paragraph.createRun();
String quNm = (String)map.get("quNm");
paragraphRun.setText((String)map.get("quNm"));
String quPicUrlAddr = (String)map.get("quPicUrlAddr");
paragraphRun.setFontSize(10);
if(quPicUrlAddr != null){
URL picUrl = new URL(quPicUrlAddr);
// DataInputStream pictureData = new DataInputStream(picUrl.openStream());
InputStream pictureData = picUrl.openStream();
XWPFRun quPic =paragraph.createRun();
quPic.addPicture(pictureData, XWPFDocument.PICTURE_TYPE_PNG, "", Units.toEMU(40), Units.toEMU(20));
}
t++;
}
//添加题目
private void addQueNam(Map map){
XWPFParagraph paragraph = document.createParagraph();
XWPFRun queNum = paragraph.createRun();
queNum.setText(String.valueOf(t));
queNum.setColor("87CEFF");
queNum.setFontSize(12);
XWPFRun paragraphRun = paragraph.createRun();
paragraphRun.setText((String)map.get("quNm"));
paragraphRun.setFontSize(10);
t++;
}
//设置外边框样式
private void setBorders( XWPFTable ComTable){
CTTblBorders borders=ComTable.getCTTbl().getTblPr().addNewTblBorders();
CTBorder lBorder=borders.addNewLeft();
lBorder.setVal(STBorder.Enum.forString("single"));
lBorder.setSz(new BigInteger("10"));
lBorder.setColor("F4F4F4");
CTBorder rBorder=borders.addNewRight();
rBorder.setVal(STBorder.Enum.forString("single"));
rBorder.setSz(new BigInteger("10"));
rBorder.setColor("F4F4F4");
CTBorder tBorder=borders.addNewTop();
tBorder.setVal(STBorder.Enum.forString("single"));
tBorder.setSz(new BigInteger("10"));
tBorder.setColor("F4F4F4");
CTBorder bBorder=borders.addNewBottom();
bBorder.setVal(STBorder.Enum.forString("single"));
bBorder.setSz(new BigInteger("10"));
bBorder.setColor("F4F4F4");
}
//设置图片题表格内容及对齐方式
private void setPicCell(XWPFTableCell cell,String text,String picUrlAddr, XWPFParagraph p) throws InvalidFormatException, IOException{
if(cell.getParagraphs().size()>0){
p=cell.getParagraphs().get(0);
}else{
p=cell.addParagraph();
}
XWPFRun pRun=p.createRun();
pRun.setText(text);
if(picUrlAddr != null){ //url为图片地址
URL picUrl = new URL(picUrlAddr);
InputStream pictureData = picUrl.openStream();
pRun.addPicture(pictureData, XWPFDocument.PICTURE_TYPE_PNG, "", Units.toEMU(40), Units.toEMU(20));
}
//垂直居中
cell.setVerticalAlignment(XWPFVertAlign.CENTER);
//水平居中
p.setAlignment(ParagraphAlignment.CENTER);
}
//设置表格内容及对齐方式
private void setCell(XWPFTableCell cell,String text,XWPFParagraph p){
if(cell.getParagraphs().size()>0){
p=cell.getParagraphs().get(0);
}else{
p=cell.addParagraph();
}
XWPFRun pRun=p.createRun();
pRun.setText(text);
//垂直居中
cell.setVerticalAlignment(XWPFVertAlign.CENTER);
//水平居中
p.setAlignment(ParagraphAlignment.CENTER);
}
//上传至onest
private void sendOnest(CustomXWPFDocument document,OutputObject out) throws NgqssException{
Map urlMap = new HashMap<>();
// 添加文件名和路径
Calendar c = Calendar.getInstance();
String fileName = DateUtil.date2String(new Date(), DATE_PATTERN.YYYYMMDDHHMMSS);
String suffix = ".zip";
String filePath = String.format("%d/%02d", c.get(Calendar.YEAR), c.get(Calendar.MONTH));
// 默认到工程路径下
ByteArrayOutputStream outstream = new ByteArrayOutputStream();
ZipOutputStream zip = new ZipOutputStream(outstream);
String fileUrl = "";
try {
document.write(zip);
InputStream instream = getCompressed(new ByteArrayInputStream(outstream.toByteArray()),fileName);
String path = PropertiesUtil.getString(Constants.FIEL_SYSTEM_PROPERTIES, Constants.SYSTEM.ONEST_PATH);
fileUrl = ONestUtil.uploadAndGetPrivateUrl(path, filePath + "/" + fileName + suffix,
instream);
System.out.println(fileUrl);
String url = setUrl(fileUrl);
out.getBean().put("fileUrl", url);
super.sendJson(super.convertOutputObject2Json(out));
} catch (Exception e) {
System.out.println(e);
throw new NgqssException(e);
} finally {
try {
outstream.close();
} catch (IOException e) {
throw new NgqssException(e);
}
}
}
//设置url
private String setUrl(String fileUrl){
String url=null;
String outFlag = (String) getSession().getAttribute("userPermType");
if(!StringUtil.isEmpty(fileUrl)) {
String rst;
if(fileUrl.indexOf(PropertiesUtil.getString(Constants.FIEL_SYSTEM_PROPERTIES, Constants.SYSTEM.ONEST_PATH))>-1){
rst = fileUrl.substring(fileUrl.indexOf(PropertiesUtil.getString(Constants.FIEL_SYSTEM_PROPERTIES, Constants.SYSTEM.ONEST_PATH)), fileUrl.length());
HttpServletRequest request = super.getRequest();
String requestUrl = request.getHeader("Referer");
//String headerHost = request.getHeader("Host");
String headerHost;
if("ngmtt".equals(outFlag)) {
headerHost = PropertiesUtil.getString(Constants.FIEL_SYSTEM_PROPERTIES, Constants.SYSTEM_CONFIG.NGMTT_URL);
}else {
headerHost = PropertiesUtil.getString(Constants.FIEL_SYSTEM_PROPERTIES, Constants.SYSTEM_CONFIG.NGQSS_URL);
}
String rst2 = requestUrl.substring(0, requestUrl.indexOf("://"));
url = rst2 +"://" + headerHost + "/" + rst;
}
}
return url;
}
private ByteArrayInputStream getCompressed( InputStream is ,String fileName)
throws IOException
{
byte data[] = new byte[2048];
ByteArrayOutputStream bos = new ByteArrayOutputStream();
ZipOutputStream zos = new ZipOutputStream( bos );
BufferedInputStream entryStream = new BufferedInputStream( is, 2048);
ZipEntry entry = new ZipEntry( fileName +".docx");
zos.putNextEntry( entry );
int count;
while ( ( count = entryStream.read( data, 0, 2048) ) != -1 )
{
zos.write( data, 0, count );
}
entryStream.close();
zos.closeEntry();
zos.close();
return new ByteArrayInputStream( bos.toByteArray() );
}
}