NutzCN Logo
问答 关于导出excel问题
发布于 2844天前 作者 yong9664 3982 次浏览 复制 上一个帖子 下一个帖子
标签:
/**
	 * 导出
	 */
	@At
	@Ok("raw:json")
	public void export(HttpServletRequest request,HttpServletResponse response)
	{
		OutputStream out = null;
		try 
		{
			out = response.getOutputStream();
                        // 省略
             Workbook workBook = Excel.createWorkbook(Excel.Excel_Type.EXCEL_97_2003);
			Sheet sheet = workBook.createSheet("信息");
             workBook.write(out);
       } catch (Exception e) 
		{
			System.out.println("导出失败.");
			e.printStackTrace();
		}

这是使用poi的导出,正常情况下会弹出浏览器的文件保存的窗口的,但使用nutz后,没弹出,应该用@Ok什么?

16 回复

正常情况下是什么都不会弹.

你的代码里面只往流里面写内容,浏览器弹啥?? 那就期望的效果,不就"正常情况下"

@Ok("void") // 自己写流,就不要让nutz渲染了
public void xxx(resp) {
     // 设置好下载的文件名
    String filename = URLEncoder.encode("xxxx.xls", Encoding.UTF8);
    resp.setHeader("Content-Disposition", "attachment; filename=\"" + filename + "\"");
	
	// 还得设置类型
	resp.setContentType("application/vnd.ms-excel");
	
	// 再任性写流
	// .................
}

@wendal 这些设置都写了。我贴下整体的代码吧,在struts和spring下是正常的,这poi导出的方式我之前常用的

/**
	 * 导出
	 */
	@At
	@Ok("void")
	public void export(HttpServletRequest request,HttpServletResponse response)
	{
		OutputStream out = null;
		try 
		{
			out = response.getOutputStream();
			
			// poi
			response.addHeader("content-type", "application/shlnd.ms-excel;charset=utf-8");
			response.addHeader("content-disposition", "attachment; filename=" + Excel.toUtf8String("住户信息.xls")); 
			Workbook workBook = Excel.createWorkbook(Excel.Excel_Type.EXCEL_97_2003);
			Sheet sheet = workBook.createSheet("信息");
			
			// list…………省略
			Excel.createExcel(workBook, list, sheet, 1);	// 往excel写数据, poi
			
			workBook.write(out);	// 输出
		} 
		catch (Exception e) 
		{
			System.out.println("导出失败.");
			e.printStackTrace();
		}
		finally
		{
			try 
			{
				out.close();
			}
			catch (IOException e) 
			{
				e.printStackTrace();
			}
		}
	}

用你代码改动了写法(因为没有Excel这个类), 用jdk8的try语法改造了一下,不影响语义的情况下.

    @At("/dw/xls")
    @Ok("void")
    public void download_xls(HttpServletResponse resp) throws Exception {
        try (OutputStream out = resp.getOutputStream();
             HSSFWorkbook workbook = new HSSFWorkbook();) {
            // poi
            resp.addHeader("content-type", "application/shlnd.ms-excel;charset=utf-8");
            resp.addHeader("content-disposition", "attachment; filename=abc.xls"); 
            
            Sheet sheet = workbook.createSheet("信息");
            Row row = sheet.createRow(0);
            Cell cell = row.createCell(0);
            //Set value to new value
            cell.setCellValue("wendal.net");
            workbook.write(out);    // 输出
        }
    }

firefox弹窗

untitled1_png

Chrome直接下载, 没法截图

IE10

untitled3_png

@wendal
同样问题,什么原因呢?

Content-Disposition	
attachment; filename="%E4%BF%A1%E6%81%AF123--abc.xls"
Content-Length	
4096
Content-Type	
application/vnd.ms-excel;charset=utf-8
Date	
Sat, 10 Sep 2016 09:10:30 GMT
Server	
Apache-Coyote/1.1
X-Powered-By	
nutz/1.r.57.r3 <nutzam.com>

用的$.post()提交的请求

@qq_a930202f ajax还想弹窗下载?

来自炫酷的 NutzCN

(。≖ˇェˇ≖。)

@wendal excel 导出 使用ajaxa 会有影响么?

文件下载不能用ajax啊

@yong9664

 //查询导出数据
        List<Map> excelData = tIeoOrderService.exportExcel(conditionStr);

这export返回个list那么神奇的

文件下载,一般来说生成个文件就是啦,至于文件内容是什么,那是你业务的事

还是没看懂你们怎么放的数据

     values[i][0] = projects.get(i).get("name").toString();
            values[i][1] = projects.get(i).get("platform_uid").toString();
            values[i][2] = projects.get(i).get("currency").toString();
            values[i][3] = projects.get(i).get("coin_name").toString();
            values[i][4] = projects.get(i).get("price").toString();
            values[i][5] = projects.get(i).get("fee").toString();
            values[i][6] = projects.get(i).get("start_time").toString();
            values[i][7] = projects.get(i).get("end_time").toString();
            values[i][8] = projects.get(i).get("time_length").toString();
            values[i][9] = projects.get(i).get("total_fee").toString();
            values[i][10] = df9.format(projects.get(i).get("buy_fee"));
            values[i][11] = df9.format(projects.get(i).get("surplus_fee"));
            values[i][12] = projects.get(i).get("progress_str").toString();
            values[i][13] = df9.format(projects.get(i).get("max_onecoin"));
            values[i][14] = df9.format(projects.get(i).get("min_onecoin"));
            values[i][15] = projects.get(i).get("number").toString();
            values[i][16] = projects.get(i).get("statusStr").toString();

我现在用的是二维数组放进去 但是 这个代码量太复杂 想换个方式

觉得你的思路有点乱,把问题分解一下吧

添加回复
请先登陆
回到顶部