java编程笔记

Java项目中表格处理的两种主要方式

2019-04-18  本文已影响0人  爱宝宝n

一、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。

上一篇下一篇

猜你喜欢

热点阅读