对于大数据报表打印

本文介绍使用Apache POI的SXSSFWorkbook进行大数据量Excel文件的读写操作,包括样式设置、数据填充、合并单元格及下载功能。同时,探讨了大数据环境下Excel解析的策略,如使用XSSFReader和XMLReader进行高效解析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

使用大数据的poi处理对象:SxssfWorkBook
        特点:使用一部分对象(100行) 释放一部分对象
注意事项:
    1.不支持模板打印
    2.不支持太多的样式(64000)


一些字体样式
        Font font = wb.createFont();
        font.setFontName("黑体");
        font.setFontHeightInPoints((short)12);
        style.setFont(font);
        style.setAlignment(HorizontalAlignment.CENTER);                //横向居中
        style.setVerticalAlignment(VerticalAlignment.CENTER);        //纵向居中
        style.setBorderTop(BorderStyle.THIN);                        //上细线
        style.setBorderBottom(BorderStyle.THIN);                    //下细线
        style.setBorderLeft(BorderStyle.THIN);                        //左细线
        style.setBorderRight(BorderStyle.THIN);                        //右细线
 


// 根据时间去数据库查询数据 List<对象>
        List<ContractProductVo> voList=contractProductService.findByInputDate(companyId,inputDate);
        // 使用poi将数据写入excel
        // 创建工作薄
        Workbook wb=new SXSSFWorkbook();                大数据提供下载
        // 创建工作表
        Sheet st = wb.createSheet();
        // 统一设置列宽
        st.setColumnWidth(1,26*256);
        st.setColumnWidth(2,12*256);
        st.setColumnWidth(3,29*256);
        st.setColumnWidth(4,12*256);
        st.setColumnWidth(5,15*256);
        st.setColumnWidth(6,10*256);
        st.setColumnWidth(7,10*256);
        st.setColumnWidth(8,8*256);
        // 基本参数设置
        int rowIndex=0;
        Row row=null;
        Cell cell=null;
        // 创建行
        row=st.createRow(rowIndex++); //0   0+1
            //设置行高
        row.setHeightInPoints(36f);
            // 创建单元格
        cell=row.createCell(1);
            // 放入内容  2015-01 2015-11
        String value = inputDate.replaceAll("-0", "-").replaceAll("-", "年");
        cell.setCellValue(value+"月份出货表");
           // 设置单元格的样式
        cell.setCellStyle(bigTitle(wb));
          // 合并单元格
        st.addMergedRegion(new CellRangeAddress(0,0,1,8));

        // 创建第二行的小标题
        row=st.createRow(rowIndex++); //1  1+1
        row.setHeightInPoints(26.25f);
        // 创建单元格
        String[] arr={"","单元格1","单元格1","单元格1","单元格1","单元格1","单元格1","单元格1","单元格1"};
        for(int i=1;i<arr.length;i++){
            cell=row.createCell(i);
            cell.setCellValue(arr[i]);
            cell.setCellStyle(title(wb));
        }
        // 创建所有的数据行
        for (ContractProductVo vo : voList) {

            for(int i=0;i<5000;i++){
            // 创建行
            row=st.createRow(rowIndex++);
            // 行高
            row.setHeightInPoints(24f);
            // 单元格
            cell=row.createCell(1);
            // 设置内容
            cell.setCellValue(vo.getCustomName());
    
            // 单元格
            cell=row.createCell(2);
            // 设置内容
            cell.setCellValue(vo.getContractNo());


            // 单元格
            cell=row.createCell(3);
            // 设置内容
            cell.setCellValue(vo.getProductNo());
   

            // 单元格
            cell=row.createCell(4);
            // 设置内容
            cell.setCellValue(vo.getCnumber());
           

            // 单元格
            cell=row.createCell(5);
            // 设置内容
            cell.setCellValue(vo.getFactoryName());
         
            // 单元格
            cell=row.createCell(6);
            // 设置内容
            cell.setCellValue(vo.getDeliveryPeriod());
            

            // 单元格
            cell=row.createCell(7);
            // 设置内容
            cell.setCellValue(vo.getShipTime());
           

            // 单元格
            cell=row.createCell(8);
            // 设置内容
            cell.setCellValue(vo.getTradeTerms());
            // 设置样式
                //cell.setCellStyle(text(wb));
            }
        }
        // 提供excel下载给用户
        // 工具类
        ByteArrayOutputStream os = new ByteArrayOutputStream();
        wb.write(os);
        new DownloadUtil().download(os,response,"出货表.xlsx");
    }

 


大数据读取报表

1:

public class ExcelParse {

    public void parse (String path) throws Exception {
        //解析器
        SheetHandler hl = new SheetHandler();
        //1.根据 Excel 获取 OPCPackage 对象
        OPCPackage pkg = OPCPackage.open(path, PackageAccess.READ);
        try {
            //2.创建 XSSFReader 对象
            XSSFReader reader = new XSSFReader(pkg);
            //3.获取 SharedStringsTable 对象
            SharedStringsTable sst = reader.getSharedStringsTable();
            //4.获取 StylesTable 对象
            StylesTable styles = reader.getStylesTable();
            XMLReader parser = XMLReaderFactory.createXMLReader();
            // 处理公共属性
            parser.setContentHandler(new XSSFSheetXMLHandler(styles,sst, hl,
                    false));
            XSSFReader.SheetIterator sheets = (XSSFReader.SheetIterator)
                    reader.getSheetsData();

            //逐行读取逐行解析
            while (sheets.hasNext()) {
                InputStream sheetstream = sheets.next();
                InputSource sheetSource = new InputSource(sheetstream);
                try {
                    parser.parse(sheetSource);
                } finally {
                    sheetstream.close();
                }
            }
        } finally {
            pkg.close();
        }
    }
}

2:

// 处理业务
public class SheetHandler implements XSSFSheetXMLHandler.SheetContentsHandler{

    /*
    * 1 创建要封装的对象 vo
    * 2 过程:将excel中的数据封装给vo对象
    * 3 封装完数据打印该对象
    *
    * */


    private ContractProductVo vo;
    /*
    * 从哪一行开始
    *   i:行数
    *
    * */
    @Override
    public void startRow(int i) {
        if(i>=2){
            //创建要封装的对象 vo
            vo=new ContractProductVo();
        }
    }

    /*
    * 代表此行结束
    *
    * */
    @Override
    public void endRow(int i) {
        //打印对象---保存数据到数据库
        System.out.println(vo);
    }


    /*
    * 每一行的单元格数据
    *       cell:单元格的标号
    *       cellValue:单元格中的内容
    *       xssfComment:注释
    * */
    @Override
    public void cell(String cell, String cellValue, XSSFComment xssfComment) {
        String name=cell.substring(0,1);
        if(vo!=null) switch (name) {
            case "B": {
                vo.setCustomName(cellValue);
                break;
            }
            case "C": {
                vo.setContractNo(cellValue);
                break;
            }
            case "D": {
                vo.setProductNo(cellValue);
                break;
            }
            case "E": {
                vo.setCnumber(Integer.parseInt(cellValue));
                break;
            }
            case "F": {
                vo.setFactoryName(cellValue);
                break;
            }
            case "G": {
                try {
                    vo.setDeliveryPeriod(new SimpleDateFormat("yyyy-MM-dd").parse(cellValue));
                } catch (ParseException e) {
                    e.printStackTrace();
                }
                break;
            }
            case "H": {
                try {
                    vo.setShipTime(new SimpleDateFormat("yyyy-MM-dd").parse(cellValue));
                } catch (ParseException e) {
                    e.printStackTrace();
                }

                break;
            }
            case "I": {
                vo.setTradeTerms(cellValue);
                break;
            }
        }
    }
}

3:

public class Demo {

    public static void main(String[] args) throws Exception {
        new ExcelParse().parse("D:\\测试.xlsx");
    }
}

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

慢慢CG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值