はJXLを使用して.xlsファイルを生成するコードです:ここでは性能比較ファイルの世代をエクセル
public void generateXls(String fileName, int sheets, int cols, int rows) {
if (cols > 256) {
throw new IllegalArgumentException("Error: number of cols per sheet must be < 256");
}
if (rows > 65536) {
throw new IllegalArgumentException("Error: number of rows per sheet must be < 65536");
}
String fullName = fileName + ".xls";
WritableWorkbook workbook = null;
try {
workbook = Workbook.createWorkbook(new File(fullName));
} catch (IOException e) {
e.printStackTrace();
}
Random random = new Random();
for (int s = 0; s < sheets; s++) {
WritableSheet sheet = workbook.createSheet("Sheet" + s, 0);
for (int i = 0; i < cols ; i++) {
for (int j = 0; j < rows; j++) {
Number number = new Number(i, j, random.nextDouble()*1000);
try {
sheet.addCell(number);
} catch (RowsExceededException e) {
throw new RuntimeException("Error: too many rows in a sheet");
} catch (WriteException e) {
throw new RuntimeException("Error occured while adding cell to sheet", e);
}
}
}
}
try {
workbook.write();
workbook.close();
} catch (WriteException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
は、POIを使用して.XLSとの.xlsxファイルを生成するコードは次のとおりです。
public void generateXlsx(String fileName, int sheets, int cols, int rows) {
if (cols > 16383) {
throw new IllegalArgumentException("Error: number of cols per sheet must be < 16383");
}
XSSFWorkbook workbook = new XSSFWorkbook();
Random random = new Random();
for (int s = 0; s < sheets; s++) {
XSSFSheet sheet = workbook.createSheet();
for (int i = 0; i < rows ; i++) {
XSSFRow row = sheet.createRow(i);
for (int j = 0; j < cols; j++) {
XSSFCell cell = row.createCell(j);
cell.setCellValue(random.nextDouble()*1000);
}
}
}
FileOutputStream fileOut = null;
try {
fileOut = new FileOutputStream(fileName);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
workbook.write(fileOut);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
fileOut.flush();
fileOut.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
public void generateXls(String fileName, int sheets, int cols, int rows) {
if (cols > 256) {
throw new IllegalArgumentException("Error: number of cols per sheet must be < 256");
}
HSSFWorkbook workbook = new HSSFWorkbook();
Random random = new Random();
for (int s = 0; s < sheets; s++) {
HSSFSheet sheet = workbook.createSheet();
for (int i = 0; i < rows ; i++) {
HSSFRow row = sheet.createRow(i);
for (int j = 0; j < cols; j++) {
HSSFCell cell = row.createCell(j);
cell.setCellValue(random.nextDouble()*1000);
}
}
}
FileOutputStream fileOut = null;
try {
fileOut = new FileOutputStream(fileName);
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
workbook.write(fileOut);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
try {
fileOut.flush();
fileOut.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
私は、パフォーマンステストを書いた:
public static void main(String[] args) {
int sheets =1;
int cols = 255;
int rows = 20000;
long a1 = System.currentTimeMillis();
ExcelFileGenerator generator = new ExcelFileGenerator();
generator.generateXls("xlsJXL.xls", sheets, cols, rows);
long xls = System.currentTimeMillis()-a1;
System.out.println("xlsJXL: " + xls);
ExcelFileGeneratorPOI generatorPOI = new ExcelFileGeneratorPOI();
long a2 = System.currentTimeMillis();
generatorPOI.generateXls("xlsPOI.xls", sheets, cols, rows);
long xlsPoi = System.currentTimeMillis()-a2;
System.out.println("xlsPOI: " + xlsPoi);
long a3 = System.currentTimeMillis();
generatorPOI.generateXlsx("xlsxPOI.xlsx", sheets, cols, rows);
long xlsx = System.currentTimeMillis()-a3;
System.out.println("xlsxPOI: " + xlsx);
}
結果は次のとおりです。 シートS = 1つの COLS = 255 行= 10 xlsJXL:133 xlsPOI:162 xlsxPOI:645
シート= 1つの COLS = 10 行= 255 xlsJXL:130 xlsPOI:140 xlsxPOI:650
シート= 10の COLS = 255 行= 255 xlsJXL:611 xlsPOI:784 xlsxPOI:16228
シート= 2つの COLS = 100 行= 10000
xlsJXL:2755 xlsPOI:3270 xlsxPOI:スレッドの例外 "メイン" java.lang.OutOfMemoryErrorを:Javaヒープスペース
作成することによって、何らかの理由POIの.xlsxは.xlsの作成よりもはるかに遅いですか?
私の実装よりも速くxlsxファイルをビルドするソリューションはありませんか? – AAaa
私が知っているわけではありません。より速くそれを行う他のライブラリがあるかもしれません。 –