.xls in Java lesen und als.txt umwandeln

Hallo, Jungs
ich habe immer noch keine Lösung für mein Problem.

1.Ich habe dieses Package in mein java projekt kopiert:
poi-2.5.1-final-20040804.jar.

Mein .xls Datei
g1 20 30 40
g2 5 4 2
g3 0.2 0.3 1

erstmal es könnte nur folgendes lesen:
g1 20
g2 5
g3 0.2

Dann nicht mehr und es kommt dieser Fehler:

java.io.IOException: Unable to read entire header; 35 bytes read; expected 512 bytes
at org.apache.poi.poifs.storage.HeaderBlockReader.(HeaderBlockReader.java:78)
at org.apache.poi.poifs.filesystem.POIFSFileSystem.(POIFSFileSystem.java:83)
at de.fhw.bi.sag.gui.readExcel.main(readExcel.java:87)

Mein Code ist:

import java.io.FileInputStream;
import java.text.DecimalFormat;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import java.io.FileInputStream;
import java.io.FileOutputStream;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

import org.apache.poi.*;

public class readExcel
{
private static String filename = „D:\sales.xls“;

public static void main(String[] args)
{
try
{

// open the Excel Spreadsheet
POIFSFileSystem fs =
new POIFSFileSystem(new FileInputStream(filename));
HSSFWorkbook hssfworkbook = new HSSFWorkbook(fs);

// grab the first sheet
HSSFSheet sheet = hssfworkbook.getSheetAt(0);

// define objects for housing spreadsheet data
HSSFCell currentStateCell = null;
HSSFCell currentSalesCell = null;
HSSFRow currentRow = sheet.getRow(0);

int rowCount = 0;

// cycle through rows and display cell values
while (currentRow!=null)
{
currentRow = sheet.getRow(rowCount++);
if (currentRow!=null)
{
currentStateCell = currentRow.getCell((short)0);
currentSalesCell = currentRow.getCell((short)1);
}
else break;
//DecimalFormat dc = new DecimalFormat("$###,###.##");
System.out.print(currentStateCell.getStringCellValue() + " - ");
//System.out.println(dc.format(currentSalesCell.getNumericCellValue()));
System.out.println(currentSalesCell.getNumericCellValue());

}

}
catch (Exception e)
{
e.printStackTrace();
}

}
}

Danke für Ihre Hilfe

Mein .xls Datei
g1 20 30 40
g2 5 4 2
g3 0.2 0.3 1

erstmal es könnte nur folgendes lesen:
g1 20
g2 5
g3 0.2

Weil du in deinem Programm nicht auf die anderen Zellen zugreifst.

Damit bekommst du alles:

while...
 System.out.print(currentRow.getCell((short) 0).getStringCellValue() + " - ");
 System.out.print(currentRow.getCell((short) 1).getNumericCellValue());
 System.out.print(currentRow.getCell((short) 2).getNumericCellValue());
 System.out.println(currentRow.getCell((short) 3).getNumericCellValue());
...

Dann nicht mehr und es kommt dieser Fehler:
java.io.IOException: Unable to read entire header; 35 bytes
read; expected 512 bytes

Koennte ein Bug sein. Steht hier allerdings auf „resolved“
mit dem Hinweis auf Excel:
http://issues.apache.org/bugzilla/show_bug.cgi?id=31879

Uebrigens brauchst du das…

import java.io.FileInputStream;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;

…nur einmal und nicht siebenmal!

Gruss, Patrick

Unable to read entire header …

Sieht nach einem Versionskonflikt aus:

> > POI will not support older versions of EXcel. That is the reason
> > you get that problem,
> > POI supported documents should start with following charachters
> > ÐÏࡱá

http://article.gmane.org/gmane.comp.j

Versuch es mal mit einer aelteren POI Version oder speichere
deine Excel-Datei mit einem neueren Excel.

Gruss, Patrick

Ergänzung
Neben dem Versionsproblem hatte ich auch Schwierigkeiten mit Excelsdateien die Formeln in den Zellen oder Makros enthielten… da passierten die merkwürdigsten Dinge.

Meine Lösung (Und so machen es auch alle Kunden die ihre Exceldaten importieren bei uns wollen): Alles markieren, alles kopieren, neue Datei auf, Inhalte einfügen. Speichern und diese Datei dann in Java einlesen.