大量に大データ量をEXCELまでエクスポートします.
使ったjarカバンはPOI 3.8です.カバンを案内する時、そのいくつかのカバンは全部案内します.下のカバンはもちろんです.公式サイトにあります.http://poi.apache.org/
続いてツールの種類で、無意識にネット上で発見して、パッケージの悪くないと感じて、私は少し改正して、大きいデータ量(30 Wデータ、70列)を導いてEXCEL 2007に着いて、現在メモリがあふれ出る問題が現れていません.
まとめ:
最初はPOIの最新のAPIを使っていませんでしたが、やはり簡単に溢れてきました.大体6000行、70列で溢れています.効果がよくないです.POI 3.8の最新のAPIを使っています.ExcerWriterのコードに注意してください.
これまでcsvとtableでデータをエクスポートする試みがありましたが、csvはカンマで区切られています.テーブルはラベルでデータを包装します.この二つはまだメモリが溢れていません.具体的なテストもしていません.フォーマットに対する要求が高くないなら、あるいはデータはただ見るだけのものと考えられます.
また、複数のEXCELを作成して統合していますが、残念ながら効果はよくありません.
問題のリンクです.プロジェクトコードの一部は参考にしてください.
http://topic.csdn.net/u/20120821/16/ac109bbe-c002-4490-93da-bf02b42f0400.html
続いてツールの種類で、無意識にネット上で発見して、パッケージの悪くないと感じて、私は少し改正して、大きいデータ量(30 Wデータ、70列)を導いてEXCEL 2007に着いて、現在メモリがあふれ出る問題が現れていません.
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.Calendar;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.CellStyle;
import org.apache.poi.ss.usermodel.DataFormat;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.streaming.SXSSFWorkbook;
public class ExcelWriter {
//
private static String NUMBER_FORMAT = "#,##0.00";
//
private static String DATE_FORMAT = "m/d/yy"; // "m/d/yy h:mm"
private OutputStream out = null;
private Workbook workbook = null;
private Sheet sheet = null;
private Row row = null;
public ExcelWriter() {
}
public ExcelWriter(OutputStream out) {
this.out = out;
this.workbook = new SXSSFWorkbook(128);//POI3.8 API, 。
this.sheet = workbook.createSheet();
}
/**
* Excel
* @throws IOException
*/
public void export() throws FileNotFoundException, IOException {
try {
workbook.write(out);
out.flush();
out.close();
} catch (FileNotFoundException e) {
throw new IOException(" Excel ! ", e);
} catch (IOException e) {
throw new IOException(" Excel ! ", e);
}
}
/**
*
* @param index
*/
public void createRow(int index) {
this.row = this.sheet.createRow(index);
}
/**
*
* @param index
*/
public String getCell(int index){
Cell cell = this.row.getCell((short) index);
String strExcelCell = "";
if (cell != null) { // add this condition
// judge
switch (cell.getCellType()) {
case Cell.CELL_TYPE_FORMULA:
strExcelCell = "FORMULA ";
break;
case Cell.CELL_TYPE_NUMERIC: {
strExcelCell = String.valueOf(cell.getNumericCellValue());
}
break;
case Cell.CELL_TYPE_STRING:
strExcelCell = cell.getStringCellValue();
break;
case Cell.CELL_TYPE_BLANK:
strExcelCell = "";
break;
default:
strExcelCell = "";
break;
}
}
return strExcelCell;
}
/**
*
* @param index
* @param value
*/
public void setCell(int index, int value) {
Cell cell = this.row.createCell((short) index);
cell.setCellType(Cell.CELL_TYPE_NUMERIC);
cell.setCellValue(value);
}
/**
*
* @param index
* @param value
*/
public void setCell(int index, double value) {
Cell cell = this.row.createCell((short) index);
cell.setCellType(Cell.CELL_TYPE_NUMERIC);
cell.setCellValue(value);
CellStyle cellStyle = workbook.createCellStyle(); // cell
DataFormat format = workbook.createDataFormat();
cellStyle.setDataFormat(format.getFormat(NUMBER_FORMAT));// cell
cell.setCellStyle(cellStyle); // cell
}
/**
*
* @param index
* @param value
*/
public void setCell(int index, String value) {
Cell cell = this.row.createCell((short) index);
cell.setCellType(Cell.CELL_TYPE_STRING);
cell.setCellValue(value);
}
/**
*
* @param index
* @param value
*/
public void setCell(int index,Calendar value) {
Cell cell = this.row.createCell((short) index);
cell.setCellValue(value.getTime());
CellStyle cellStyle = workbook.createCellStyle(); // cell
DataFormat format = workbook.createDataFormat();
cellStyle.setDataFormat(format.getFormat(DATE_FORMAT)); // cell
cell.setCellStyle(cellStyle); // cell
}
public static void main(String[] args) {
System.out.println(" Excel ");
File f = new File("C:\\qt.xls");
ExcelWriter e = new ExcelWriter();
try {
e = new ExcelWriter(new FileOutputStream(f));
} catch (FileNotFoundException e1) {
e1.printStackTrace();
}
e.createRow(0);
e.setCell(0, " ");
e.setCell(1, " ");
e.setCell(2, " ");
e.setCell(3, " ");
e.setCell(4, " ");
e.setCell(5, " ");
e.createRow(1);
e.setCell(0, "t1");
e.setCell(1, 1);
e.setCell(2, 3.0);
e.setCell(3, 1);
e.setCell(4, " ");
e.setCell(5, " ");
try {
e.export();
System.out.println(" Excel [ ] ");
} catch (IOException ex) {
System.out.println(" Excel [ ] ");
ex.printStackTrace();
}
}
}
これはutilだけです.それから、あなたのプロジェクトに応用できます.次はテストクラスです.import java.io.BufferedOutputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
public class TestExcelPOI {
public static void main(String[] args) throws FileNotFoundException {
String newFileName = "test_performance.xlsx";
int rows = 100000;
int cols = 70;
BufferedOutputStream out = new BufferedOutputStream(new FileOutputStream(newFileName));
ExcelWriter excelWriter = new ExcelWriter(out);
long start =System.currentTimeMillis();
for (int rowNum = 0; rowNum < rows; rowNum++){
excelWriter.createRow(rowNum);
for (int colNum = 0; colNum < cols; colNum++) {
String value = rowNum + "_" + colNum;//
excelWriter.setCell(colNum, value);
}
}
try{
excelWriter.export();
System.out.println(" Excel [ ]");
} catch (IOException ex) {
System.out.println(" Excel [ ]");
ex.printStackTrace();
}
long end =System.currentTimeMillis();
double seconds = (end -start)/Math.pow(10, 3);
System.out.println(seconds);
}
}
/*************** **************************
* Excel [ ]
* 48.293
*************************************************/
本人が運行している30 Wは2分ぐらいです.これより少し早いと思います.まとめ:
最初はPOIの最新のAPIを使っていませんでしたが、やはり簡単に溢れてきました.大体6000行、70列で溢れています.効果がよくないです.POI 3.8の最新のAPIを使っています.ExcerWriterのコードに注意してください.
これまでcsvとtableでデータをエクスポートする試みがありましたが、csvはカンマで区切られています.テーブルはラベルでデータを包装します.この二つはまだメモリが溢れていません.具体的なテストもしていません.フォーマットに対する要求が高くないなら、あるいはデータはただ見るだけのものと考えられます.
また、複数のEXCELを作成して統合していますが、残念ながら効果はよくありません.
問題のリンクです.プロジェクトコードの一部は参考にしてください.
http://topic.csdn.net/u/20120821/16/ac109bbe-c002-4490-93da-bf02b42f0400.html