poi 拆分带图片的word_利用poi生成word(含表格 图片)

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() );

}

}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值