您的位置:首页 > 编程语言 > Java开发

web导出excel--------java导出文件弹出下载框让用户选择路径

2015-08-10 11:04 766 查看
实现导出文件时 弹出下载框 主要是 设置成 文件流  stream 类型的response. 浏览器就会识别出 文件下载弹出 下载框。

这里总结三个方式

web-sturts框架中弹出

详见  
java通过struts实现web中的文件下载
其中关键的设置是
<struts>
<package name="struts2" extends="struts-default">
<action name="FileDownload" class="com.struts2.filedownload.FileDownload">
<result name="success" type="stream">
<param name="contentType">text/plain</param>
<param name="contentDisposition">attachment;fileName="${fileName}"</param>
<param name="inputName">downloadFile</param>
<param name="bufferSize">1024</param>
</result>
</action>

</package>

</struts>

web-SpringMvc等非struts框架中弹出

在response中设置头
response.addHeader("Content-Disposition", "attachment;filename="+ new String(filename.getBytes()));
OutputStream os= new BufferedOutputStream(response.getOutputStream());
response.setContentType("application/vnd.ms-excel;charset=gb2312");
os.write(buffer);
os.flush();
os.close();
例如:jsp页面 使用js    提交 post  form
$(document).ready(function() {
var $searchForm = $('#search_form').on('submit',function(){
$dt.DataTable().searchEx( {} ).draw();
return false;
}).on('click', 'button.export', function(){
var searchData={};
searchData.search=$('#search_form').formGet();
console.log(searchData);
post('/order/list/export',searchData);
});

function post(URL, PARAMS) {
var temp = document.createElement("form");
temp.action = URL;
temp.method = "post";
temp.style.display = "none";
for (var x in PARAMS.search) {
var opt = document.createElement("textarea");
if(x=="id"||x=="expressNumber"||x=="payStatus"){
opt.name = x;
opt.value = PARAMS.search[x];
temp.appendChild(opt);
}
}
document.body.appendChild(temp);
temp.submit();
}
}
后端接受参数后查询出数据,把生成的excel写入excel,返回文件流
@RequestMapping("/list/export")
public Object export(@RequestParam String id,@RequestParam String expressNumber,@RequestParam String payStatus,HttpServletResponse response) {
PagerRequest<Map> req=new PagerRequest<Map>();
req.setLength(0);
req.setOffset(0);
HashMap<String, String> search=new HashMap<String, String>();
search.put("id", id);
search.put("expressNumber", expressNumber);
search.put("payStatus", payStatus);
req.setSearch(search);
List<Order> orders = new ArrayList<Order>();
if (req.getSearch() == null||req.getSearch().size()==0) {
orders = (List<Order>) orderRepository.findAll();
} else {
Page<Order> page = orderRepository.listWithSearch(new PageRequest(
0,(int) orderRepository.count()), req
.getSearch());
orders = page.getContent();
}
if (productService.exportOrders(orders,response)) {
return null;
}
return null;

}

@Override
public boolean exportOrders(List<Order> orders, HttpServletResponse response) {
try {

ArrayList<String[]> contentsArrayList = new ArrayList<String[]>();
String[] titles = new String[14];
titles[0] = "订单日期";
titles[1] = "订单支付日期";
titles[2] = "订单编号";
titles[3] = "产品名称";
titles[4] = "产品类型";
titles[5] = "单价";
titles[6] = "购买数量";
titles[7] = "总金额";
titles[8] = "付款状态";
titles[9] = "收件人名称";
titles[10] = "收件人电话";
titles[11] = "配送地址";
titles[12] = "配送日期";
titles[13] = "发票信息";
contentsArrayList.add(titles);
for (int i = 0; i < orders.size(); i++) {
List<BuyList> butlists = orders.get(i).getBuyList();
for (BuyList buyList : butlists) {
String[] content = new String[14];
content[0] = orders.get(i).getCreateDate();
content[1] = orders.get(i).getPayDate();
content[2] = orders.get(i).getId();
content[3] = buyList.getProductName();
content[4] = buyList.getProductTypeStr();
if(buyList.getProductPrice()!=null){
content[5]=buyList.getProductPrice().toString();
}
content[6] = String.valueOf(buyList.getProductCount());
content[7] = orders.get(i).getTotalMoney();
content[8] = orders.get(i).getPayStatus() == Order.PAY_PAIY ? "已付款"
: "未付款";
content[9] = orders.get(i).getName();
content[10] = orders.get(i).getMobile();
content[11] = orders.get(i).getAddress();
OrderStatus orderStatus=orders.get(i).getOrderStatus();
if(orderStatus!=null){
HistoryStatus historyStatus=orderStatus.getCurrent();
if(historyStatus!=null){
if(historyStatus.getStatus()==OrderStatus.STATUS_SEND_OUT){
content[12] =historyStatus.getDatetime();
}
}
}
content[13] = orders.get(i).isHasInvoice() == true ? "是"
: "否";
contentsArrayList.add(content);
}
}
String[][] contents = ExcelUtils.changeToArray(contentsArrayList);
String fileName = ExcelUtils.writeExcel(contents, "订单",response);
return true;
} catch (Exception e) {
e.printStackTrace();

}
return false;
}
public static String writeExcel(String[][] titles, String title, HttpServletResponse response) throws IOException {
String fileName =title
+ Calendar.getInstance().getTimeInMillis();
response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename="+ new String((fileName + ".xls").getBytes(), "iso-8859-1"));
//根据传进来的file对象创建可写入的Excel工作薄
OutputStream os = response.getOutputStream();
WritableWorkbook wwb = null;
try {
// 首先要使用Workbook类的工厂方法创建一个可写入的工作薄(Workbook)对象

wwb = Workbook.createWorkbook(os);
} catch (IOException e) {
e.printStackTrace();
}
if (wwb != null) {
// 创建一个可写入的工作表
// Workbook的createSheet方法有两个参数,第一个是工作表的名称,第二个是工作表在工作薄中的位置
WritableSheet ws = wwb.createSheet(title, 1);

// 下面开始添加单元格
for (int row = 0; row < titles.length; row++) {
// System.out.println(row);
for (int j = 0; j < titles[row].length; j++) {
// 这里需要注意的是,在Excel中,第一个参数表示列,第二个表示行
Label labelC = new Label(j, row, titles[row][j]);

try {
// 将生成的单元格添加到工作表中
ws.addCell(labelC);
} catch (RowsExceededException e) {
e.printStackTrace();
} catch (WriteException e) {
e.printStackTrace();
}
}
}

try {
// 从内存中写入文件中
wwb.write();
// 关闭资源,释放内存
wwb.close();
os.flush();
os.close();
} catch (IOException e) {
e.printStackTrace();
} catch (WriteException e) {
e.printStackTrace();
}
}
return fileName;
}

public static String[][] changeToArray(ArrayList<String[]> contentsArrayList) {
String[][] contents = new String[contentsArrayList.size()][];
for (int i = 0; i < contentsArrayList.size(); i++) {
contents[i] = contentsArrayList.get(i);
}
return contents;
}


关键步骤在于
1.传入response
2.设置response的头部文件类型和 把工作簿写入 response的 outputStream中即可。无需特意返回response。
response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename="+ new String((fileName + ".xls").getBytes(), "iso-8859-1"));
        //根据传进来的file对象创建可写入的Excel工作薄  
        OutputStream os = response.getOutputStream();  
WritableWorkbook wwb = null;
try {
           首先要使用Workbook类的工厂方法创建一个可写入的工作薄(Workbook)对象
wwb = Workbook.createWorkbook(os);

ps: jsp中请求的action 记得要return null,因为 已经包含了 文件流的response。

如果不是return null的话则会冲突报错。

优化

jsp页面 使用js    提交 post  form
$(document).ready(function() {
var $searchForm = $('#search_form').on('submit',function(){
$dt.DataTable().searchEx( {} ).draw();
return false;
}).on('click', 'button.export', function(){
var searchData={};
searchData.search=$('#search_form').formGet();
console.log(searchData);
post('/order/list/export',searchData);
});

function post(URL, PARAMS) {
var temp = document.createElement("form");
temp.action = URL;
temp.method = "post";
temp.style.display = "none";
for (var x in PARAMS.search) {
var opt = document.createElement("textarea");
if(x=="id"||x=="expressNumber"||x=="payStatus"){
opt.name = x;
opt.value = PARAMS.search[x];
temp.appendChild(opt);
}
}
document.body.appendChild(temp);
temp.submit();
}
}

controller.class接收
@RequestMapping("/product-upgrade/list/export")
public void export(HttpServletRequest request, HttpServletResponse response) {
Map<String, String> search = new HashMap<>();
Enumeration<String> parameterNames = request.getParameterNames();
while (parameterNames.hasMoreElements()) {
String key = parameterNames.nextElement();
search.put(key, request.getParameter(key));
}
Query query = new Query();
Criteria criteria = new Criteria();
criteria.and("upgradeList").exists(true);
if (!StringUtils.isBlank(search.get("mobile")))
criteria.and("mobile").is(search.get("mobile"));
if (!StringUtils.isBlank(search.get("payStatus")))
criteria.and("payStatus").is(Integer.parseInt(search.get("payStatus")));

if (!StringUtils.isBlank(search.get("upgradeStatus"))) {
if("0".equals(search.get("upgradeStatus"))) {
criteria.orOperator(Criteria.where("upgradeStatus").exists(false), Criteria.where("upgradeStatus").is(0));
}else {
criteria.and("upgradeStatus").is(Integer.parseInt(search.get("upgradeStatus")));
}
}

if (!StringUtils.isEmpty(search.get("beginTime"))
|| !StringUtils.isEmpty(search.get("endTime"))) {
criteria = criteria.and("createDate");
if (!StringUtils.isEmpty(search.get("beginTime")))
criteria.gte(DateUtils.parse(search.get("beginTime")));
if (!StringUtils.isEmpty(search.get("endTime")))
criteria.lte(DateUtils.parse(search.get("endTime")));

}
query.addCriteria(criteria);
query.with(new Sort(Sort.Direction.DESC, "createDate"));
List<Order> list = mongoTemplate.find(query, Order.class);
exportProductUpgradeOrder(list, response);
}

@Override
public boolean exportProductUpgradeOrder(List<Order> orders, HttpServletResponse response) {
try {

ArrayList<String[]> contentsArrayList = new ArrayList<>();
String[] titles = new String[]{
"订单编号", "订单名称", "唾液盒编号", "手机", "总金额", "在线支付",
"支付状态", "升级状态", "创建时间", "升级备注"};

Boolean[] titleNumFlags = new Boolean[]{
false, false, false, false, true, true,
false, false, false, false};// 是否是数值型的标识

contentsArrayList.add(titles);
for (Order order : orders) {
String[] content = new String[titles.length];
content[0] = order.getId();
content[1] = order.getOrderName();
content[2] = order.getUpgradeList().get(0).getBarcode();
content[3] = order.getMobile();
content[4] = String.valueOf(order.getTotalMoney());
content[5] = String.valueOf(order.getPayMoney());
content[6] = order.getPayStatus() == Order.PAY_UNPAY ? "未付款" : "已付款";
content[7] = order.getUpgradeStatus() == 1 ? "已处理" : "未处理";
content[8] = order.getCreateDate();
content[9] = order.getUpgradeRemark();
contentsArrayList.add(content);
}
ExcelUtils.writeExcel(ExcelUtils.changeToArray(contentsArrayList), "导出", response, titleNumFlags);
return true;
} catch (Exception e) {
e.printStackTrace();
}
return false;
}

ExcelUtils.class

package com.mofang.util;

import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Calendar;

import javax.servlet.http.HttpServletResponse;

import jxl.Workbook;
import jxl.write.Label;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;

/**
* ExcelUtils 导出excel
*
* @author joe
*
*/
public class ExcelUtils {

/**
* 生成一个Excel文件
*
* @param title 工作表的名称
* @param titles 工作表的内容
*/

public static String writeExcel(String[][] titles, String title,
HttpServletResponse response, Boolean[] titleNumFlags)
throws IOException {
String fileName = title + Calendar.getInstance().getTimeInMillis();
response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setHeader("Content-Disposition", "attachment;filename="
+ new String((fileName + ".xls").getBytes(), "iso-8859-1"));
// 根据传进来的file对象创建可写入的Excel工作薄
OutputStream os = response.getOutputStream();
WritableWorkbook wwb = null;
try {
// 首先要使用Workbook类的工厂方法创建一个可写入的工作薄(Workbook)对象

wwb = Workbook.createWorkbook(os);
} catch (IOException e) {
e.printStackTrace();
}
if (wwb != null) {
// 创建一个可写入的工作表
// Workbook的createSheet方法有两个参数,第一个是工作表的名称,第二个是工作表在工作薄中的位置
WritableSheet ws = wwb.createSheet(title, 1);
jxl.write.NumberFormat nf = new jxl.write.NumberFormat("#0.00"); // 设置数字格式
jxl.write.WritableCellFormat wcfN = new jxl.write.WritableCellFormat(
nf); // 设置表单格式
// 下面开始添加单元格
for (int row = 0; row < titles.length; row++) {
// System.out.println(row);
for (int j = 0; j < titles[row].length; j++) {
if (titleNumFlags[j]) {// 当数值型时先转换成double
try {
double titlesDoubleValue = Double
.parseDouble(titles[row][j]);
ws = writeNumberToWs(ws, wcfN, row, j,
titlesDoubleValue);
} catch (Exception notnum) {
String titlesStringValue = titles[row][j];
// 这里需要注意的是,在Excel中,j表示列,row表示行
ws = writeStringToWs(ws, row, j, titlesStringValue);
}
} else {
String titlesStringValue = titles[row][j];
// 这里需要注意的是,在Excel中,j表示列,row表示行
ws = writeStringToWs(ws, row, j, titlesStringValue);
}
}
}

try {
// 从内存中写入文件中
wwb.write();
// 关闭资源,释放内存
wwb.close();
os.flush();
os.close();
} catch (IOException | WriteException e) {
//e.printStackTrace();
}
}
return fileName;
}

private static WritableSheet writeNumberToWs(WritableSheet ws,
jxl.write.WritableCellFormat wcfN, int row, int j,
double titlesDoubleValue) {
jxl.write.Number labelNF = new jxl.write.Number(j, row,
titlesDoubleValue, wcfN); // 格式化数值
try {
ws.addCell(labelNF);
} catch (WriteException e1) {
e1.printStackTrace();
}
return ws;
}

private static WritableSheet writeStringToWs(WritableSheet ws, int row,
int j, String titlesStringValue) {
Label labelC = new Label(j, row, titlesStringValue);
try {
// 将生成的单元格添加到工作表中
ws.addCell(labelC);
} catch (WriteException e) {
e.printStackTrace();
}
return ws;
}

public static String[][] changeToArray(ArrayList<String[]> contentsArrayList) {
String[][] contents = new String[contentsArrayList.size()][];
for (int i = 0; i < contentsArrayList.size(); i++) {
contents[i] = contentsArrayList.get(i);
}
return contents;
}

}


桌面程序-swing弹出

swing只会在服务器中弹出,多用于 桌面程序-----如果用在web中则 在页面点击时,选择框在服务器弹出。
swing
public static String writeExcel(String[][] titles, String title) {

String fileName = "";
JFileChooser dialog = new JFileChooser();
dialog.setDialogTitle("保存文件");
dialog.setFileSelectionMode(JFileChooser.FILES_ONLY);
FileSystemView fsv = FileSystemView.getFileSystemView();
System.out.println(fsv.getHomeDirectory()); // 得到桌面路径
dialog.setCurrentDirectory(fsv.getHomeDirectory()); // 设置默认保存路径为桌面路径
// dialog.setDialogType(JFileChooser.SAVE_DIALOG);
dialog.setSelectedFile(new File("订单列表"
+ Calendar.getInstance().getTimeInMillis() + ".xls")); // 设置默认文件名
dialog.setFileFilter(new TextFileFilter("*.xls", "文本文档(*.xls)"));
int result = dialog.showSaveDialog(dialog);
if (result == JFileChooser.APPROVE_OPTION) {
File file = dialog.getSelectedFile();
fileName = file.getAbsolutePath(); // 得到文件全名

WritableWorkbook wwb = null;
try {
// 首先要使用Workbook类的工厂方法创建一个可写入的工作薄(Workbook)对象

wwb = Workbook.createWorkbook(new File(fileName));
} catch (IOException e) {
e.printStackTrace();
}
if (wwb != null) {
// 创建一个可写入的工作表
// Workbook的createSheet方法有两个参数,第一个是工作表的名称,第二个是工作表在工作薄中的位置
WritableSheet ws = wwb.createSheet(title, 1);

// 下面开始添加单元格
for (int row = 0; row < titles.length; row++) {
// System.out.println(row);
for (int j = 0; j < titles[row].length; j++) {
// 这里需要注意的是,在Excel中,第一个参数表示列,第二个表示行
Label labelC = new Label(j, row, titles[row][j]);

try {
// 将生成的单元格添加到工作表中
ws.addCell(labelC);
} catch (RowsExceededException e) {
e.printStackTrace();
} catch (WriteException e) {
e.printStackTrace();
}
}
}

try {
// 从内存中写入文件中
wwb.write();
// 关闭资源,释放内存
wwb.close();
} catch (IOException e) {
e.printStackTrace();
} catch (WriteException e) {
e.printStackTrace();
}
}
}
return fileName;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: