Java 无法使用spring+;上载excel文件;阿帕奇poi
当我尝试上载excel文件(Java 无法使用spring+;上载excel文件;阿帕奇poi,java,excel,spring,apache-poi,Java,Excel,Spring,Apache Poi,当我尝试上载excel文件(.xls/.xlsx)时,出现以下异常: org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different pa
.xls
/.xlsx
)时,出现以下异常:
org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF)
at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:133)
at org.apache.poi.poifs.storage.HeaderBlock.<init>(HeaderBlock.java:106)
at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:137)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:382)
at org.apache.poi.hssf.usermodel.HSSFWorkbook.<init>(HSSFWorkbook.java:364)
at com.model.Writer.saveOfficeContents(Writer.java:52)
at com.controller.UploadControl.handleFormUpload(UploadControl.java:58)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:214)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:690)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:644)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1085)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1556)
The supplied data appears to be in the Office 2007+ XML. You are calling the part of POI that deals with OLE2 Office Documents. You need to call a different part of POI to process this data (eg XSSF instead of HSSF) null
Upload failed!org.springframework.web.multipart.MultipartException: Constraints Violated
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1513)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
org.springframework.web.multipart.MultipartException: Constraints Violated
at com.model.Writer.saveOfficeContents(Writer.java:85)
at com.controller.UploadControl.handleFormUpload(UploadControl.java:58)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:483)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:214)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:132)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:104)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:749)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:690)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:83)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:945)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:876)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:961)
at org.springframework.web.servlet.FrameworkServlet.doPost(FrameworkServlet.java:863)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:644)
at org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:837)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:725)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:291)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.netbeans.modules.web.monitor.server.MonitorFilter.doFilter(MonitorFilter.java:393)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:239)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:219)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:106)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:501)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:142)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:79)
at org.apache.catalina.valves.AbstractAccessLogValve.invoke(AbstractAccessLogValve.java:610)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:88)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:537)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1085)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:658)
at org.apache.coyote.http11.Http11NioProtocol$Http11ConnectionHandler.process(Http11NioProtocol.java:222)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.doRun(NioEndpoint.java:1556)
at org.apache.tomcat.util.net.NioEndpoint$SocketProcessor.run(NioEndpoint.java:1513)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
at org.apache.tomcat.util.threads.TaskThread$WrappingRunnable.run(TaskThread.java:61)
at java.lang.Thread.run(Thread.java:745)
jsp
<form method="post" action="form.htm" enctype="multipart/form-data">
<input type="file" name="file"/>
<input type="submit"/>
</form>
内部编写器类
public static void saveOfficeContents(MultipartFile file) throws IOException {
try {
Workbook offices = new HSSFWorkbook(file.getInputStream());
System.out.println("Sheet Index :"+offices.getSheetIndex("Sheet1"));
Sheet worksheet = offices.getSheetAt(0);
Row entry;
Integer noOfEntries = 1;
//getLastRowNum and getPhysicalNumberOfRows showing false values sometimes.
while (worksheet.getRow(noOfEntries) != null) {
noOfEntries++;
}
System.out.println(noOfEntries.toString());
for (int rowIndex = 1; rowIndex < noOfEntries; rowIndex++) {
entry = worksheet.getRow(rowIndex);
//Integer externalId=((Double)entry.getCell(0).getNumericCellValue()).intValue();
// Office parent=officeBo.getOfficeByName(entry.getCell(1).getStringCellValue());
//Long parentId=parent.getId();
String name = entry.getCell(0).getStringCellValue();
Date openingDate = entry.getCell(1).getDateCellValue();
// Date date = new SimpleDateFormat("MM/dd/yyyy", Locale.ENGLISH).parse(openingDate);
System.out.println("Row Contents:" + name + " " + openingDate);
// Office office=new Office();
// office.setParentId((long)parentId);
// office.setExternalId((long)externalId);
// office.setName(name);
// office.setOpeningDate(openingDate);
// String parentHierarchy=parent.getHierarchy();
// //Pre save to generate id for use in hierarchy
// officeBo.save(office);
// office.setHierarchy(parentHierarchy+office.getId()+".");
// officeBo.save(office);
}
} catch (Exception e) {
e.printStackTrace();
System.out.println(e.getMessage() + " " + e.getCause());
throw new MultipartException("Constraints Violated");
}
}
public static void saveOfficeContents(MultipartFile)引发IOException{
试一试{
工作簿办公室=新的HSSF工作簿(文件.getInputStream());
System.out.println(“图纸索引:+offices.getSheetIndex(“图纸1”);
工作表=办公室。getSheetAt(0);
行输入;
整数=1;
//getLastRowNum和getPhysicalNumberOfRows有时显示假值。
while(worksheet.getRow(noOfEntries)!=null){
noOfEntries++;
}
System.out.println(noOfEntries.toString());
对于(int-rowIndex=1;rowIndex
有人建议我,如果缺少导致上述异常的任何内容吗?正如@Luke所建议的,我对代码进行了以下更改,以适应excel文件的版本
xls
和xlsx
Workbook offices;
String lowerCaseFileName = file.getOriginalFilename().toLowerCase();
if (lowerCaseFileName.endsWith(".xlsx")) {
offices = new XSSFWorkbook(file.getInputStream());
} else {
offices = new HSSFWorkbook(file.getInputStream());
}
因为,我正在验证上述代码之前的文件类型。因此,只有两种情况,即.xls
或.xlsx
。
此外,我还包括了以下库以使其工作
希望这能节省一些人的时间。您正在使用
新的HSSFWorkbook
打开一个工作簿,但您试图打开的文件似乎是Office 2007+(.xlsx)文件,您应该使用新的XSSFWorkbook
。从异常消息中我似乎很清楚,还是我遗漏了什么?你是说。。我应该使用new XSSFWorkbook
而不是new HSSF工作簿
。“我说得对吗?”“是的。对于在Excel 2007或更高版本中创建的文件,您应该使用new XSSFWorkbook
;对于在Excel 2003或更早版本中创建的文件,您应该使用new HSSF Workbook
。@Ravi,您保存了我的一天。我面临着另一个问题,在我的例子中,我缺少headers=“content type=multipart/*”@Raghu您也需要对答案进行投票:),这样其他人也会受益。为什么不改用它呢?它为您检测类型
Workbook offices;
String lowerCaseFileName = file.getOriginalFilename().toLowerCase();
if (lowerCaseFileName.endsWith(".xlsx")) {
offices = new XSSFWorkbook(file.getInputStream());
} else {
offices = new HSSFWorkbook(file.getInputStream());
}