Avatar billede mik28 Seniormester
31. december 2008 - 19:19 Der er 23 kommentarer og
1 løsning

læse fra en Excel fil

Hej Eksperter,

Jeg forsøger at læse fra en excel fil ved hjælp af http://poi.apache.org/ Hvad er der galt med nedenstående. Jeg kan sige at filen ikke bliver fundet og jeg får denne fejl

cannot find symbol variable myxls


/**
* @(#)Testexcel.java
*
*
* @author
* @version 1.00 2008/12/30
*/
import java.io.*;
import org.apache.poi.hssf.usermodel.*;

public class Testexcel {

    public Testexcel() {
       
        InputStream myxls=null;
       
        try{
            myxls = new FileInputStream("C:\testexcel\test.xls");
        }
        catch(Exception e){
            System.out.println("workbook ikke fundet");
        }   
    }
   
    public void laesExcel(){
       
        HSSFWorkbook wb    = new HSSFWorkbook(myxls);   
       
        HSSFSheet sheet = wb.getSheetAt(0);      // first sheet
        HSSFRow row    = sheet.getRow(2);        // third row
        HSSFCell cell  = row.getCell((short)3);  // fourth cell
    }
   
}
Avatar billede mik28 Seniormester
31. december 2008 - 19:22 #1
Jeg har kigget på denne eksemple http://www.onjava.com/pub/a/onjava/2003/04/16/poi_excel.html men er også meget interesseret i andre :-)
Avatar billede mik28 Seniormester
31. december 2008 - 19:22 #2
dette
Avatar billede arne_v Ekspert
31. december 2008 - 19:31 #3
myxls er en lokal variabel i constructor og kan derfor ikke bruges i laesExcel metoden.
Avatar billede arne_v Ekspert
31. december 2008 - 19:32 #4
Eller ligner koden noget jeg har på lageret:

import java.io.*;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.poifs.filesystem.*;

public class ReadPOI {
  public static void main(String[] args) throws Exception {
      POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("C:\\jtest.xls"));
      HSSFWorkbook wb = new HSSFWorkbook(fs);
      HSSFSheet sheet = wb.getSheetAt(0);
      int rownum = 1;
      for (;;) {
        HSSFRow row = sheet.getRow(rownum);
        if(row==null) break;
        HSSFCell ivcell = row.getCell((short)0);
        int iv = (int)ivcell.getNumericCellValue();
        HSSFCell svcell = row.getCell((short)1);
        String sv = svcell.getStringCellValue();
        System.out.println(iv + " " + sv);
        rownum++;
      }
  }
}
Avatar billede mik28 Seniormester
01. januar 2009 - 11:21 #5
Hmmmm. Hvordan skal min constructor så se ud, hvis jeg overhovedet skal have den? Det jeg i første opgang vil opnå er en klasse med en metode som kan modtage et argument (navnet på excel arket). Andet trin er så at få lagt resultatet i en database, men den tid den glæde.
Avatar billede mik28 Seniormester
01. januar 2009 - 11:28 #6
Godt nytår iøvrigt :-)
Avatar billede mik28 Seniormester
01. januar 2009 - 11:39 #7
Jeg får denne fejl når jeg forsøger at køre din kode

Exception in thread "main" java.lang.IllegalStateException: Cannot get a numeric value from a text cell
Avatar billede mik28 Seniormester
01. januar 2009 - 11:42 #8
hvis det er en tekst og

Exception in thread "main" java.lang.IllegalStateException: Cannot get a text value from a numeric cell

hvis det er et tal
Avatar billede mik28 Seniormester
01. januar 2009 - 13:25 #9
Det her er hvad jeg er kommet frem til. Der er dog en del problemer ved det.

1. Jeg ved ikke hvordan jeg skal finde ud af hvor mange colonner der er data i altså hvad i skal være

2. Hvis en celle er tom crasher det hele

import java.io.*;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.poifs.filesystem.*;

public class ReadPOI {
  public static void main(String[] args) throws Exception {
      POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("C:\\testexcel\\test.xls"));
      HSSFWorkbook wb = new HSSFWorkbook(fs);
      HSSFSheet sheet = wb.getSheetAt(0);
      System.out.println("Antal rækker er: "+sheet.getLastRowNum());
      int rownum = 0;
          for (;;) {
           
            for(int i=0;i<3;i++){
            HSSFRow row = sheet.getRow(rownum);
            if(row==null) break;
            HSSFCell ivcell = row.getCell((short)i);
            System.out.println("Typen er: "+ivcell.getCellType());
            System.out.println(i);
           
            if(ivcell.getCellType()==0){
            int int_data = (int)ivcell.getNumericCellValue();
            System.out.println(int_data);
            }
            else{
            String str_data = ivcell.getStringCellValue();
            System.out.println(str_data);
            }
          } 
          rownum++;
      }
  }
}
Avatar billede mik28 Seniormester
01. januar 2009 - 14:37 #10
Nu er jeg kommet frem til det her. Ergo crasher det ikke hvis en celle er tom. Nu skal jeg bare finde ud af hvor mange colonner der er, med data i? Det er vist lidt tricky, for hvad vil det egentlig sige. Det må vel blive for mange collonner der er i den første række (overskrifter) som indeholder data


import java.io.*;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.poifs.filesystem.*;

public class ReadPOI {
  public static void main(String[] args) throws Exception {
      POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("C:\\testexcel\\test.xls"));
      HSSFWorkbook wb = new HSSFWorkbook(fs);
      HSSFSheet sheet = wb.getSheetAt(0);
      int antalraekker= sheet.getLastRowNum()+1;
      System.out.println("Antal rækker er: "+antalraekker);
         
          for (int r=0;r<=sheet.getLastRowNum();r++) { 
            for(int i=0;i<3;i++){
            HSSFRow row = sheet.getRow(r);
            HSSFCell celldata = row.getCell((short)i);
           
            if(celldata!=null){
             
                  // Hvilken type har cellen?
                if(celldata.getCellType()==0){
                int int_data = (int)celldata.getNumericCellValue();
                System.out.println("Typen er tal");
                System.out.println(int_data);
                }
                else if(celldata.getCellType()==1) {
                String str_data = celldata.getStringCellValue();
                System.out.println("Typen er string");
                System.out.println(str_data);
                }
              }
              else{
                  System.out.println("Tom celle");
              }
          } 
      }
  }
}
Avatar billede mik28 Seniormester
01. januar 2009 - 15:34 #12
Okay, så gør jeg således

HSSFRow rowtitle = sheet.getRow(0);
short lastcell = rowtitle.getLastCellNum();

og bruger den i min for løkke. Tak for hjælpen :-)
Avatar billede mik28 Seniormester
01. januar 2009 - 15:45 #13
Nu virker det næsten. Hvis jeg har en række som er helt tom crasher det
Avatar billede arne_v Ekspert
01. januar 2009 - 16:41 #14
hvilken exception på hvilken linie
Avatar billede mik28 Seniormester
01. januar 2009 - 16:44 #15
Exception in thread "main" java.lang.NullPointerException
    at ReadPOI.main(ReadPOI.java:20)
Avatar billede mik28 Seniormester
01. januar 2009 - 16:46 #16
import java.io.*;

import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.poifs.filesystem.*;

public class ReadPOI {
  public static void main(String[] args) throws Exception {
      POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("C:\\testexcel\\test.xls"));
      HSSFWorkbook wb = new HSSFWorkbook(fs);
      HSSFSheet sheet = wb.getSheetAt(0);
     
      //Hvor mange overskrifter er der?
      HSSFRow rowtitle = sheet.getRow(0);
      short lastcell = rowtitle.getLastCellNum();
      System.out.println(lastcell);
     
          for (int r=0;r<=sheet.getLastRowNum();r++) { 
            for(int i=0;i<lastcell;i++){
            HSSFRow row = sheet.getRow(r);
            HSSFCell celldata = row.getCell((short)i);
                       
            if(celldata!=null){
             
                  // Hvilken type har cellen?
                if(celldata.getCellType()==0){
                int int_data = (int)celldata.getNumericCellValue();
                System.out.println("Typen er tal");
                System.out.println(int_data);
                }
                else if(celldata.getCellType()==1) {
                String str_data = celldata.getStringCellValue();
                System.out.println("Typen er string");
                System.out.println(str_data);
                }
              }
              else{
                  System.out.println("Tom celle");
              }
          } 
      }
  }
}
Avatar billede mik28 Seniormester
01. januar 2009 - 16:58 #17
Hvorfor er det her forkert

import java.io.*;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.poifs.filesystem.*;

public class Testexcel {

    public void laesExcel(String excelfil){
       
      POIFSFileSystem fs = new POIFSFileSystem(new FileInputStream("C:\\testexcel\\test.xls"));
      HSSFWorkbook wb = new HSSFWorkbook(fs);
      HSSFSheet sheet = wb.getSheetAt(0);
     
      //Hvor mange overskrifter er der?
      HSSFRow rowtitle = sheet.getRow(0);
      short lastcell = rowtitle.getLastCellNum();
      System.out.println(lastcell);
     
          for (int r=0;r<=sheet.getLastRowNum();r++) { 
            for(int i=0;i<lastcell;i++){
            HSSFRow row = sheet.getRow(r);
            HSSFCell celldata = row.getCell((short)i);
                       
            if(celldata!=null){
             
                  // Hvilken type har cellen?
                if(celldata.getCellType()==0){
                int int_data = (int)celldata.getNumericCellValue();
                System.out.println("Typen er tal");
                System.out.println(int_data);
                }
                else if(celldata.getCellType()==1) {
                String str_data = celldata.getStringCellValue();
                System.out.println("Typen er string");
                System.out.println(str_data);
                }
              }
              else{
                  System.out.println("Tom celle");
              }
          } 
      }
    }
   
}
Avatar billede mik28 Seniormester
01. januar 2009 - 16:59 #18
unreported exception java.io.FileNotFoundException; must be caught or declared to be thrown
Avatar billede arne_v Ekspert
01. januar 2009 - 17:05 #19
row er vel null - det skal der testes for
Avatar billede arne_v Ekspert
01. januar 2009 - 17:06 #20
FileNotFoundException skal enten catches eller erklæres i metode signatur
Avatar billede mik28 Seniormester
01. januar 2009 - 17:11 #21
Burde det her ikke klare det? Det giver dog den samme fejl

for (int r=0;r<=sheet.getLastRowNum();r++) { 
            for(int i=0;i<lastcell;i++){
            HSSFRow row = sheet.getRow(r);
            HSSFCell celldata = row.getCell((short)i);
            if(row!=null){           
                    if(celldata!=null){
                     
                          // Hvilken type har cellen?
                        if(celldata.getCellType()==0){
                        int int_data = (int)celldata.getNumericCellValue();
                        System.out.println("Typen er tal");
                        System.out.println(int_data);
                        }
                        else if(celldata.getCellType()==1) {
                        String str_data = celldata.getStringCellValue();
                        System.out.println("Typen er string");
                        System.out.println(str_data);
                        }
                      }
                      else{
                          System.out.println("Tom celle");
                      }
            }
          } 
      }
Avatar billede mik28 Seniormester
01. januar 2009 - 17:17 #22
Nu er hvis bare for dum. Ved det godt :-(

for (int r=0;r<=sheet.getLastRowNum();r++) {
            for(int i=0;i<lastcell;i++){
            HSSFRow row = sheet.getRow(r);
if(row!=null){           
HSSFCell celldata = row.getCell((short)i);
                     
                    if(celldata!=null){
                   
                          // Hvilken type har cellen?
                        if(celldata.getCellType()==0){
                        int int_data = (int)celldata.getNumericCellValue();
                        System.out.println("Typen er tal");
                        System.out.println(int_data);
                        }
                        else if(celldata.getCellType()==1) {
                        String str_data = celldata.getStringCellValue();
                        System.out.println("Typen er string");
                        System.out.println(str_data);
                        }
                      }
                      else{
                          System.out.println("Tom celle");
                      }
            }
          }
      }
Avatar billede mik28 Seniormester
01. januar 2009 - 17:18 #23
Tak for al hjælpen. Læg endelig et svar
Avatar billede arne_v Ekspert
01. januar 2009 - 17:25 #24
svar
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