美文网首页java编程笔记
Java项目中表格处理的两种主要方式

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

作者: 爱宝宝n | 来源:发表于2019-04-18 12:32 被阅读0次

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

    相关文章

      网友评论

        本文标题:Java项目中表格处理的两种主要方式

        本文链接:https://www.haomeiwen.com/subject/fitowqtx.html