您的位置:首页 > 其它

excel 导出图片

2017-07-05 00:00 183 查看
摘要: excel 导出图片

package com.fh.controller.system.taskQuality;

import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.net.URL;
import java.net.HttpURLConnection;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.hssf.usermodel.HSSFClientAnchor;
import org.apache.poi.hssf.usermodel.HSSFDataFormat;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.hssf.util.Region;
import org.apache.poi.ss.usermodel.Font;
import org.springframework.web.servlet.view.document.AbstractExcelView;

import com.fh.util.DateUtil;
import com.fh.util.PageData;
import com.fh.util.Tools;
/**
* 导出到EXCEL
* 类名称:InvoiceExcelView.java
* 类描述:
* @author
* 作者: SF
* 联系方式:858637852
*/
public class TaskExcelView extends AbstractExcelView{

/**
* 制表时间(传入参数空表示当前)
*/
private static String createTableDate= DateUtil.splitNowDate(null);

/**
* 服务器 获取图片地址 返回图片字节
* @param inStream
* @return
* @throws Exception
*/
private static byte[] readInputStream(String pictureUrl) throws Exception{
URL url = new URL(pictureUrl);
//打开链接
HttpURLConnection conn = (HttpURLConnection)url.openConnection();
//设置请求方式为"GET"
conn.setRequestMethod("GET");
//超时响应时间为5秒
conn.setConnectTimeout(5 * 1000);
//通过输入流获取图片数据
InputStream inStream = conn.getInputStream();
ByteArrayOutputStream outStream = new ByteArrayOutputStream();
//创建一个Buffer字符串
byte[] buffer = new byte[1024];
//每次读取的字符串长度,如果为-1,代表全部读取完毕
int len = 0;
//使用一个输入流从buffer里把数据读取出来
while( (len=inStream.read(buffer)) != -1 ){
//用输出流往buffer里写入数据,中间参数代表从哪个位置开始读,len代表读取的长度
outStream.write(buffer, 0, len);
}
//关闭输入流
inStream.close();

//把outStream里的数据写入内存
return outStream.toByteArray();
}

@Override
protected void buildExcelDocument(Map<String, Object> model,
HSSFWorkbook workbook, HttpServletRequest request,
HttpServletResponse response) throws Exception {
// TODO Auto-generated method stub
HSSFSheet sheet ;
HSSFPatriarch patriarch ;//图片处理对象 一个sheet只能有一个
HSSFCell cellB;
Date date = new Date();
String filename = Tools.date2Str(date, "yyyyMMddHHmmss");
/**
* 导出excel list
*/
List<PageData> excelList = (List<PageData>) model.get("excelList");

//标题样式 无边框 居中
HSSFCellStyle headerStyle = workbook.createCellStyle(); //标题样式
HSSFDataFormat format = workbook.createDataFormat();
headerStyle.setDataFormat(format.getFormat("@")); //设置导出文本格式
headerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);//水平
headerStyle.setAlignment(HSSFCellStyle.BORDER_NONE);//设置边框 无
headerStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
HSSFFont headerFont = workbook.createFont(); //标题字体
headerFont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//
headerFont.setFontHeightInPoints((short)15);
headerStyle.setFont(headerFont);//标题字体

//普通样式 居中无边框
HSSFCellStyle normolStyleNoBord = workbook.createCellStyle(); //标题样式
normolStyleNoBord.setDataFormat(format.getFormat("@")); //设置导出文本格式
normolStyleNoBord.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 居中
normolStyleNoBord.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
normolStyleNoBord.setAlignment(HSSFCellStyle.BORDER_NONE);//设置边框 无
normolStyleNoBord.setWrapText(true);// 指定单元格自动换行

//普通样式 左对齐 有边框
HSSFCellStyle normolStyle = workbook.createCellStyle(); //标题样式
normolStyle.setDataFormat(format.getFormat("@")); //设置导出文本格式
normolStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 居中
normolStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
normolStyle.setAlignment(HSSFCellStyle.BORDER_MEDIUM);//设置边框 加粗
normolStyle.setBorderBottom(HSSFCellStyle.BORDER_MEDIUM);
normolStyle.setBorderLeft(HSSFCellStyle.BORDER_MEDIUM);
normolStyle.setBorderRight(HSSFCellStyle.BORDER_MEDIUM);
normolStyle.setBorderTop(HSSFCellStyle.BORDER_MEDIUM);
normolStyle.setWrapText(true);// 指定单元格自动换行
//标题字体 黑色 加粗

//普通字体

HSSFFont normolFont = workbook.createFont();
normolFont.setFontHeight((short) 200);
normolStyle.setFont(normolFont);//设置字体样式
normolStyleNoBord.setFont(normolFont);//

//普通样式 左对齐 有边框
HSSFCellStyle normolStyleRedColor = workbook.createCellStyle(); //标题样式
normolStyleRedColor.setDataFormat(format.getFormat("@")); //设置导出文本格式
normolStyleRedColor.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 居中
normolStyleRedColor.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);//垂直居中
normolStyleRedColor.setAlignment(HSSFCellStyle.BORDER_MEDIUM);//设置边框 加粗
normolStyleRedColor.setBorderBottom(HSSFCellStyle.BORDER_MEDIUM);
normolStyleRedColor.setBorderLeft(HSSFCellStyle.BORDER_MEDIUM);
normolStyleRedColor.setBorderRight(HSSFCellStyle.BORDER_MEDIUM);
normolStyleRedColor.setBorderTop(HSSFCellStyle.BORDER_MEDIUM);
normolStyleRedColor.setWrapText(true);// 指定单元格自动换行
//标题字体 黑色 加粗
Font font = workbook.createFont();
font.setColor(HSSFColor.RED.index);
normolStyleRedColor.setFont(font);

int rows = 0;//总行数
PageData aObj = new PageData();
int num = 0;//每个aObj的行数 初始默认为0
//回复内容长度
int replyNum = 0;
/**
* 导出操作
*/
if(null != excelList && excelList.size()>0){
filename=new String(filename.toString().getBytes("UTF-8"),"ISO8859-1");
response.setContentType("application/octet-stream");
response.setHeader("Content-Disposition", "attachment;filename="+filename+".xls");
sheet = workbook.createSheet("sheet0");
//绘图
patriarch = sheet.createDrawingPatriarch();

//图片处理对象 每个图片必须new一个
HSSFClientAnchor anchor;
for (int i = 0; i < excelList.size(); i++) {
//一个主题
aObj = excelList.get(i);
//图片地址
String [] imgUrlList = (String[]) aObj.get("imgList") ;
//计算截止上一个对象的行数
num = rows;
//回复内容
List<PageData> replyList = (List<PageData>) aObj.get("replyList");
if( null == replyList || replyList.size()==0)
replyNum = 0;
else
replyNum = replyList.size();

int h = 0;

for (int j = rows; ; j++) {//制表 行 每个对象
String varstr="";
cellB = null;

for (int k = 0; k < 6; k++) {//制表 列
cellB = getCell(sheet, j, k);
cellB.setCellStyle(normolStyle);
if(rows-num == 0){//aObj的第1行
if(k==0){//aObj的第0列
sheet.addMergedRegion(new Region(j,(short)0,j,(short )5));
varstr = aObj.get("CREATE_NAME")+" 创建于:"+DateUtil.getString(aObj.get("CREATE_DATE"))
+" 记录状态:"+aObj.getString("STATE_NAME")+" 处理状态:"+aObj.get("RESULT_NAME");
cellB.setCellStyle(normolStyleRedColor);

}
}
else if(rows-num == 1){//主题第2行
if(k==0){
sheet.addMergedRegion(new Region(j,(short)0,j+3,(short )0));
varstr = "记\n录\n内\n容";
cellB.setCellStyle(normolStyle);
}
if(k==1){
sheet.addMergedRegion(new Region(j,(short)1,j,(short )5));
varstr = aObj.getString("text");
}
}
else if( rows-num == 2){//主题第3-5行 放置图片 (rows-num-2)*5
if(k==1){
sheet.addMergedRegion(new Region(j,(short)1,j+2,(short )5));
if(null != imgUrlList)
for (int k2 = 0; k2 < imgUrlList.length; k2++) {
if("".equals(imgUrlList[k2]))
continue;
anchor = new HSSFClientAnchor(0, 0, 255, 255,(short) (k+k2), rows, (short) (k+k2), rows+2);
anchor.setAnchorType(3);
patriarch.createPicture(anchor, workbook.addPicture(readInputStream(imgUrlList[k2]), HSSFWorkbook.PICTURE_TYPE_JPEG));
}
}
}
else if(rows-num == 5){//主题第6行
if(k==0){
sheet.addMergedRegion(new Region(j,(short)0,j,(short )0));
varstr = "处理对象:";
}
if(k==1){
sheet.addMergedRegion(new Region(j,(short)1,j,(short )5));
varstr = aObj.getString("TASK_NAME");
}
}
else if(rows-num == 6){//主题第7行
if(k==0){
sheet.addMergedRegion(new Region(j,(short)0,j,(short )0));
varstr = "处理人员:";
}
if(k==1){
sheet.addMergedRegion(new Region(j,(short)1,j,(short )5));
varstr = aObj.getString("CHECK_NAMES");
}
}
else if(rows-num == 7){//主题第8行
if(k==0){
sheet.addMergedRegion(new Region(j,(short)0,j,(short )5));
varstr = "处理结果";
}
}

/**
* 回复内容
*/
if(replyNum >0 && (rows-num)>=(8 + h*5) && h< replyNum ){// 有回复内容 循环回复内容 h*5 每个回复内容占5行 所以每循环一个回复内容行数就 +5
if( rows-num == 8 + h*5 ){// 第9行
if(k==0){
sheet.addMergedRegion(new Region(j,(short)k,j,(short )k));
varstr = "记录人:";
}
if(k==1){
sheet.addMergedRegion(new Region(j,(short)k,j,(short )k));
varstr = replyList.get(h).getString("CREATE_NAME");
}
if(k==2){
sheet.addMergedRegion(new Region(j,(short)k,j,(short )k));
varstr = "记录时间:";
}
if(k==3){
sheet.addMergedRegion(new Region(j,(short)k,j,(short )(k+2)));
varstr = DateUtil.getString( replyList.get(h).get("CREATE_DATE") ) ;
}
}
if( rows-num == 9 + h*5 ){//第10行 回复内容
if(k==0){
sheet.addMergedRegion(new Region(j,(short)0,j+3,(short )0));
varstr = "处\n理\n内\n容";
}
if(k==1){
sheet.addMergedRegion(new Region(j,(short)1,j,(short )5));
varstr = replyList.get(h).getString("text");
}
}
if( rows-num == 10 + h*5 ){// 放置图片 (rows-num-2)*5
if(k==1){
sheet.addMergedRegion(new Region(j,(short)1,j+2,(short )5));
String [] replyImgs = (String[]) replyList.get(h).get("imgList");
if(null != replyImgs)
for (int k2 = 0; k2 < replyImgs.length; k2++) {
if("".equals(replyImgs[k2]))
continue;
// 起始列 起始行 结束列 结束行
anchor = new HSSFClientAnchor(0, 0, 255, 255,(short) (k+k2), rows, (short) (k+k2), rows+2);
anchor.setAnchorType(3);
patriarch.createPicture(anchor, workbook.addPicture(readInputStream(replyImgs[k2]), HSSFWorkbook.PICTURE_TYPE_JPEG));
}
h += 1;//循环完一个回复对象 h+1
}
}

} //回复内容结束循环

setText(cellB,varstr);//文本赋值
}
//统计用 循环的行数

if(rows-num >= 7 + replyNum*5 + 1){///主题共有7行 +回复内容(每个回复内容有5行) + 每个主题结束一行空白
//if(i == excelList.size()-1)
// break;
sheet.addMergedRegion(new Region(rows,(short)0,rows,(short )5));
varstr = "";
cellB.setCellStyle(normolStyleNoBord);
rows += 1;
break;
}else{
rows += 1;
}

}
}

}

}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  excel 导出图片