一、JXL:
Jxl对中文支持非常好,操作简单,方法看名知意。
Jxl是纯javaAPI,在跨平台上表现的非常完美,代码可以再windows或者Linux上运行而无需重新编写
支持Excel 95-2000的所有版本
生成Excel 2000标准格式
支持字体、数字、日期操作
能够修饰单元格属性,如支持单元格的阴影操作,以及颜色操作
小文件读取效率比较高
支持图像和图表,但是这套API对图形和图表的支持很有限,而且仅仅识别PNG格式。
缺点:效率低,图片支持部完善,对格式的支持不如POI强大
JXL新建表格的简单例子:
String filePath = "C:/Users/moffice/Desktop/"+name+"经营报表.xls";
String fileName = name+"经营报表.xls";
System.out.println(filePath);
//创建一个Excel文件
WritableWorkbook book = Workbook.createWorkbook(new File(filePath));
//创建Excel中的页面,设置页面名称,页面号由0开始,页面会按页面号从小到大的顺序在Excel中从左向右排列
WritableSheet sheet1 = book.createSheet(name+"经营报表", 0);
//设置要合并单元格的下标
//作用是指定第i+1列的宽度,比如将第一列的宽度设为30
//sheet1.setColumnView(1, 160);
//设置单元格的样式
WritableCellFormat cellFormat = new WritableCellFormat();
//设置水平居中
cellFormat.setAlignment(jxl.format.Alignment.CENTRE);
//设置垂直居中
cellFormat.setVerticalAlignment(jxl.format.VerticalAlignment.CENTRE);
//设置自动换行
cellFormat.setWrap(true);
//设置显示的字体样式,字体,字号,是否粗体,字体颜色
cellFormat.setFont(new WritableFont(WritableFont.createFont("楷体_GB2312"),12,WritableFont.NO_BOLD,false,
UnderlineStyle.NO_UNDERLINE));
//设置单元格背景色
//cellFormat.setBackground(jxl.format.Colour.BRIGHT_GREEN);
//创建一个单元格,并按行列坐标进行指定的内容写入 ,最后加入显示的样式
Label label = new Label(0, 0, "姓名",cellFormat);
sheet1.addCell(label);
Label label1 = new Label(1, 0, "年龄",cellFormat);
sheet1.addCell(label1);
label = new Label(0, 1, "小东",cellFormat);
sheet1.addCell(label);
label = new Label(1, 1, "18",cellFormat);
sheet1.addCell(label);
label = new Label(0, 2, "小李",cellFormat);
sheet1.addCell(label);
label = new Label(1, 2, "16",cellFormat);
sheet1.addCell(label);
//开始执行写入操作
book.write();
//关闭流
book.close();
二、POI
能保持Excel里原有的宏(但不能用它写新的宏),支持公式,宏,一些企业应用上会非常实用。
不支持跨平台(主要就是Java语言)
在一些业务场景中代码相对复杂,但是API丰富,支持多种模式的读写。
支持比较新版本的excel,能够修饰单元格属性。
读写的时候比较占内存。
读写的时候比较占内存。
支持大数量大文件的读写操作。但是需要熟悉API,支持字体、数字、日期操作。
效率高,这点不错
POI新建表格的简单例子:
HSSFWorkbook wb = new HSSFWorkbook();
HSSFSheet sheet = wb.createSheet();
HSSFRow row = null;
HSSFCell cell = null;
//创建单元格,并设置值表头 设置表头居中
HSSFCellStyle styleMain = wb.createCellStyle();
//水平居中
styleMain.setAlignment(HorizontalAlignment.CENTER);
//垂直居中
styleMain.setVerticalAlignment(VerticalAlignment.CENTER);
String[] titles = new String[]{"姓名", "年龄"};
row = sheet.createRow(0);
for (int i = 0; i < titles.length; i++) {
row.createCell(i).setCellValue(titles[i]);
}
row = sheet.createRow((1));
//姓名
HSSFCell name = row.createCell(0);
name.setCellValue("小东");
name.setCellStyle(styleMain);
//年龄
HSSFCell name = row.createCell(1);
name.setCellValue("18");
name.setCellStyle(styleMain);
row = sheet.createRow((2));
//姓名
HSSFCell name = row.createCell(0);
name.setCellValue("小李");
name.setCellStyle(styleMain);
//年龄
HSSFCell name = row.createCell(1);
name.setCellValue("16");
name.setCellStyle(styleMain);
//合并单元格 第二行和第三行的第第一列合并
//sheet.addMergedRegion(new CellRangeAddress(1, 2, 0, 0));
for (int i = 0; i <= titles.length; i++) {
sheet.autoSizeColumn(i, true);
}
ByteArrayOutputStream byteArrayOutputStream = null;
try {
byteArrayOutputStream = new ByteArrayOutputStream();
wb.write(byteArrayOutputStream);
String suffix = ".xls";
response.setContentType("application/vnd.ms-excel;charset=utf-8");
response.setHeader("Content-Disposition",
"attachment;filename=" + new String((fileName + suffix).getBytes(), "iso-8859-1"));
OutputStream outputStream = response.getOutputStream();
outputStream.write(byteArrayOutputStream.toByteArray());
outputStream.close();
} catch (Exception e) {
e.printStackTrace();
} finally {
try {
if (byteArrayOutputStream != null) {
byteArrayOutputStream.close();
}
} catch (IOException e) {
e.printStackTrace();
}
try {
wb.close();
} catch (IOException e) {
e.printStackTrace();
}
}
总体来说
JXL支持比较低版本的excel,比如Excel 95 ,97 ,2000,2003
由于Excel版本比较低,导致最大行有限制,无法导出65535以上量级的数据
对于内存,和时间的花费也比POI基于内存+磁盘的方式高。
对于简单的单表excel导入导出的需求,建议使用JXL。数据量稍微小点,占用内存少,速度快。
对于报表类的,涉及月份数据量,多表数据聚合在一起建议使用POI。
网友评论