2015-06-07 2 views
3

Когда я пытаюсь загрузить файл первенствует (.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) 

контроллера

@RequestMapping(value = "/form", headers = "content-type=multipart/*", method = RequestMethod.POST) 
    public String handleFormUpload(@RequestParam("file") MultipartFile file) throws IOException { 
     try { 
      if (!file.isEmpty()) { 
       Writer.validateOfficeData(file); 
       Writer.saveOfficeContents(file); 
       System.out.println("Upload successful!"); 
      } 
     } catch (MultipartException e) { 
      e.printStackTrace(); 
      System.out.println("Upload failed!"+e); 
     } 
     return "redirect:/"; 
    } 

JSP

<form method="post" action="form.htm" enctype="multipart/form-data"> 
       <input type="file" name="file"/> 
       <input type="submit"/> 
      </form> 

Внутри класса Writer

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"); 
     } 
    } 

Любой предложить мне, если что-то отсутствует, создающее выше исключение?

+1

Вы открываете книгу, используя «новую HSSFWorkbook», но, похоже, файл, который вы пытаетесь открыть, представляет собой файл Office 2007+ (.xlsx), для которого вы должны использовать «новую XSSFWorkbook». Это кажется мне понятным из сообщения об исключении, или есть что-то, что мне не хватает? –

+0

Вы имеете в виду .. Я должен использовать 'новый XSSFWorkbook' вместо' new HSSFWorkbook'. Я прав? »« – Ravi

+0

Да. Вы должны использовать 'новый XSSFWorkbook' для файлов, созданных в Excel 2007 или новее, и' new HSSFWorkbook' для файлов, созданных в Excel 2003 или ранее. –

ответ

2

Как Предложил @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. Кроме того, я включил следующие библиотеки, чтобы сделать его работу

enter image description here

Надеясь это будет спасти чью-то время.

+1

Почему бы не использовать [WorkbookFactory] (http://poi.apache.org/apidocs/org/apache/poi/ss/usermodel/WorkbookFactory.html) вместо этого? Он определяет тип для вас – Gagravarr