1、数据bean

public class ExcelBean {

    private String name;

    private String sheetName;

    private ExcelTitle[] titles;

    private List<String[]> dataList;

    private boolean headBold = true;

    /**
* 列宽 (像素)
*/
private int columnWidth = 200; private int rowHeight; public ExcelBean(String name, String sheetName, ExcelTitle[] titles){
this.name = name;
this.sheetName = sheetName;
this.titles = titles;
this.dataList = new ArrayList<String[]>();
} public String getName() {
return name;
} public void setName(String name) {
this.name = name;
} public String getSheetName() {
return sheetName;
} public void setSheetName(String sheetName) {
this.sheetName = sheetName;
} public ExcelTitle[] getTitles() {
return titles;
} public void setTitles(ExcelTitle[] titles) {
this.titles = titles;
} public List<String[]> getDataList() {
return dataList;
} public void setDataList(List<String[]> dataList) {
this.dataList = dataList;
} public boolean isHeadBold() {
return headBold;
} public void setHeadBold(boolean headBold) {
this.headBold = headBold;
} public int getColumnWidth() {
return columnWidth;
} public void setColumnWidth(int columnWidth) {
this.columnWidth = columnWidth;
} public int getRowHeight() {
return rowHeight;
} public void setRowHeight(int rowHeight) {
this.rowHeight = rowHeight;
} public void add(String[] data){
this.dataList.add(data);
} }
/**
* excel 块状区域
* @author yanglizhe
*
*/
public class ExcelBox {
private int x1; private int y1; private int x2; private int y2; public ExcelBox(int width, int height, int colWidth, int rowHeight, int padding){
double ratio = 1;
int innerWidth = colWidth - 2 * padding;
int innerHeight = rowHeight - 2 * padding;
if((double) width / height > (double) innerWidth/ innerHeight){
if(width > innerWidth){
ratio = (double) innerWidth / width;
}
}
else{
if(height > innerHeight){
ratio = (double) innerHeight / height;
}
} int boxWidth = (int)(width * ratio);
int boxHeight = (int)(height * ratio);
x1 = (colWidth - boxWidth) / 2;
y1 = (rowHeight - boxHeight) / 2;
x2 = x1 + boxWidth;
y2 = y1+ boxHeight;
} public int getX1() {
return x1;
} public void setX1(int x1) {
this.x1 = x1;
} public int getY1() {
return y1;
} public void setY1(int y1) {
this.y1 = y1;
} public int getX2() {
return x2;
} public void setX2(int x2) {
this.x2 = x2;
} public int getY2() {
return y2;
} public void setY2(int y2) {
this.y2 = y2;
}
}
/**
* excel 图片
* @author yanglizhe
*
*/
public class ExcelImage {
private int width; private int height; private byte[] byteArray; public ExcelImage(String imageUrl) throws IOException{
BufferedImage bufferedImage = ImageIO.read(new URL(imageUrl));
ByteArrayOutputStream byteArrayOutputStream =new ByteArrayOutputStream();
ImageIO.write(bufferedImage,"png", byteArrayOutputStream);
width = bufferedImage.getWidth();
height = bufferedImage.getHeight();
byteArray = byteArrayOutputStream.toByteArray();
byteArrayOutputStream.close();
} public int getWidth() {
return width;
} public void setWidth(int width) {
this.width = width;
} public int getHeight() {
return height;
} public void setHeight(int height) {
this.height = height;
} public byte[] getByteArray() {
return byteArray;
} public void setByteArray(byte[] byteArray) {
this.byteArray = byteArray;
}
}
/**
* Excel Title
* @author yanglizhe
*
*/
public class ExcelTitle { private String value; /**
* 列宽(像素)
*/
private int width; public static ExcelTitle generate(String value, int width){
ExcelTitle title = new ExcelTitle();
title.setValue(value);
title.setWidth(width);
return title;
} public String getValue() {
return value;
} public void setValue(String value) {
this.value = value;
} public int getWidth() {
return width;
} public void setWidth(int width) {
this.width = width;
}
}

2、工具类

/**
* excel 工具类
* @author yanglizhe
*
*/
public class ExcelUtils { public static void export( ExcelBean excelBean, HttpServletResponse response) throws Exception{
String filename = excelBean.getName();
filename = new String(filename.replaceAll("\\s|;", "").getBytes("gbk"), "ISO8859-1"); response.setContentType("application/octet-stream;charset=utf-8");
response.setCharacterEncoding("utf-8");
response.setContentType("application/vnd.ms-excel");
response.setHeader("Content-disposition", "attachment;filename=" + filename);
OutputStream outputStream = response.getOutputStream();
export(excelBean, outputStream);
} @SuppressWarnings("resource")
public static void export( ExcelBean excelBean, OutputStream outputStream) throws Exception{
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet(excelBean.getSheetName());
HSSFRow row = sheet.createRow(0); //设置样式
HSSFCellStyle style = wb.createCellStyle();
if(excelBean.isHeadBold()){
HSSFFont headfont = wb.createFont();
headfont.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
style.setFont(headfont);
} HSSFCell cell;
ExcelTitle[] titles = excelBean.getTitles();
for(int i=0; i < titles.length; i++){
ExcelTitle title = titles[i];
cell= row.createCell(i);
cell.setCellValue(title.getValue());
cell.setCellStyle(style);
int columnWidth = title.getWidth() > 0 ? title.getWidth() : excelBean.getColumnWidth();
sheet.setColumnWidth(i, getColWidth(columnWidth));
} int rowNumber = 1;
int rowHeihgt = excelBean.getRowHeight();
HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
for(String[] data : excelBean.getDataList()){
row = sheet.createRow(rowNumber ++ );
if(rowHeihgt > 0){
row.setHeight((short) getRowHeight(rowHeihgt));
}
else{
rowHeihgt = 18;
}
for(int j=0; j<data.length; j ++){
String value = data[j];
cell = row.createCell(j); if(isUrl(value)){
if(isImage(value)){
int columnWidth = titles[j].getWidth() > 0 ? titles[j].getWidth() : excelBean.getColumnWidth();
ExcelImage excelImage = new ExcelImage(value);
ExcelBox excelBox = new ExcelBox(excelImage.getWidth(), excelImage.getHeight(), rowHeihgt, columnWidth, 10);
HSSFClientAnchor anchor = new HSSFClientAnchor();
int cw = getColWidth(columnWidth);
int rh = getRowHeight(rowHeihgt);
short col = (short)(j);
int rowNum = rowNumber-1;
anchor.setDx1(getAnchorX(excelBox.getX1(), cw));
anchor.setDy1(getAnchorY(excelBox.getY1(), rh));
anchor.setDx2(getAnchorX(excelBox.getX2(), cw));
anchor.setDy2(getAnchorY(excelBox.getY2(), rh));
anchor.setCol1(col);
anchor.setRow1(rowNum);
anchor.setCol2(col);
anchor.setRow2(rowNum); anchor.setAnchorType(0);
patriarch.createPicture(anchor , wb.addPicture(excelImage.getByteArray(), HSSFWorkbook.PICTURE_TYPE_JPEG));
}
else{
cell.setCellValue(value);
cell.setCellFormula("HYPERLINK(\"" + value + "\",\"" + value + "\")");
HSSFCellStyle linkStyle = wb.createCellStyle();
HSSFFont cellFont= wb.createFont();
cellFont.setUnderline((byte) 1);
cellFont.setColor(HSSFColor.BLUE.index);
linkStyle.setFont(cellFont);
linkStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
cell.setCellStyle(linkStyle);
}
}
else{
cell.setCellValue(value);
HSSFCellStyle cellStyle = wb.createCellStyle();
cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
cell.setCellStyle(cellStyle);
}
}
} wb.write(outputStream);
outputStream.flush();
outputStream.close(); } /**
* 获取图片x方向长度坐标转换
* @param px
* @param colWidth
* @return
*/
public static int getAnchorX(int px, int colWidth){
return (int) Math.round(( (double) 701 * 16000.0 / 301)*((double)1/colWidth)*px);
} /**
* 获取图片y方向长度坐标转换
* @param px
* @param rowHeight
* @return
*/
public static int getAnchorY(int px, int rowHeight){
return (int) Math.round(( (double) 144 * 8000 / 301)*((double)1/rowHeight)*px);
} /**
* 行高转换
* @param px
* @return
*/
public static int getRowHeight( int px ){
return (int) Math.round(((double) 4480 / 300 ) * px);
} /**
* 列宽转换
* @param px
* @return
*/
public static int getColWidth( int px ){
return (int) Math.round(((double) 10971 / 300 ) * px);
} /**
* 判断是否为链接地址
*/
public static boolean isUrl(String string){
Pattern pattern = Pattern.compile("^((http|https):\\/\\/([\\w\\-]+\\.)+[\\w\\-]+(\\/[\\w\\u4e00-\\u9fa5\\-\\.\\/?\\@\\%\\!\\&=\\+\\~\\:\\#\\;\\,]*)?)", Pattern.CASE_INSENSITIVE );
return pattern.matcher(string).matches();
} /**
* 判断是否为图片
*/
public static boolean isImage(String string){
Pattern pattern = Pattern.compile("\\S+\\.(jpg|jpeg|png|gif|bmp)(\\?\\S+)?$", Pattern.CASE_INSENSITIVE );
return isUrl(string) && pattern.matcher(string).matches();
} }

3、Demo

List<PictureTopVo> list = statisticsService.topList(from, to, limit, orderBy);
ExcelTitle[] titles = {
ExcelTitle.generate("图片名称", 400),
ExcelTitle.generate("缩略图", 100),
ExcelTitle.generate("访问次数", 100),
ExcelTitle.generate("回复次数", 100)};
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
String fileName = format.format(from) + "至"+ format.format(to) + "TOP" + limit +"统计.xls";
ExcelBean excelBean = new ExcelBean(fileName, "统计", titles);
for(PictureTopVo pictureTopVo : list){
excelBean.add(new String[]{pictureTopVo.getName(), pictureTopVo.getPath() + "?size=80", String.valueOf(pictureTopVo.getVisitCount()), String.valueOf(pictureTopVo.getFillCount())});
}
excelBean.setRowHeight(100);
ExcelUtils.export(excelBean, respone);

4、maven

<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.13</version>
</dependency>

JAVA导出Excel封装的更多相关文章

  1. Workbook导出excel封装的工具类

    在实际中导出excel非常常见,于是自己封装了一个导出数据到excel的工具类,先附上代码,最后会写出实例和解释.支持03和07两个版本的 excel. HSSF导出的是xls的excel,XSSF导 ...

  2. [转载]Java导出Excel

    一.需求介绍 当前B/S模式已成为应用开发的主流,而在开发企业办公系统的过程中,常常有客户这样子要求:把系统数据库中的数据导出到Excel,用户查看报表时直接用Excel打开.或者是:用户已经习惯用E ...

  3. java导出excel报错:getOutputStream() has already been called for this response

    对于java导出excel报错的问题,查了很多都说是在使用完输出流以后调用以下两行代码即可 out.clear(); out = pageContext.pushBody(); 但这也许是页面上输出时 ...

  4. java导出excel表格

    java导出excel表格: 1.导入jar包 <dependency> <groupId>org.apache.poi</groupId> <artifac ...

  5. java导出excel报表

    1.java导出excel报表: package cn.jcenterhome.util; import java.io.OutputStream;import java.util.List;impo ...

  6. Java导出Excel和CSV(简单Demo)

    Java导出Excel和CSV的简单实现,分别使用POI和JavaCSV. JavaBean public class ReportInfo { int id; String date; int nu ...

  7. Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类

    Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类 ============================== ©Copyright 蕃薯耀 20 ...

  8. java导出excel模板数据

    Java导出excel数据模板,这里直接贴代码开发,流程性的走下去就是步骤: String[] colName=new String[]{"期间","科目代码" ...

  9. java导出excel工具类

    java导出excel须要使用HSSFWorkbook这个类,须要导入poi-3.6-20091214.jar 工具类调用例如以下: package com.qlwb.business.util; i ...

随机推荐

  1. CodeforcesGym101116 B Bulbs

    Description Greg has an \(m \times n\) grid of Sweet Lightbulbs of Pure Coolness he would like to tu ...

  2. c3p0数据库连接池的使用

    一.c3p0与dbcp区别 dbcp没有自动回收空闲连接的功能 c3p0有自动回收空闲连接功能 <C3P0是Hibernate3.0默认的自带数据库连接池,DBCP是Apache开发的数据库连接 ...

  3. wireshark设置抓服务器的包

    wireshark设置抓服务器的包:

  4. Android WebView JavaScript交互

    今天介绍一下,Android中Webview与JavaScript的交互,首先是在布局文件里添加webview控件: <WebView android:id="@+id/webview ...

  5. poj3519

    凡是差分约束系统的题目都是转化为d[j]-d[i]<=w[i,j]的形式然后我们建立边i-->j 边权为w[i,j]对于这道题,要求d[n]-d[1]尽可能的大设d[i]为相对差,d[1] ...

  6. Microsoft Windows 远程权限提升漏洞(CVE-2013-3175)(MS13-062)

    漏洞版本: Microsoft Windows XP Microsoft Windows Vista Microsoft Windows Server 2008 Microsoft Windows R ...

  7. java 去掉字符串右侧空格

    public static String rightTrim(String str) {    String regex = "(.*\\S+)(\\s+$)";    Patte ...

  8. 【转】Ubuntu14.04搭建安装svnserver

    原文网址:http://www.cnblogs.com/blfshiye/p/5168028.html 前两天,公司准备搭建一个svnserver,供大家使用.于是.就先装了一个Ubuntu系统,然后 ...

  9. maya 操作自我整理(二)

    随身携带自己的maya习惯我们在一台电脑上设置好自己的使用习惯,包括自己定义的快捷键.标记菜单.界面颜色.工具架等信息,当换到另一个工作环境时再进行设置十分不便利,将自己的习惯随身带走有利于我们更快捷 ...

  10. HTML Meta, http-equiv, Refresh

    原文: http://www.lifelaf.com/blog/?p=481 在HTML页面中,如果想实现定时刷新或重定向,我们可以使用meta标签的refresh功能: <!-- 5秒后刷新页 ...