jxl 、 apache.poi.hssf 实现本地, 服务器断的下载
博客专区 > QH_C 的博客 > 博客详情
jxl 、 apache.poi.hssf 实现本地, 服务器断的下载
QH_C 发表于3年前
jxl 、 apache.poi.hssf 实现本地, 服务器断的下载
  • 发表于 3年前
  • 阅读 21
  • 收藏 0
  • 点赞 0
  • 评论 0

腾讯云实验室 1小时搭建人工智能应用,让技术更容易入门 免费体验 >>>   

摘要: jxl 、 HSSFWorkBook 实现本地, 服务器断的下载
jxl 实现下载:

package com.inspur;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;
import jxl.write.biff.RowsExceededException;
/*  jxl 实现下载  */
/**
 *@author  WHD
 *2014-11-15
 */
public class JxlOut {
public static void main(String[]args) throws IOException, RowsExceededException, WriteException{
File file= new File("I:/TESTfxl.xls");
//如果不是从服务器下载到本地则输出流不用File方式而使用resonance.getOutPutStream()方式获取输出流就ok了 
//使用 OutputStream output=response.getOutputStream()来代替,
//FileOutPutStream这样我们就不用提前来写路径,也就是可以直接下载到客户端选择的路径下
FileOutputStream  output= new FileOutputStream(file);
WritableWorkbook wwb = Workbook.createWorkbook(output);//创建工作簿
WritableSheet ws = wwb.createSheet("Sheet1", 0);//创建工作sheet页        
// 将具体数据添加到具体页面,而这里的赋值可以使用循环将数据库中
//取出的数据 全都添加到sheet中 如果数据多的话还可以使用多个sheet
// sheet 就是 excel中的一页
Label labelC = new Label(0, 0, "jxltest");
ws.addCell(labelC);
// 写出到指定的流中
wwb.write();
// 关闭物理资源
wwb.close();
output.flush();
output.close();
}
}
/* apache.poi.hssf HSSFWorkBook 实现下载  */
/**
 * excel 模板下载  实际项目中使用到的下载
 */
 
@RequestMapping(value = "downExcelTemplate")
public void downExcelTemplate(HttpServletResponse response) {
// 获取元数据id 在获取数据个数形成excel 模板
String meta_id = this.getPara("meta_id");
// 获取对应数据源对应的表的字段属性
List<Map<String, Object>> list = new ArrayList<Map<String, Object>>();
// 这里获取的也就是item_def中 def_id=meta_id的name_cn,形成excel模板
list = datamanagerService.findItemById(meta_id);
// Map<String,Object> datas=new HashMap<String,Object>();
int i = 0;
// 将list中的值进行导出
try {
// 创建一个Excel文件
HSSFWorkbook workbook = new HSSFWorkbook();
// 创建一页
HSSFSheet sheet = workbook.createSheet();
// 创建一行
HSSFRow row = sheet.createRow(0);
// 创建一列
HSSFCell cell = null;
// 遍历向excel中赋值
for (Map<String, Object> data : list) {
cell = row.createCell(i);
cell.setCellValue((String) data.get("name_cn"));
++i;
}
 
// 生成excel
// 在从服务器的目录下进行下载
// 下载文件名
String fileName = "ExcelTemplate.xls";
response.reset();
response.setContentType("application/x-download");
response.addHeader("Content-Disposition", "attachment;filename="
+ fileName);
// 这样写在下载的时候会让你选择路劲,而如果使用
// OutputStream os= new FileOutputStream("G:"+File.separator+"test.java");
// 来代替os则就是本地下载
OutputStream os = response.getOutputStream();
workbook.write(os);
os.flush();
os.close();
} catch (Exception e) {
e.printStackTrace();
}
}

上面的两个都是将数据库中的数据组装成excel 的格式,并进行下载,怎么让他下载,或者说用何种方式来请求下载资源,方式有如下两种。

1、使用ajax异步请求将数据使用 response 的OutputStream来将数据输出到本地。

2、使用同步方式,有两种一种是使用form的button 来提交请求参数,另一种是使用window.location.href="Test?name=123&password=6789";这种方式来请求,两种方式都可以。

注意: 这里说一下使用“2” 中的同步方式是不会刷新现有页面的,因为他没有向该页面返回数据而是下载到了本地磁盘,所以现有页面不会被刷新。

上面我们看了两大种方式来实现,其实ajax方式是不能实现的,那是因为response原因,一般请求浏览器是会处理服务器输出的 response,例如生成png,文件下载等,ajax请求只是个“字符性”的请求,可以读取到返回的response,但只是读取而已,是无法执行的,说白点就是js无法调用到浏览器的下载处理机制和程序

这样看来只有第二种方式能直接实现下载了,但是第二种方式中使用哪一种那,建议使用form 的submit提交方式来实现,这样的话我们提交的参数是安全的而使用window.location.href="test?name=name&password=123" 这样的话参数直接暴露了所以建议使用form 的submit() 方式来实现。

下面来看看"2" 中的两种方式,写个小demo 如下:

1、form的submit() 方式实现:

function _excel(){

var mfrm=document.frm;

mfrm.action="Test";

mfrm.submit();

return true;

};

2、使用window.location.href=""方式实现:

function excel_(){

window.location.href="Test?name=123&password=6789";

}

 

共有 人打赏支持
粉丝 2
博文 30
码字总数 69153
×
QH_C
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: