从数据库导出Excel上线后出现IO异常:设备未就绪之解决方法
最近做项目遇到一个问题,就是利用JavaPOI导出Excel表格时,在自己电脑上的工程上面可以使用,但是项目一上线,这个功能就报错,错误如下:
设备未就绪异常,报错的语句是createNewFile()这个方法出的错,让我一头雾水,这个方法用的好多次从来也没有报过这种错,上网查很多人都说是创建文件的路径有问题,但是我这个很明显不是这个问题,要是路径有问题的话,在我自己电脑里的工程中也会出现这种问题的,所以我猜想,上线之后和上线之前有什么不一样。后来问过同事才知道问题出在那里了,先贴出我出问题时的代码。(用的SSH框架以下是Action中的代码)
public String exportJiuYeByWorkTime() {
HttpServletResponse response=ServletActionContext.getResponse();
response.setCharacterEncoding("utf-8");
List list=excelExportService.exportJiuYeByWorkTime(worktimeStart, worktimeEnd);
boolean b=false;
String fileName="D://"+worktimeStart+"-"+worktimeEnd+"就业表.xlsx";
File file=new File(fileName);
FileOutputStream fout=null;
try{
if(file.exists()) {
file.delete();
}
if(!file.exists()) {
file.createNewFile();
}
//创建一个以fileName为文件名的workbook
XSSFWorkbook workbook=new XSSFWorkbook();
//创建一个名字是传进来的班级名字的表
XSSFSheet sheet = workbook.createSheet(worktimeStart+"-"+worktimeEnd+"就业表");
XSSFRow row = null;
row = sheet.createRow(0);
XSSFCell cell=null;
cell=row.createCell(0);
cell.setCellValue("班级");
cell=row.createCell(1);
cell.setCellValue("姓名");
cell=row.createCell(2);
cell.setCellValue("入职日期");
cell=row.createCell(3);
cell.setCellValue("薪资");
cell=row.createCell(4);
cell.setCellValue("入职企业");
cell=row.createCell(5);
cell.setCellValue("入职岗位");
cell=row.createCell(6);
cell.setCellValue("就业经理");
for (int i = 1; i <= list.size(); i++) {
row=sheet.createRow(i);
cell=row.createCell(0);
cell.setCellValue(((JiuYeInfo)list.get(i-1)).getJibenInfo().getClassname());
cell=row.createCell(1);
cell.setCellValue(((JiuYeInfo)list.get(i-1)).getJibenInfo().getName());
cell=row.createCell(2);
cell.setCellValue(((JiuYeInfo)list.get(i-1)).getWorktime());
cell=row.createCell(3);
cell.setCellValue(((JiuYeInfo)list.get(i-1)).getWorksalary());
cell=row.createCell(4);
cell.setCellValue(((JiuYeInfo)list.get(i-1)).getWorkcompany());
cell=row.createCell(5);
cell.setCellValue(((JiuYeInfo)list.get(i-1)).getWorkpost());
cell=row.createCell(6);
cell.setCellValue(((JiuYeInfo)list.get(i-1)).getWorkpost());
cell=row.createCell(7);
cell.setCellValue(((JiuYeInfo)list.get(i-1)).getEmploManager());
}
fout=new FileOutputStream(file);
workbook.write(fout);
b=true;
}catch(Exception e) {
e.printStackTrace();
}finally {
try {
fout.flush();
fout.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(b) {
try {
PrintWriter out = response.getWriter();
out.write("Excel导出成功");
} catch (IOException e) {
e.printStackTrace();
}
}else {
try {
PrintWriter out = response.getWriter();
out.write("Excel导出失败");
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
这段代码看似没有问题,实际上在本地的工程中它也是没有问题的,但是一上线就会出错,因为我在这段代码上直接就在本地D盘创建了一个文件,然后就想把数据传化的Excel表存到本地,这是不可能的。
String fileName="D://"+worktimeStart+"-"+worktimeEnd+"就业表.xlsx";
当执行这句话时会在上线的项目会在服务器的D盘中创建一个文件,然后数据也始终都是在服务器端,整个导出的过程都是在服务器端完成,说实话和客户端完全没关系。那为什么Excel表中数据上传到数据库中则可以呢?
那是因为你利用input的file标签读取数据然后他会有一个请求的过程,所以数据会随着请求到达服务器端,而数据库也在服务器端,所以可以进行,当导出时没有一个响应的过程,数据一直存在于服务端,所以不会出现像导入那样顺利。
那么如何解决呢?
很简单只要多加一步将从数据库中的数据以下载的方式下载到本地就可以了。
改完之后的代码是:
public InputStream getJiuYeByWorkTime() {
List list=excelExportService.exportJiuYeByWorkTime(worktimeStart, worktimeEnd);
XSSFWorkbook workbook=new XSSFWorkbook();
//创建一个名字是传进来的班级名字的表
XSSFSheet sheet = workbook.createSheet(worktimeStart+"-"+worktimeEnd+"就业表");
XSSFRow row = null;
row = sheet.createRow(0);
XSSFCell cell=null;
cell=row.createCell(0);
cell.setCellValue("班级");
cell=row.createCell(1);
cell.setCellValue("姓名");
cell=row.createCell(2);
cell.setCellValue("入职日期");
cell=row.createCell(3);
cell.setCellValue("薪资");
cell=row.createCell(4);
cell.setCellValue("入职企业");
cell=row.createCell(5);
cell.setCellValue("入职岗位");
cell=row.createCell(6);
cell.setCellValue("就业经理");
for (int i = 1; i <= list.size(); i++) {
row=sheet.createRow(i);
cell=row.createCell(0);
cell.setCellValue(((JiuYeInfo)list.get(i-1)).getJibenInfo().getClassname());
cell=row.createCell(1);
cell.setCellValue(((JiuYeInfo)list.get(i-1)).getJibenInfo().getName());
cell=row.createCell(2);
cell.setCellValue(((JiuYeInfo)list.get(i-1)).getWorktime());
cell=row.createCell(3);
cell.setCellValue(((JiuYeInfo)list.get(i-1)).getWorksalary());
cell=row.createCell(4);
cell.setCellValue(((JiuYeInfo)list.get(i-1)).getWorkcompany());
cell=row.createCell(5);
cell.setCellValue(((JiuYeInfo)list.get(i-1)).getWorkpost());
cell=row.createCell(6);
cell.setCellValue(((JiuYeInfo)list.get(i-1)).getWorkpost());
cell=row.createCell(7);
cell.setCellValue(((JiuYeInfo)list.get(i-1)).getEmploManager());
}
ByteArrayOutputStream baos = new ByteArrayOutputStream();
try {
workbook.write(baos);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
byte[] ba = baos.toByteArray();
ByteArrayInputStream bais = new ByteArrayInputStream(ba);
return bais;
}
以上是Action中的代码,因为使用的是Struts2,所以下载是用配置文件形式进行的,在Action中只需要提供一个输入流(含要传输的数据的流)即可剩下的就是在struts.xml文件中进行。
struts.xml文件中的写法是:
<action name="exportJiuYeByWorkTime" class="excelExportAction" ><!-- method="exportJiuYeByClassName" -->
<result name="success" type="stream">
<param name="contentType">application/vnd.openxmlformats-officedocument.spreadsheetml.sheet</param>
<param name="inputName">jiuYeByWorkTime</param><!-- 表示一个流 必须是一个输入流Action中的流-->
<param name="contentDisposition">attachment;filename="jiuYeByWorkTimePeople.xlsx"</param><!-- 弹出的对话框,以及 文件名自定义的名字-->
<param name="bufferSize">4096</param><!--byte数组的大小(其实这个配置文件就是封装了一个流的上传下载的代码)-->
</result>
</action>
这样的话就将直接在本地创建文件,转换成以下载的形式获得文件。
从数据库导出Excel上线后出现IO异常:设备未就绪之解决方法相关推荐
- java设备未就绪_java.io.IOException: 设备未就绪
java.io.IOException: 设备未就绪. at java.io.WinNTFileSystem.canonicalize0(Native Method) at java.io.Win32 ...
- java设备未就绪_java.io.IOException: 设备未就绪。怎么解决?
2014-4-15 10:32:38 org.apache.catalina.startup.ContextConfig init 严重: Exception fixing docBase for c ...
- java设备未就绪_java.io.IOException: 设备未就绪。这个怎么解决?
严重:ExceptionfixingdocBaseforcontext[/OA2013]java.io.IOException:设备未就绪.atjava.io.WinNTFileSystem.cano ...
- java.io.ioexception 设备未就绪_AxisFault faultString: java.io.IOException: 设备未就绪。
最近工作中使用Axis时,遇到一个问题: 主要异常如下: Caused by: java.io.IOException: 设备未就绪. at java.io.WinNTFileSystem.creat ...
- java.io.IOException: 设备未就绪
java.io.IOException: 设备未就绪.at java.io.WinNTFileSystem.canonicalize0(Native Method)at java.io.Win32Fi ...
- 报错:Exception in thread “main“ java.io.IOException: 设备未就绪。
今天用File创建文件,但是一直报错,报错提示设备未就绪,很纳闷 Exception in thread "main" java.io.IOException: 设备未就绪.at ...
- java导出excel 【POI 3.17】POI 版本不匹配解决方法
目录 1.Maven依赖 2.ExcelUtil工具类代码 3.Test测试 4.遇到的问题 公司要写导出Excel的功能,就写了一下,顺便记录记录,代码从这里copy来的,自己改了一下.源码应该是3 ...
- 腾讯文档导出Excel文档显示‘文件已损坏,无法打开‘解决方法
转载请标明出处:https://blog.csdn.net/cms18374672699/article/details/112276613 本文出自DistressRroke _chen的博客 相信 ...
- SAPABAP金色传说:关于导入和导出Excel时反复弹窗提示 SAP GUI安全性问题的解决方法
文章目录 前言 一.提示的到底是什么? 二.关闭SAP GUI安全提示的步骤 1.设置位置 前言 如果你在SAP中,经常需要将数据导出Excel,或者使用Excel进行批导数据,那么你对下面这个频繁出 ...
最新文章
- 安卓上的微软 Edge 浏览器新增支持长截图
- 云信迎来五周年里程碑:日活破3亿,消息量破10000亿
- DB2数据库报 [SQL0805N Package NULLID.SQLLD003 was not found.]
- pdf 中的java运行,java - 从pdf文件读取特定位置的itext在intellij中运行,并提供所需的输出,但是可执行jar抛出错误 - 堆栈内存溢出...
- Python 如何创建多维的list
- Spring 基于注解的配置
- Flask-SQLAlchemy 中如何不区分大小写查询?
- 多线程新浪新闻搜索网络爬虫-基于关键字
- java 树最大距离_寻找二叉树最远的叶子结点(实例讲解)
- 基于VUE2.0的分页插件
- jQuery - animate(滑块滑动)
- must be str,not int
- CSDN的markdown编辑器详细使用说明、语法快速索引手册
- 最新台式计算机CPU,三月台式电脑CPU性能排行榜, 2019年3月最新版CPU天梯图
- centos7下解压rar文件
- linux中man命令的基本用法,linux中的man命令的详细解释
- QNAP领衔进击2014vNAS內置虚拟机横空出世
- 电脑显示没有被指定在上运行_win7运行QQ时出现“.dll没有被指定在Windows上运行,或者它包含错误”如何解决...
- PPT转换为视频_ppt2dvd-pro
- SQL零基础入门学习(九)