Avatar billede Slettet bruger
26. oktober 2004 - 22:52 Der er 16 kommentarer og
1 løsning

Problemmer med Apache POI

Jeg forsøger at hente data fra et Excel regneark som bliver uploadet til min webserver. Upload foregår helt fint og jeg er ret sikker på at path oxo er korrekt, men jeg får denne exception når jeg forsøger at læse Excel regnearket ind i POI.
Problemmet er at det virker hvis jeg hardcoder path ind i metoden.
Den path som jeg tager med er:
"path= "C:\\Tomcat\\webapps\\Isaksen\\admin\\update\\0.9022633606827756_pris.xls" (det sjove filnavn er pga. overskrivning i min fil-upload)

Hvis jeg går ind i en dos-prompt er min fulde sti:
"C:\Tomcat\webapps\Isaksen\admin\update"
i det bib ligger filen:
"0.9022633606827756_pris.xls"


(min klasse står under exceptionen)

java.io.IOException: Unable to read entire block; 2 bytes read; expected 512 bytes
    at org.apache.poi.poifs.storage.RawDataBlock.<init>(RawDataBlock.java:62)
    at org.apache.poi.poifs.storage.RawDataBlockList.<init>(RawDataBlockList.java:51)
    at org.apache.poi.poifs.filesystem.POIFSFileSystem.<init>(POIFSFileSystem.java:86)
    at maxicom.isaksen.bl.Producent.getName(Producent.java:28)
    at org.apache.jsp.admin.UpdatePrice_jsp._jspService(UpdatePrice_jsp.java:67)
    at org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:94)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:324)
    at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
    at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:802)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:237)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:157)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:214)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.StandardContextValve.invokeInternal(StandardContextValve.java:198)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:152)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:137)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:102)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
    at org.apache.catalina.core.StandardValveContext.invokeNext(StandardValveContext.java:104)
    at org.apache.catalina.core.StandardPipeline.invoke(StandardPipeline.java:520)
    at org.apache.catalina.core.ContainerBase.invoke(ContainerBase.java:929)
    at org.apache.coyote.tomcat5.CoyoteAdapter.service(CoyoteAdapter.java:160)
    at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:799)
    at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.processConnection(Http11Protocol.java:705)
    at org.apache.tomcat.util.net.TcpWorkerThread.runIt(PoolTcpEndpoint.java:577)
    at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:683)
    at java.lang.Thread.run(Thread.java:534)

-----------------------------------------------------------------

public class Producent {

    public static ArrayList getName(String path){
        ArrayList aArray = new ArrayList();
   
        try{
            POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream(path));
            HSSFWorkbook wb = new HSSFWorkbook(fs);
            int noOfSheet = wb.getNumberOfSheets();
            System.out.println("Antal ark: "+noOfSheet);
            HSSFSheet sheet = wb.getSheetAt(0);
            int rownum = 1;
            for (;;) {
              HSSFRow row = sheet.getRow(rownum);
              if(row==null) break;
              HSSFCell ivcell = row.getCell((short)0);
              String iv = (String)ivcell.getStringCellValue();
              HSSFCell svcell = row.getCell((short)1);
              String sv = svcell.getStringCellValue();
              System.out.println(iv + " " + sv);
              rownum++;
            }

        }catch (IOException e){
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
       
       
        return aArray;
    }
}
Avatar billede arne_v Ekspert
26. oktober 2004 - 22:55 #1
Har filen samme størrelse efter upload som før ?
Avatar billede Slettet bruger
26. oktober 2004 - 23:00 #2
Filen var på 354.816 og er nu på 354.818 :-(
Hvad kan jeg gøre ved det ?
Avatar billede arne_v Ekspert
26. oktober 2004 - 23:04 #3
354818-354816 = 2

"2 bytes read"

vi er på sporet !

Hvordan uploader du ?
Avatar billede Slettet bruger
26. oktober 2004 - 23:06 #4
Jeg bruger jspupload (http://jspupload.sourceforge.net/)
Avatar billede arne_v Ekspert
26. oktober 2004 - 23:08 #5
Version 0.2 ...

Er der mulighed for at angive binær/text fil ? (XLS er naturligvis binær)
Avatar billede arne_v Ekspert
26. oktober 2004 - 23:09 #6
Jeg har kun brugt Apache og COS upload pakkerne.
Avatar billede Slettet bruger
26. oktober 2004 - 23:13 #7
Nope, desværre ikke - jeg bruger den normalt kun til upload af billeder og der virker den helt som den skal
Avatar billede Slettet bruger
26. oktober 2004 - 23:13 #8
Du kunne måske give et eks. på upload med Apache ??
Avatar billede arne_v Ekspert
26. oktober 2004 - 23:16 #9
Sagtens.

uploadform.jsp (kunne lige så godt være .html):

<form action="uploaddo.jsp" enctype="multipart/form-data" method="post">
Fil 1: <input type="file" name="fil1"/><br/>
Fil 2: <input type="file" name="fil2"/><br/>
Fil 3: <input type="file" name="fil3"/><br/>
<input type="submit" value="Submit"/>
</form>

uploaddo.jsp:

<%@page import="org.apache.commons.fileupload.*,java.util.*,java.io.*"%>
<%
DiskFileUpload upload = new DiskFileUpload();
List files = upload.parseRequest(request);
for(int i = 0; i < files.size(); i++) {
  FileItem file = (FileItem)files.get(i);
  if(file.getSize() > 0) {
      String filename = "C:\\" + file.getFieldName() + ".upl";
      file.write(new File(filename));
  }
}
%>
Avatar billede Slettet bruger
26. oktober 2004 - 23:20 #10
så mangler jeg bare lige et par jar filer :-)
Avatar billede arne_v Ekspert
26. oktober 2004 - 23:22 #11
Avatar billede Slettet bruger
26. oktober 2004 - 23:23 #12
Det gør ikke noget har lige fundet dem
Avatar billede Slettet bruger
26. oktober 2004 - 23:38 #14
Jeg må vente til i morgen med at teste det. Lidt ærgerligt at jspupload ikke virker som den skal. Den er sgu så nemt at bruge :-)
Avatar billede Slettet bruger
27. oktober 2004 - 22:50 #15
Jeg har selv fundet en løsning. Jeg brugte Java Excel API i stedet for Apache POI, det kunne sagtens læse excel filen selvom der var 2 bytes til forskel
Avatar billede arne_v Ekspert
27. oktober 2004 - 22:55 #16
Hvad er Java Excel API ?
Avatar billede Slettet bruger
27. oktober 2004 - 23:01 #17
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester