wie split Excel-Datei, die mit java?
Ich habe eine Excel Tabelle mit 200000 Zeilen.ich möchte teilt die excel-Datei für jede 50000 Datensätze.
ich bin mit der Apache POI API Zum Lesen und schreiben von Excel-Datei.Ist es möglich, split-Datei, wenn die Anzahl der Zeilen erreicht auf den vorgegebenen Größe einer Aufnahme.bitte helfen Sie mir die Lösung für dieses problem.
Code:
public String[][] getSheetData(int SheetIndex)
{
int noOfColumns = 0;XSSFRow row = null;
XSSFCell cell = null;
int i=0;int noOfRows=0;
int j=0;
String[][] data=null; XSSFSheet sheet=null;
try {
loadFile(); //load give Excel
if(validateIndex(SheetIndex))
{
sheet = workbook.getSheetAt(SheetIndex);
noOfColumns = getNumberOfColumns(SheetIndex);
noOfRows =getNumberOfRows(SheetIndex)+1;
data = new String[noOfRows][noOfColumns];
Iterator rowIter = sheet.rowIterator();
while(rowIter.hasNext())
{
row = (XSSFRow) rowIter.next();
Iterator cellIter = row.cellIterator();
j=0;
while(cellIter.hasNext())
{
cell = (XSSFCell) cellIter.next();
if(cell.getCellType() == cell.CELL_TYPE_STRING)
{
data[i][j] = cell.getStringCellValue();
}
else if(cell.getCellType() == cell.CELL_TYPE_NUMERIC)
{
data[i][j] = Double.toString(cell.getNumericCellValue());
}
j++;
}
i++;
} //outer while
}
else throw new InvalidSheetIndexException("Invalid sheet index.");
} catch (Exception ex) {
logger.error(ex);}
return data;
}
Auftreten, Ausnahme:
Exception in thread "main" java.lang.OutOfMemoryError: Java heap space
at org.apache.xmlbeans.impl.store.Locale$ScrubBuffer.<init>(Locale.java:1885)
at org.apache.xmlbeans.impl.store.Locale.getScrubBuffer(Locale.java:1904)
at org.apache.xmlbeans.impl.store.Xobj.getValueAsString(Xobj.java:1205)
at org.apache.xmlbeans.impl.store.Xobj.fetch_text(Xobj.java:1796)
at org.apache.xmlbeans.impl.values.XmlObjectBase.get_wscanon_text(XmlObjectBase.java:1332)
at org.apache.xmlbeans.impl.values.XmlObjectBase.check_dated(XmlObjectBase.java:1269)
at org.apache.xmlbeans.impl.values.JavaLongHolder.longValue(JavaLongHolder.java:53)
at org.apache.xmlbeans.impl.values.XmlObjectBase.getLongValue(XmlObjectBase.java:1502)
at org.openxmlformats.schemas.spreadsheetml.x2006.main.impl.CTRowImpl.getR(Unknown Source)
at org.apache.poi.xssf.usermodel.XSSFRow.getRowNum(XSSFRow.java:321)
at org.apache.poi.xssf.usermodel.XSSFSheet.initRows(XSSFSheet.java:180)
at org.apache.poi.xssf.usermodel.XSSFSheet.read(XSSFSheet.java:147)
at org.apache.poi.xssf.usermodel.XSSFSheet.onDocumentRead(XSSFSheet.java:134)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.onDocumentRead(XSSFWorkbook.java:235)
at org.apache.poi.POIXMLDocument.load(POIXMLDocument.java:190)
at org.apache.poi.xssf.usermodel.XSSFWorkbook.<init>(XSSFWorkbook.java:189)
at com.arosys.excelReading.ReadXLSX.loadFile(ReadXLSX.java:49)
at com.arosys.excelReading.ReadXLSX.getNumberOfSheet(ReadXLSX.java:121)
at com.arosys.excelReading.ReadXLSX.main(ReadXLSX.java:324)
Java Result: 1
Dank
- Können Lesen Sie das ganze Blatt? Wenn ja, zeige den aktuellen code.
- ja,ich lese Datensätze im ganzen Blatt.wenn ich versuchte, Aufzeichnungen bekam ich eine Ausnahme heap-Speicher außerhalb des Bereichs.
- zeigen immer Ausnahmen!!!
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie nicht Lesen können, das docuemnt mit POI, aber die Tabelle einfach ist, würde ich dir vorschlagen, um es zu öffnen mit Excel, speichern Sie es als CSV-Datei und dann trennen Sie diese Datei, um die Fragmente. Dies kann auch durchgeführt unter Verwendung von shell-Skript/batch-Datei.
Diese Empfehlung ist gültig, wenn Sie haben eine große Datei und haben, um es zu teilen. Wenn Sie jedoch die Implementierung eines service erhalten sollen solche excel-Dateien zu trennen und suchen eine andere Lösung.
Standard-Java-heap-Größe ist sehr klein, vor allem für den Umgang mit großen xml-Dateien.
Brauchen Sie nur zu Ihrer Speichergröße und Sie werden in Ordnung sein. Legen Sie eine anständige Größe für Ihre
-Xmx
Einstellung, wenn die Ausführung von Java -Ersten aller Einsatz-Empfehlung von Gagravarr und maximieren Sie Ihren Speicherbedarf. Wenn auf Ihrer Plattform ermöglicht es, wechseln Sie zu einer 64-bit-JVM. Dieser brute-force-Ansatz allein kann Ihr problem lösen
Wenn möglich, vermeiden Sie die Verwendung .xlsx-Dateien des POI - verbraucht viel mehr Speicher auf .xlsx als auf .xls
POI hier empfiehlt die Verwendung eventmodel zum Lesen (hier ist, wo die meisten Speicher verbraucht) und man kann auch versuchen, Ihre neuen SXSSF API mit geringem Speicherbedarf für das schreiben (noch in beta).