- 浏览: 4719 次
- 性别:
- 来自: 杭州
-
文章分类
最新评论
-
BUYAOZAIBEIDAOLE:
我靠今天范了同样错误,真是撞到了
Java生成CSV文件 -
Coffee_Arthur:
<div class="quote_title ...
Excel的导出思路 -
kimimo:
<p>恰好昨天要在系统中加一个导出 ...
Excel的导出思路 -
leo77:
<div class="quote_title ...
Excel的导出思路 -
dengli19881102:
<div class="quote_title ...
Excel的导出思路
要做一个在网页上的Excel导出功能,略为想了一下思路:
1.在数据库查出数据用poi写进流在服务器保存再下载;
2.在数据库查出数据用poi直接写进客户的硬盘;
我个人感觉总怪怪的···
我新手第一次发帖
请有经验的达人分享宝贵的经验
嘿嘿 很具体 连单元格的样式都有
不错 超详细 “浏览器觉得这种恶心的格式自己显示不了”嘿嘿 赞!
非常精辟的回帖.
说的太棒了! 顶!
说得慢形象
精辟!
无论你想导出啥,只要在返回流中设置contentType的MIME类型。另外,可以修改Header里的Content-Disposition内容,比如选择附件方式下载,或给一个默认的文件名等。
说得不错,我也补充一下,检查格式的同时也会检查有没有附加Content-disposition这个变态指令,比如非要我以下载方式打开一个gif图片
膜拜
我也忍不住, 要赞下! 精辟!
我实在忍不住要赞美一下
好的回贴 形象生动
精辟,形象,如果恢复可以评精华的话,绝对评了。
不错 超详细 “浏览器觉得这种恶心的格式自己显示不了”嘿嘿 赞!
1.在数据库查出数据用poi写进流在服务器保存再下载;
2.在数据库查出数据用poi直接写进客户的硬盘;
我个人感觉总怪怪的···
我新手第一次发帖
请有经验的达人分享宝贵的经验

评论
21 楼
Coffee_Arthur
2011-03-30
kimimo 写道
恰好昨天要在系统中加一个导出功能,于是在网上找到了这段代码,仅供参考:...
嘿嘿 很具体 连单元格的样式都有
20 楼
kimimo
2011-03-26
<p>恰好昨天要在系统中加一个导出功能,于是在网上找到了这段代码,仅供参考:</p>
<pre name="code" class="java">import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
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.HSSFComment;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
/**
* <p>ClassName: ExportToXls.java</p>
* <p>Description: 导出对象集合为Excel并输出指定到设备 </p>
* <p>Copyright: Copyright (c)2011</p>
*
* <p>Create at: 2011-3-25 下午09:06:58</p>
*
* <p>Modification History: Date Author Version Description</p>
* <p>--------------------------------------------------------</p>
*
* @param <T>
*
*/
public class ExportToXls<T> {
public void exportExcel(String title, Collection<T> dataset, OutputStream out) {
export(title, null, dataset, out, "yyyy-MM-dd");
}
public void exportExcel(String title, String[] headers, Collection<T> dataset, OutputStream out) {
export(title, headers, dataset, out, "yyyy-MM-dd");
}
public void exportExcel(String title, String[] headers, Collection<T> dataset, OutputStream out, String pattern) {
export(title, headers, dataset, out, pattern);
}
/*
* 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
*
* @param title 表格标题名
*
* @param headers 表格属性列名数组
*
* @param dataset 需要显示的数据集合,集合中一定要放置符合JavaBean风格的类的对象。此方法支持的
* JavaBean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
*
* @param out 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
*
* @param pattern 如果有时间数据,设定输出格式。默认为"yyy-MM-dd"
*/
@SuppressWarnings("unchecked")
public void export(String title, String[] headers,Collection<T> dataset, OutputStream out, String pattern) {
// 声明一个工作薄
HSSFWorkbook workbook = new HSSFWorkbook();
// 生成一个表格
HSSFSheet sheet = workbook.createSheet(title);
// 设置表格默认列宽度为15个字节
sheet.setDefaultColumnWidth(15);
// 生成一个样式
HSSFCellStyle style = workbook.createCellStyle();
// 设置这些样式
style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
// 生成一个字体
HSSFFont font = workbook.createFont();
font.setColor(HSSFColor.VIOLET.index);
font.setFontHeightInPoints((short) 12);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
// 把字体应用到当前的样式
style.setFont(font);
// 生成并设置另一个样式
HSSFCellStyle style2 = workbook.createCellStyle();
style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
// 生成另一个字体
HSSFFont font2 = workbook.createFont();
font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
// 把字体应用到当前的样式
style2.setFont(font2);
// 声明一个画图的顶级管理器
HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
// 定义注释的大小和位置,详见文档
HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0,0, 0, 0, (short) 4, 2, (short) 6, 5));
// 设置注释内容
comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));
// 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容.
comment.setAuthor("ZoomLion");
// 产生表格标题行
HSSFRow row = sheet.createRow(0);
for (int i = 0; i < headers.length; i++) {
HSSFCell cell = row.createCell(i);
cell.setCellStyle(style);
HSSFRichTextString text = new HSSFRichTextString(headers[i]);
cell.setCellValue(text);
}
// 遍历集合数据,产生数据行
Iterator<T> it = dataset.iterator();
int index = 0;
while (it.hasNext()) {
index++;
row = sheet.createRow(index);
T t = (T) it.next();
// 利用反射,根据JavaBean属性的先后顺序,动态调用getXxx()方法得到属性值
Field[] fields = t.getClass().getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
HSSFCell cell = row.createCell(i);
cell.setCellStyle(style2);
Field field = fields[i];
String fieldName = field.getName();
String getMethodName = "get"
+ fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);
try {
Class clazz = t.getClass();
Method getMethod = clazz.getMethod(getMethodName,new Class[] {});
Object value = getMethod.invoke(t, new Object[] {});
// 判断值的类型后进行强制类型转换
String textValue = null;
if (value instanceof Integer) {
int intValue = (Integer) value;
cell.setCellValue(intValue);
} else if (value instanceof Float) {
float fValue = (Float) value;
cell.setCellValue(new HSSFRichTextString(String
.valueOf(fValue)));
} else if (value instanceof Double) {
double dValue = (Double) value;
cell.setCellValue(new HSSFRichTextString(String
.valueOf(dValue)));
} else if (value instanceof Long) {
long longValue = (Long) value;
cell.setCellValue(longValue);
}else if (value instanceof Boolean) {
boolean bValue = (Boolean) value;
cell.setCellValue(bValue);
} else if (value instanceof Date) {
Date date = (Date) value;
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
cell.setCellValue(sdf.format(date));
} else if (value instanceof byte[]) {
// 有图片时,设置行高为60px;
row.setHeightInPoints(60);
// 设置图片所在列宽度为80px,注意这里单位的一个换算
sheet.setColumnWidth(i, (short) (35.7 * 80));
// sheet.autoSizeColumn(i);
byte[] bsValue = (byte[]) value;
HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 1023, 255, (short) 6, index, (short) 6, index);
anchor.setAnchorType(2);
patriarch.createPicture(anchor, workbook.addPicture(bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG));
} else {
// 其它数据类型都当作字符串简单处理
cell.setCellValue(value.toString());
}
// 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成
if (textValue != null) {
Pattern p = Pattern.compile("^\\d+(\\.\\d+)?$");
Matcher matcher = p.matcher(textValue);
if (matcher.matches()) {
// 是数字当作double处理
cell.setCellValue(Double.parseDouble(textValue));
} else {
HSSFRichTextString richString = new HSSFRichTextString(
textValue);
HSSFFont font3 = workbook.createFont();
font3.setColor(HSSFColor.BLUE.index);
richString.applyFont(font3);
cell.setCellValue(richString);
}
}
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 清理资源
}
}
}
try {
workbook.write(out);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}</pre>
<pre name="code" class="java">import java.io.IOException;
import java.io.OutputStream;
import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.text.SimpleDateFormat;
import java.util.Collection;
import java.util.Date;
import java.util.Iterator;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
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.HSSFComment;
import org.apache.poi.hssf.usermodel.HSSFFont;
import org.apache.poi.hssf.usermodel.HSSFPatriarch;
import org.apache.poi.hssf.usermodel.HSSFRichTextString;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.hssf.util.HSSFColor;
/**
* <p>ClassName: ExportToXls.java</p>
* <p>Description: 导出对象集合为Excel并输出指定到设备 </p>
* <p>Copyright: Copyright (c)2011</p>
*
* <p>Create at: 2011-3-25 下午09:06:58</p>
*
* <p>Modification History: Date Author Version Description</p>
* <p>--------------------------------------------------------</p>
*
* @param <T>
*
*/
public class ExportToXls<T> {
public void exportExcel(String title, Collection<T> dataset, OutputStream out) {
export(title, null, dataset, out, "yyyy-MM-dd");
}
public void exportExcel(String title, String[] headers, Collection<T> dataset, OutputStream out) {
export(title, headers, dataset, out, "yyyy-MM-dd");
}
public void exportExcel(String title, String[] headers, Collection<T> dataset, OutputStream out, String pattern) {
export(title, headers, dataset, out, pattern);
}
/*
* 这是一个通用的方法,利用了JAVA的反射机制,可以将放置在JAVA集合中并且符号一定条件的数据以EXCEL 的形式输出到指定IO设备上
*
* @param title 表格标题名
*
* @param headers 表格属性列名数组
*
* @param dataset 需要显示的数据集合,集合中一定要放置符合JavaBean风格的类的对象。此方法支持的
* JavaBean属性的数据类型有基本数据类型及String,Date,byte[](图片数据)
*
* @param out 与输出设备关联的流对象,可以将EXCEL文档导出到本地文件或者网络中
*
* @param pattern 如果有时间数据,设定输出格式。默认为"yyy-MM-dd"
*/
@SuppressWarnings("unchecked")
public void export(String title, String[] headers,Collection<T> dataset, OutputStream out, String pattern) {
// 声明一个工作薄
HSSFWorkbook workbook = new HSSFWorkbook();
// 生成一个表格
HSSFSheet sheet = workbook.createSheet(title);
// 设置表格默认列宽度为15个字节
sheet.setDefaultColumnWidth(15);
// 生成一个样式
HSSFCellStyle style = workbook.createCellStyle();
// 设置这些样式
style.setFillForegroundColor(HSSFColor.SKY_BLUE.index);
style.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
style.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style.setBorderRight(HSSFCellStyle.BORDER_THIN);
style.setBorderTop(HSSFCellStyle.BORDER_THIN);
style.setAlignment(HSSFCellStyle.ALIGN_CENTER);
// 生成一个字体
HSSFFont font = workbook.createFont();
font.setColor(HSSFColor.VIOLET.index);
font.setFontHeightInPoints((short) 12);
font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);
// 把字体应用到当前的样式
style.setFont(font);
// 生成并设置另一个样式
HSSFCellStyle style2 = workbook.createCellStyle();
style2.setFillForegroundColor(HSSFColor.LIGHT_YELLOW.index);
style2.setFillPattern(HSSFCellStyle.SOLID_FOREGROUND);
style2.setBorderBottom(HSSFCellStyle.BORDER_THIN);
style2.setBorderLeft(HSSFCellStyle.BORDER_THIN);
style2.setBorderRight(HSSFCellStyle.BORDER_THIN);
style2.setBorderTop(HSSFCellStyle.BORDER_THIN);
style2.setAlignment(HSSFCellStyle.ALIGN_CENTER);
style2.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
// 生成另一个字体
HSSFFont font2 = workbook.createFont();
font2.setBoldweight(HSSFFont.BOLDWEIGHT_NORMAL);
// 把字体应用到当前的样式
style2.setFont(font2);
// 声明一个画图的顶级管理器
HSSFPatriarch patriarch = sheet.createDrawingPatriarch();
// 定义注释的大小和位置,详见文档
HSSFComment comment = patriarch.createComment(new HSSFClientAnchor(0,0, 0, 0, (short) 4, 2, (short) 6, 5));
// 设置注释内容
comment.setString(new HSSFRichTextString("可以在POI中添加注释!"));
// 设置注释作者,当鼠标移动到单元格上是可以在状态栏中看到该内容.
comment.setAuthor("ZoomLion");
// 产生表格标题行
HSSFRow row = sheet.createRow(0);
for (int i = 0; i < headers.length; i++) {
HSSFCell cell = row.createCell(i);
cell.setCellStyle(style);
HSSFRichTextString text = new HSSFRichTextString(headers[i]);
cell.setCellValue(text);
}
// 遍历集合数据,产生数据行
Iterator<T> it = dataset.iterator();
int index = 0;
while (it.hasNext()) {
index++;
row = sheet.createRow(index);
T t = (T) it.next();
// 利用反射,根据JavaBean属性的先后顺序,动态调用getXxx()方法得到属性值
Field[] fields = t.getClass().getDeclaredFields();
for (int i = 0; i < fields.length; i++) {
HSSFCell cell = row.createCell(i);
cell.setCellStyle(style2);
Field field = fields[i];
String fieldName = field.getName();
String getMethodName = "get"
+ fieldName.substring(0, 1).toUpperCase()
+ fieldName.substring(1);
try {
Class clazz = t.getClass();
Method getMethod = clazz.getMethod(getMethodName,new Class[] {});
Object value = getMethod.invoke(t, new Object[] {});
// 判断值的类型后进行强制类型转换
String textValue = null;
if (value instanceof Integer) {
int intValue = (Integer) value;
cell.setCellValue(intValue);
} else if (value instanceof Float) {
float fValue = (Float) value;
cell.setCellValue(new HSSFRichTextString(String
.valueOf(fValue)));
} else if (value instanceof Double) {
double dValue = (Double) value;
cell.setCellValue(new HSSFRichTextString(String
.valueOf(dValue)));
} else if (value instanceof Long) {
long longValue = (Long) value;
cell.setCellValue(longValue);
}else if (value instanceof Boolean) {
boolean bValue = (Boolean) value;
cell.setCellValue(bValue);
} else if (value instanceof Date) {
Date date = (Date) value;
SimpleDateFormat sdf = new SimpleDateFormat(pattern);
cell.setCellValue(sdf.format(date));
} else if (value instanceof byte[]) {
// 有图片时,设置行高为60px;
row.setHeightInPoints(60);
// 设置图片所在列宽度为80px,注意这里单位的一个换算
sheet.setColumnWidth(i, (short) (35.7 * 80));
// sheet.autoSizeColumn(i);
byte[] bsValue = (byte[]) value;
HSSFClientAnchor anchor = new HSSFClientAnchor(0, 0, 1023, 255, (short) 6, index, (short) 6, index);
anchor.setAnchorType(2);
patriarch.createPicture(anchor, workbook.addPicture(bsValue, HSSFWorkbook.PICTURE_TYPE_JPEG));
} else {
// 其它数据类型都当作字符串简单处理
cell.setCellValue(value.toString());
}
// 如果不是图片数据,就利用正则表达式判断textValue是否全部由数字组成
if (textValue != null) {
Pattern p = Pattern.compile("^\\d+(\\.\\d+)?$");
Matcher matcher = p.matcher(textValue);
if (matcher.matches()) {
// 是数字当作double处理
cell.setCellValue(Double.parseDouble(textValue));
} else {
HSSFRichTextString richString = new HSSFRichTextString(
textValue);
HSSFFont font3 = workbook.createFont();
font3.setColor(HSSFColor.BLUE.index);
richString.applyFont(font3);
cell.setCellValue(richString);
}
}
} catch (SecurityException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NoSuchMethodException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalArgumentException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InvocationTargetException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} finally {
// 清理资源
}
}
}
try {
workbook.write(out);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}</pre>
19 楼
leo77
2011-03-26
Coffee_Arthur 写道
congdepeng 写道
1.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个text/html文件,浏览器觉得text/html格式可以显示在浏览器里面,于是显示。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个图片文件,浏览器觉得这种图片文件格式可以显示在浏览器里面,于是显示。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个Excel文件,浏览器觉得这种恶心的格式自己显示不了,于是查询浏览器插件,看看是否有插件支持显示这个格式,如果发现有,那么根据插件的配合,显示这个格式。如果连插件都没有支持这个格式,那么就弹出一个统一的下载/保存对话框,让当前的用户去决定怎么干吧,浏览器觉得反正这活是没法干了。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个图片文件,浏览器觉得这种图片文件格式可以显示在浏览器里面,于是显示。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个Excel文件,浏览器觉得这种恶心的格式自己显示不了,于是查询浏览器插件,看看是否有插件支持显示这个格式,如果发现有,那么根据插件的配合,显示这个格式。如果连插件都没有支持这个格式,那么就弹出一个统一的下载/保存对话框,让当前的用户去决定怎么干吧,浏览器觉得反正这活是没法干了。

非常精辟的回帖.

18 楼
dengli19881102
2011-03-26
congdepeng 写道
1.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个text/html文件,浏览器觉得text/html格式可以显示在浏览器里面,于是显示。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个图片文件,浏览器觉得这种图片文件格式可以显示在浏览器里面,于是显示。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个Excel文件,浏览器觉得这种恶心的格式自己显示不了,于是查询浏览器插件,看看是否有插件支持显示这个格式,如果发现有,那么根据插件的配合,显示这个格式。如果连插件都没有支持这个格式,那么就弹出一个统一的下载/保存对话框,让当前的用户去决定怎么干吧,浏览器觉得反正这活是没法干了。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个图片文件,浏览器觉得这种图片文件格式可以显示在浏览器里面,于是显示。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个Excel文件,浏览器觉得这种恶心的格式自己显示不了,于是查询浏览器插件,看看是否有插件支持显示这个格式,如果发现有,那么根据插件的配合,显示这个格式。如果连插件都没有支持这个格式,那么就弹出一个统一的下载/保存对话框,让当前的用户去决定怎么干吧,浏览器觉得反正这活是没法干了。
说的太棒了! 顶!
17 楼
cenxiaobai
2011-03-26
hastune 写道
用jxl写在服务器上再提供下载,我是这样做的。

说得慢形象
16 楼
hastune
2011-03-25
用jxl写在服务器上再提供下载,我是这样做的。

15 楼
learnworld
2011-03-25
congdepeng 写道
1.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个text/html文件,浏览器觉得text/html格式可以显示在浏览器里面,于是显示。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个图片文件,浏览器觉得这种图片文件格式可以显示在浏览器里面,于是显示。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个Excel文件,浏览器觉得这种恶心的格式自己显示不了,于是查询浏览器插件,看看是否有插件支持显示这个格式,如果发现有,那么根据插件的配合,显示这个格式。如果连插件都没有支持这个格式,那么就弹出一个统一的下载/保存对话框,让当前的用户去决定怎么干吧,浏览器觉得反正这活是没法干了。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个图片文件,浏览器觉得这种图片文件格式可以显示在浏览器里面,于是显示。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个Excel文件,浏览器觉得这种恶心的格式自己显示不了,于是查询浏览器插件,看看是否有插件支持显示这个格式,如果发现有,那么根据插件的配合,显示这个格式。如果连插件都没有支持这个格式,那么就弹出一个统一的下载/保存对话框,让当前的用户去决定怎么干吧,浏览器觉得反正这活是没法干了。
精辟!
无论你想导出啥,只要在返回流中设置contentType的MIME类型。另外,可以修改Header里的Content-Disposition内容,比如选择附件方式下载,或给一个默认的文件名等。
14 楼
Coffee_Arthur
2011-03-25
1楼确实犀利
13 楼
mlw2000
2011-03-25
congdepeng 写道
1.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个text/html文件,浏览器觉得text/html格式可以显示在浏览器里面,于是显示。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个图片文件,浏览器觉得这种图片文件格式可以显示在浏览器里面,于是显示。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个Excel文件,浏览器觉得这种恶心的格式自己显示不了,于是查询浏览器插件,看看是否有插件支持显示这个格式,如果发现有,那么根据插件的配合,显示这个格式。如果连插件都没有支持这个格式,那么就弹出一个统一的下载/保存对话框,让当前的用户去决定怎么干吧,浏览器觉得反正这活是没法干了。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个图片文件,浏览器觉得这种图片文件格式可以显示在浏览器里面,于是显示。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个Excel文件,浏览器觉得这种恶心的格式自己显示不了,于是查询浏览器插件,看看是否有插件支持显示这个格式,如果发现有,那么根据插件的配合,显示这个格式。如果连插件都没有支持这个格式,那么就弹出一个统一的下载/保存对话框,让当前的用户去决定怎么干吧,浏览器觉得反正这活是没法干了。
说得不错,我也补充一下,检查格式的同时也会检查有没有附加Content-disposition这个变态指令,比如非要我以下载方式打开一个gif图片
12 楼
anyasir
2011-03-25
congdepeng 写道
1.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个text/html文件,浏览器觉得text/html格式可以显示在浏览器里面,于是显示。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个图片文件,浏览器觉得这种图片文件格式可以显示在浏览器里面,于是显示。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个Excel文件,浏览器觉得这种恶心的格式自己显示不了,于是查询浏览器插件,看看是否有插件支持显示这个格式,如果发现有,那么根据插件的配合,显示这个格式。如果连插件都没有支持这个格式,那么就弹出一个统一的下载/保存对话框,让当前的用户去决定怎么干吧,浏览器觉得反正这活是没法干了。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个图片文件,浏览器觉得这种图片文件格式可以显示在浏览器里面,于是显示。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个Excel文件,浏览器觉得这种恶心的格式自己显示不了,于是查询浏览器插件,看看是否有插件支持显示这个格式,如果发现有,那么根据插件的配合,显示这个格式。如果连插件都没有支持这个格式,那么就弹出一个统一的下载/保存对话框,让当前的用户去决定怎么干吧,浏览器觉得反正这活是没法干了。
膜拜
11 楼
Hyphoon
2011-03-25
congdepeng 写道
1.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个text/html文件,浏览器觉得text/html格式可以显示在浏览器里面,于是显示。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个图片文件,浏览器觉得这种图片文件格式可以显示在浏览器里面,于是显示。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个Excel文件,浏览器觉得这种恶心的格式自己显示不了,于是查询浏览器插件,看看是否有插件支持显示这个格式,如果发现有,那么根据插件的配合,显示这个格式。如果连插件都没有支持这个格式,那么就弹出一个统一的下载/保存对话框,让当前的用户去决定怎么干吧,浏览器觉得反正这活是没法干了。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个图片文件,浏览器觉得这种图片文件格式可以显示在浏览器里面,于是显示。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个Excel文件,浏览器觉得这种恶心的格式自己显示不了,于是查询浏览器插件,看看是否有插件支持显示这个格式,如果发现有,那么根据插件的配合,显示这个格式。如果连插件都没有支持这个格式,那么就弹出一个统一的下载/保存对话框,让当前的用户去决定怎么干吧,浏览器觉得反正这活是没法干了。
我也忍不住, 要赞下! 精辟!
10 楼
mxp
2011-03-25
congdepeng 写道
1.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个text/html文件,浏览器觉得text/html格式可以显示在浏览器里面,于是显示。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个图片文件,浏览器觉得这种图片文件格式可以显示在浏览器里面,于是显示。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个Excel文件,浏览器觉得这种恶心的格式自己显示不了,于是查询浏览器插件,看看是否有插件支持显示这个格式,如果发现有,那么根据插件的配合,显示这个格式。如果连插件都没有支持这个格式,那么就弹出一个统一的下载/保存对话框,让当前的用户去决定怎么干吧,浏览器觉得反正这活是没法干了。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个图片文件,浏览器觉得这种图片文件格式可以显示在浏览器里面,于是显示。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个Excel文件,浏览器觉得这种恶心的格式自己显示不了,于是查询浏览器插件,看看是否有插件支持显示这个格式,如果发现有,那么根据插件的配合,显示这个格式。如果连插件都没有支持这个格式,那么就弹出一个统一的下载/保存对话框,让当前的用户去决定怎么干吧,浏览器觉得反正这活是没法干了。
我实在忍不住要赞美一下
9 楼
7_day
2011-03-25
congdepeng 写道
1.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个text/html文件,浏览器觉得text/html格式可以显示在浏览器里面,于是显示。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个图片文件,浏览器觉得这种图片文件格式可以显示在浏览器里面,于是显示。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个Excel文件,浏览器觉得这种恶心的格式自己显示不了,于是查询浏览器插件,看看是否有插件支持显示这个格式,如果发现有,那么根据插件的配合,显示这个格式。如果连插件都没有支持这个格式,那么就弹出一个统一的下载/保存对话框,让当前的用户去决定怎么干吧,浏览器觉得反正这活是没法干了。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个图片文件,浏览器觉得这种图片文件格式可以显示在浏览器里面,于是显示。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个Excel文件,浏览器觉得这种恶心的格式自己显示不了,于是查询浏览器插件,看看是否有插件支持显示这个格式,如果发现有,那么根据插件的配合,显示这个格式。如果连插件都没有支持这个格式,那么就弹出一个统一的下载/保存对话框,让当前的用户去决定怎么干吧,浏览器觉得反正这活是没法干了。
好的回贴 形象生动
8 楼
eivenchan
2011-03-25
congdepeng 写道
1.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个text/html文件,浏览器觉得text/html格式可以显示在浏览器里面,于是显示。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个图片文件,浏览器觉得这种图片文件格式可以显示在浏览器里面,于是显示。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个Excel文件,浏览器觉得这种恶心的格式自己显示不了,于是查询浏览器插件,看看是否有插件支持显示这个格式,如果发现有,那么根据插件的配合,显示这个格式。如果连插件都没有支持这个格式,那么就弹出一个统一的下载/保存对话框,让当前的用户去决定怎么干吧,浏览器觉得反正这活是没法干了。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个图片文件,浏览器觉得这种图片文件格式可以显示在浏览器里面,于是显示。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个Excel文件,浏览器觉得这种恶心的格式自己显示不了,于是查询浏览器插件,看看是否有插件支持显示这个格式,如果发现有,那么根据插件的配合,显示这个格式。如果连插件都没有支持这个格式,那么就弹出一个统一的下载/保存对话框,让当前的用户去决定怎么干吧,浏览器觉得反正这活是没法干了。
精辟,形象,如果恢复可以评精华的话,绝对评了。
7 楼
風一樣的男子
2011-03-25
如果只是简单的就去看看我那个方法
6 楼
shybo
2011-03-25
我以前做过的一个项目,导出的Excel需要在服务器上备份的,我就把需要导出的excel写在服务器的硬盘上,然后提供一个路径让用户下载,如果用户选择多个的话就打个zip包,用流输出到客户端浏览器上,然后用户点保存就可以了。
5 楼
Javac_MyLife
2011-03-25
楼上说的都挺明白了~很形象啊~
4 楼
Coffee_Arthur
2011-03-24
congdepeng 写道
1.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个text/html文件,浏览器觉得text/html格式可以显示在浏览器里面,于是显示。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个图片文件,浏览器觉得这种图片文件格式可以显示在浏览器里面,于是显示。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个Excel文件,浏览器觉得这种恶心的格式自己显示不了,于是查询浏览器插件,看看是否有插件支持显示这个格式,如果发现有,那么根据插件的配合,显示这个格式。如果连插件都没有支持这个格式,那么就弹出一个统一的下载/保存对话框,让当前的用户去决定怎么干吧,浏览器觉得反正这活是没法干了。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个图片文件,浏览器觉得这种图片文件格式可以显示在浏览器里面,于是显示。
2.浏览器请求一个资源,请求成功,返回一个响应流,查询返回头里面的描述,发现是一个Excel文件,浏览器觉得这种恶心的格式自己显示不了,于是查询浏览器插件,看看是否有插件支持显示这个格式,如果发现有,那么根据插件的配合,显示这个格式。如果连插件都没有支持这个格式,那么就弹出一个统一的下载/保存对话框,让当前的用户去决定怎么干吧,浏览器觉得反正这活是没法干了。

3 楼
yijinwen_msn
2011-03-24
建议你如果用在项目里面 抽离出来 写一个公共的处理,省时省力
2 楼
ericyanzhe
2011-03-24
从数据库查询出数据,用poi生成workbook对象,把这个对象用流输出给浏览器。
当然,像楼上说的,你得告诉浏览器你给了它一个excel。
当然,像楼上说的,你得告诉浏览器你给了它一个excel。
相关推荐
标题“页面报表导出思路”涉及的是在网页应用中如何实现报表的导出功能,这通常是为了方便用户保存和分享数据。在这个过程中,开发者需要考虑多种技术和策略来满足不同的需求。下面将详细讨论这个主题。 首先,报表...
Delphi 高效率导出数据到 Excel Delphi 是一个功能强大的开发工具,可以用于开发各种类型的应用程序,而 Excel 是一个非常popular的电子表格软件,经常用于数据分析和处理。在实际开发中,我们经常需要将数据从 ...
在QT编程中,高效地导入和导出Excel数据并将其显示在`tableWidget`中是一项常见的需求。这里我们将深入探讨如何实现这一功能,以及优化性能的方法。QT是一个跨平台的应用程序开发框架,提供了丰富的GUI组件,`...
### easyui的datagrid数据excel导出 #### 一、知识点概览 1. **EasyUI框架简介** 2. **DataGrid组件概述** 3. **DataGrid的列配置** 4. **将DataGrid转换为表格(Table)结构** 5. **导出至Excel的具体实现** 6. *...
这部分代码较为复杂且不完整,主要思路是创建一个新的Excel应用程序实例,然后利用循环遍历`DataView`中的列和行,将数据逐条写入Excel工作表中。 以上四种方法各有特点,可以根据实际需求选择合适的方式实现数据库...
EPPlus功能齐全,太过臃肿,特别是对单元格合并比较复杂,我只需要简单的一个导出Excel的功能,所以进行了封装。 1.下载解压可直接运行项目 2.运行示例,访问api:GET ...
在Web开发中,经常需要处理的数据最终以Excel格式呈现给用户。... #### 技术背景及优势 ...随着前端技术的不断发展以及浏览器兼容性的改善,预计未来这种轻量级且灵活多变的Excel导出方式将会得到更广泛的应用与推广。
导出Excel包含的功能: 1.多表头导出最多支持到三行,表头格式说明 相邻父列头之间用'#'分隔,父列头与子列头用空格(' ')分隔,相邻子列头用逗号分隔(',') 两行:序号#分公司#组别#本日成功签约单数 预警,续约,流失,...
导出Excel包含的功能: 1.多表头导出最多支持到三行,表头格式说明 相邻父列头之间用'#'分隔,父列头与子列头用空格(' ')分隔,相邻子列头用逗号分隔(',') 两行:序号#分公司#组别#本日成功签约单数 预警,续约,流失,...
在IT行业中,"导出Excel"是一个常见的任务,特别是在数据处理和分析的场景下。这里,我们主要讨论如何使用第三方控件来实现这个功能。"sjx_xxx"标签可能代表一个特定的库或者组件,但没有具体信息,我们将假设它是一...
这种方法更安全,因为它不会暴露原始HTML表格,而是提供一个专门的Excel导出界面。 在使用这些方法时,需要注意以下几点: - 对于JavaScript方法,由于涉及ActiveXObject,可能需要降低IE的安全级别或者将网站添加...
### Java POI 大量数据导出到Excel详解 #### 一、背景介绍 在日常工作中,经常需要处理大量的数据并将其导出为Excel文件,特别是...在未来的工作中,随着数据规模的不断扩大,掌握高效的Excel导出技术将变得尤为重要。
使用JavaScript实现打印和导出为Excel文件是前端开发中的常见任务,尽管给定的代码示例提供了一种基础的实现思路,但在实际项目中,开发者应考虑浏览器兼容性和用户体验,选择更为稳定、兼容性好的解决方案。...
要实现从`GridView`到Excel的导出,基本思路是通过客户端浏览器直接生成一个Excel文件。具体来说,服务器端将GridView中的数据转换成Excel格式的内容,并设置响应头以告知浏览器这是一个可以下载的Excel文件。这一...
或者设置列宽、行高,或者合并单元格,或者自动列宽,或者插入批注,或者读取Excel数据,又或者日期、数字或者自定义格式转换等等的需求时,可以参考本资源里面的《导出Excel教程.docx》里面给的需求思路。...
网上excel导入导出的例子一大把,但是想找个真正自己想要的,而且不报错的,确实比较难。之前我做项目的时候,是因为做导入的时候,要控制excel的格式, 一直没有找到合适的例子来参考,而且看有些例子,说着是很...
要实现DataGridView导出到Excel的功能而不依赖于Excel组件,主要思路是利用文本文件模拟Excel的工作表。由于Excel可以识别特定格式的文本文件并将其解析为工作表,因此我们可以通过编写代码来生成这种格式的文本文件...
【Excel导入导出数据库小工具】是一款基于C/S(客户端/服务器)架构的应用程序,它主要功能是方便用户将Excel数据高效地导入到数据库中,同时也能从数据库中导出数据到Excel文件。这款工具是C#编程语言实现的,为IT...
在Excel中,将数据导出并保存到不同的Sheet页是一种常见的需求,这通常涉及到多表数据管理和分析。本文将深入探讨如何实现这一功能,并提供相关的编程实现思路。 首先,了解Excel的基本结构。Excel是一个电子表格...