excel之文件导出到指定位置,错误方式之JFileChooser分析

之前我需要做一个excel合并行导出的文件,并且需要导出到指定位置

excel合并行文件制作之前已经发过文章了,你们可以去参考前面的

这篇文章我主要聊聊文件导出指定位置

首先我是主要用ajax去请求文件生成存储的路径

$.ajax({
			url:url,
			type:"post",
			data:data,
			dataType:"json",
			headers:{
				'X-CSRF-TOKEN':$csrftoken
			},
			success:function(response){
				if (response.success){
					let dowUrl = $ctx + "/service/rest/tk.File/" + response.fileId + "/download";
					window.open(dowUrl);
				}else {
					alert(response.msg);
				}
			}
		});
		

后台那个文件存储到指定位置,我首先想到的是

 JFileChooser jfc=new JFileChooser();  

具体操作可自行百度
本来我用了JFileChooser选择文件夹,直接获取一个本地路径创建一个输出流

            wb.write(rfile.openOutputStream());

在使用代码下载到本地

本来在本地运行没啥问题,可我将代码提交到线上去,运行就出现了问题,我根据日志出现了以下问题

java.awt.HeadlessException
at java.awt.GraphicsEnvironment.checkHeadless(GraphicsEnvironment.java:204)
at java.awt.Window.<init>(Window.java:536)
at java.awt.Frame.<init>(Frame.java:420)
at java.awt.Frame.<init>(Frame.java:385)
at javax.swing.SwingUtilities$SharedOwnerFrame.<init>(SwingUtilities.java:1758)
at javax.swing.SwingUtilities.getSharedOwnerFrame(SwingUtilities.java:1833)
at javax.swing.JOptionPane.getRootFrame(JOptionPane.java:1696)
at javax.swing.JOptionPane.getWindowForComponent(JOptionPane.java:1637)
at javax.swing.JFileChooser.createDialog(JFileChooser.java:802)
at javax.swing.JFileChooser.showDialog(JFileChooser.java:749)
at javax.swing.JFileChooser.showOpenDialog(JFileChooser.java:656)
at 

我整了接近一个小时,还没有解决,我就觉得JFileChooser这个可能有问题,然后拿出我自己的电脑访问我本地项目去导出,结果就在我自己页面上点导出按钮,文件选择器却出现在公司电脑上。后面我就去查询了一下JFileChooser,发现也有其他同志出现了一样的问题,JFileChooser只能在服务端运用,不能运用到客户端
接下来我就尝试将文件下载到客户端,注释掉了文件选择器

 String fileName="客户端下载.xlsx";
OutputStream output = response.getOutputStream();
 response.reset();
 response.setHeader("Content-disposition", "attachment; filename=" +fileName);
 response.setContentType("*/*");
  response.setCharacterEncoding("utf-8");
output.flush();
wb.write(output);
output.close();

可是执行完这段代码之后,屁都没有放一个,而我也是简单操作下,也不懂这是什么意思,就只能寻求公司大佬帮助了
后来才了解,这个是把我们需要导出的excle文件转化为一个导出流放入response中,交给浏览器去获取流
可是我之前调用这个方法用的是ajax,导致浏览器不能反应,所以就出现了以上情况
后面公司大佬就给我整了下面一段

String fileId = UUID.generateUUID();
/*将流暂时存储到服务器,在根据浏览器去下载*/
     com.homolo.toolkit.filesystem.File rfile = this.storage.createFile(fileId, fileName);
     wb.write(rfile.openOutputStream());
     rfile.setOwner(UserSessionFactory.currentUser().getPersonId());
     rfile.setType("xlsx");
     rfile.setAttribute(Constants.FILE_IS_TEMP_KEY, true);
     rfile.setDateExpired(DateUtils.addDays(new Date(), 2));
     rfile.save();

咱们公司有一个已经封装的,暂存创建一个根据文件名称和文件id的文件,存储到公司的服务器中
然后根据我们公司封装的下载代码

if (response.success){
				let dowUrl = $ctx + "/service/rest/tk.File/" + response.fileId + "/download";
				window.open(dowUrl);
			}else {
				alert(response.msg);
			}

将流再次交给浏览器去操作。

至于公司封装的东西,我就不好给大家介绍了,至于问题就差不多是这样了,嘻嘻,撤了

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值