打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
java导出文件弹出下载框让用户选择路径
实现导出文件时 弹出下载框 主要是 设置成 文件流  stream 类型的response. 浏览器就会识别出 文件下载弹出 下载框。
这里总结三个方式
web-sturts框架中弹出
详见
java通过struts实现web中的文件下载
其中关键的设置是
[java] view plain copy
<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中设置头
[java] view plain copy
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
[javascript] view plain copy
$(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,返回文件流
[java] view plain copy
@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;
}
[java] view plain copy
@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;
}
[java] view plain copy
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的话则会冲突报错。
桌面程序-swing弹出
swing只会在服务器中弹出,多用于 桌面程序-----如果用在web中则 在页面点击时,选择框在服务器弹出。
swing
[java] view plain copy
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;
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
静态页面导出excel
Java Excel 使用攻略
利用RequestDispatcher实现文件下载,支持下载工具
C# 将数据导出到Excel汇总
使用HttpClient实现文件的上传下载
Java 下载支持断点续传
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服