JAVA导出Excel封装
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封装的更多相关文章
- Workbook导出excel封装的工具类
在实际中导出excel非常常见,于是自己封装了一个导出数据到excel的工具类,先附上代码,最后会写出实例和解释.支持03和07两个版本的 excel. HSSF导出的是xls的excel,XSSF导 ...
- [转载]Java导出Excel
一.需求介绍 当前B/S模式已成为应用开发的主流,而在开发企业办公系统的过程中,常常有客户这样子要求:把系统数据库中的数据导出到Excel,用户查看报表时直接用Excel打开.或者是:用户已经习惯用E ...
- java导出excel报错:getOutputStream() has already been called for this response
对于java导出excel报错的问题,查了很多都说是在使用完输出流以后调用以下两行代码即可 out.clear(); out = pageContext.pushBody(); 但这也许是页面上输出时 ...
- java导出excel表格
java导出excel表格: 1.导入jar包 <dependency> <groupId>org.apache.poi</groupId> <artifac ...
- java导出excel报表
1.java导出excel报表: package cn.jcenterhome.util; import java.io.OutputStream;import java.util.List;impo ...
- Java导出Excel和CSV(简单Demo)
Java导出Excel和CSV的简单实现,分别使用POI和JavaCSV. JavaBean public class ReportInfo { int id; String date; int nu ...
- Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类
Java 通过Xml导出Excel文件,Java Excel 导出工具类,Java导出Excel工具类 ============================== ©Copyright 蕃薯耀 20 ...
- java导出excel模板数据
Java导出excel数据模板,这里直接贴代码开发,流程性的走下去就是步骤: String[] colName=new String[]{"期间","科目代码" ...
- java导出excel工具类
java导出excel须要使用HSSFWorkbook这个类,须要导入poi-3.6-20091214.jar 工具类调用例如以下: package com.qlwb.business.util; i ...
随机推荐
- 应用Java(环境变量)
工作中,不一定非要设置Java环境变量 因为,IDE自身环境的设置,代替了系统环境变量 环境变量 系统的环境变量,相当于软件工作的环境.工作中,经常需要设置以下变量: Path ClassPath 自 ...
- [BZOJ 1028] [JSOI2007] 麻将 【枚举+贪心判断】
题目链接:BZOJ - 1028 题目分析 枚举听的是哪种牌,再枚举成对的是哪种牌,再贪心判断: 从1到n枚举每一种牌,如果这种牌的个数小于0,就返回不合法. 将这种牌的张数 % 3, 剩下的只能和 ...
- 国内更新Android SDK汇总
以下两个网站提供了响应的办法. http://www.androiddevtools.cn/ --国内镜像 http://blog.csdn.net/boonya/article/details/38 ...
- Hibernate Is Not Mapped(实体名 is not mapped [from book where id='0'])
org.springframework.orm.hibernate3.HibernateQueryException: USERINFO is not mapped.看到.hbm.xml文件中的< ...
- Android基础之响应Menu键弹出菜单Demo
对于Android我也不是很熟悉,只是学习一些基本内容就OK.所以写的内容也很简单.本Demo要实现的效果就点击Menu键将弹出一个菜单并响应点击菜单项事件. 一.废话少说直接上代码.其实就是重写两个 ...
- dump iot表
SQL> create user scan identified by scan default tablespace users; User created. SQL> grant db ...
- 【HDOJ】3696 Farm Game
SPFA求最短路径.见图的时候注意逆向建图. /* 3696 */ #include <iostream> #include <queue> #include <vect ...
- 【fs】
先判断是否存在再删除
- JavaScript 类型判断 —— typeof 以及 instanceof 中的陷阱
JavaScript中基本类型包含Undefined.Null.Boolean.Number.String以及Object引用类型.基本类型可以通过typeof来进行检测,对象类型可以通过instan ...
- SDN基础理解
本文转载自:http://blog.csdn.net/freezgw1985/article/details/16873677 个人觉得对很适合对SDN的入门级的概念性理解,先暂时copy一下,等研究 ...