poi 导出excel


   public void downloadOrder(String orderNo, Boolean canPay, long startDate, long endDate, Constant.OrderStatus status, HttpServletResponse response) {
        LocalDateTime localDateTimeStart = ConverterUtil.getTimeByTimestamp(startDate);
        LocalDateTime localDateTimeEnd = ConverterUtil.getTimeByTimestamp(endDate);
        LocalDateTime start = getStartLocalDateTime(localDateTimeStart);
        LocalDateTime end = getEndLocalDateTime(localDateTimeEnd);
        List<OrderEntity> orderEntities =  orderDao.findAll((root, criteriaQuery, criteriaBuilder) -> {
            Predicate condition = criteriaBuilder.and(
                    criteriaBuilder.greaterThanOrEqualTo(root.get(OrderEntity_.updateTime),start),
                    criteriaBuilder.lessThanOrEqualTo(root.get(OrderEntity_.updateTime),end)
            );
            if(!StringUtils.isEmpty(orderNo)) {
                Predicate condition2 = criteriaBuilder.equal(root.get(OrderEntity_.orderNo),orderNo);
                condition = criteriaBuilder.and(condition,condition2);
            }
            if(canPay!=null) {
                Predicate condition2 = criteriaBuilder.equal(root.get(OrderEntity_.canPay),canPay);
                condition = criteriaBuilder.and(condition,condition2);
            }
            if(status!=null){
                Predicate condition2 = criteriaBuilder.equal(root.get(OrderEntity_.orderStatus),status);
                condition = criteriaBuilder.and(condition,condition2);
            }
            return criteriaQuery.where(condition).getRestriction();
        });
        OutputStream os = null;
        /**
         * 、订单明细ID、供货商、商品编号、商品名称、下单时间、规格、售卖单价、数量、合计、结算价(合计-进货价格)、订单实际支付价格、运费,支付方式,状态,用户ID,姓名,身份证,手机号,地址,邮政编码,备注,物流公司,物流单号
         * */
        try {
            String fileName = "订单统计_"+ getDownloadTime(start) + "到" + getDownloadTime(end)+"_";
            fileName += status == null ? ".xls" : "_" + Order.getOrderStatus(status) + ".xls";
            response.setContentType("application/unknown; charset=GB2312");
            response.setHeader("content-disposition", "attachment;filename="
                    + new String(fileName.getBytes("GB2312"), "iso-8859-1"));
            os = response.getOutputStream();
            HSSFWorkbook wb = new HSSFWorkbook();
            //给sheet命名
            HSSFSheet s = wb.createSheet("orderSheet");
            //设置样式
            HSSFCellStyle cellStyle = wb.createCellStyle();
            cellStyle.setBorderBottom(HSSFCellStyle.BORDER_THIN); //下边框
            cellStyle.setBorderLeft(HSSFCellStyle.BORDER_THIN);//左边框
            cellStyle.setBorderTop(HSSFCellStyle.BORDER_THIN);//上边框
            cellStyle.setBorderRight(HSSFCellStyle.BORDER_THIN);//右边框
            cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// 左右居中
            cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);// 上下居中

            cellStyle.setWrapText(true);//设置自动换行

            HSSFRow row = s.createRow(0);
            HSSFCell cell = null;
            setCell(row, 0, "商城订单号", cellStyle);
            setCell(row, 1, "用户ID", cellStyle);
            setCell(row, 2, "姓名", cellStyle);
            setCell(row, 3, "身份证", cellStyle);
            setCell(row, 4, "手机号", cellStyle);
            setCell(row, 5, "地址", cellStyle);
            setCell(row, 6, "邮政编码", cellStyle);
            setCell(row, 7, "备注", cellStyle);
            setCell(row, 8, "订单状态", cellStyle);
            setCell(row, 9, "支付方式", cellStyle);
            setCell(row, 10, "订单总价", cellStyle);
            setCell(row, 11, "下单时间", cellStyle);
            setCell(row, 12, "运费", cellStyle);
            setCell(row, 13, "订单行ID", cellStyle);
            setCell(row, 14, "供货商", cellStyle);
            setCell(row, 15, "商品编号", cellStyle);
            setCell(row, 16, "商品名称", cellStyle);
            setCell(row, 17, "商品状态", cellStyle);
            setCell(row, 18, "物流公司(供货商填写)", cellStyle);
            setCell(row, 19, "物流单号(供货商填写)", cellStyle);
            setCell(row, 20, "规格", cellStyle);
            setCell(row, 21, "商品数量", cellStyle);
            setCell(row, 22, "进货单价", cellStyle);
            setCell(row, 23, "售卖单价", cellStyle);
            setCell(row, 24, "数量", cellStyle);
            setCell(row, 25, "合计", cellStyle);
            setCell(row, 26, "结算价(合计-进货价格)", cellStyle);

            int i = 1;
            if(orderEntities != null && orderEntities.size() > 0) {
                for(OrderEntity order : orderEntities){
                    if(order != null) {
                        List<OrderItemEntity> orderItemEntities = order.getOrderItems();
                        int maxRow = 0;//最大行
                        StringBuffer sb = new StringBuffer();
                        if(orderItemEntities != null && orderItemEntities.size() > 0) {
                            int temp = i;//写每一行
                            for(OrderItemEntity orderItemEntity : orderItemEntities) {
                                //商品信息
                                String goodsIdStr = orderItemEntity.getCommodity().getGoodsId();
                                List<MallUtil.Item> items = MallUtil.getGoodsFromGoodsStr(goodsIdStr);

                                //商品订单信息

                                int size = items.size();
                                String itemId = items.get(0).itemID;

                                //供货商编号
                                Map<String,String> supplierNos = getMap(orderItemEntity.getSupplierNo(), items.size(), itemId);

                                //状态
                                Map<String,String> statuses = getMap(orderItemEntity.getStatus(), items.size(), itemId);

                                //公司物流编号
                                Map<String,String> logisticsCodes = getMap(orderItemEntity.getLogisticsCode(), items.size(), itemId);

                                //物流单号
                                Map<String,String> expressFormNos = getMap(orderItemEntity.getExpressFormNo(),items.size(),itemId);

                                double importPrices = 0;//进货总价
                                for(MallUtil.Item item : items) {
                                    row = s.createRow(temp);
                                    String goodId = item.itemID;//商品ID
                                    GoodsEntity goodsEntity = goodsDao.getOne(goodId);
                                    if(goodsEntity != null) {
                                        setCell(row, 14, supplierNos!=null?supplierNos.get(goodId):"", cellStyle);//供货商
                                        setCell(row, 15, ""+goodsEntity.getProductNo(), cellStyle);//商品编号
                                        setCell(row, 16, ""+goodsEntity.getName(), cellStyle);//商品名称
                                        setCell(row, 17, statuses!=null?Order.getOrderItemStatus(Integer.valueOf(statuses.get(goodId))):"", cellStyle);//商品状态
                                        setCell(row, 18, logisticsCodes!=null?logisticsCodes.get(goodId):"", cellStyle);//物流公司
                                        setCell(row, 19, expressFormNos!=null?expressFormNos.get(goodId):"", cellStyle);//物流编号
                                        setCell(row, 20, ""+goodsEntity.getUnit(), cellStyle);//规格
                                        setCell(row, 21, ""+item.num, cellStyle);//商品数量
                                        setCell(row, 22, ""+goodsEntity.getPurchasePrice(), cellStyle);//进货单价

                                        importPrices+=MallUtil.mul(orderItemEntity.getCount(),goodsEntity.getPurchasePrice());
                                        temp+=1;
                                    }else {
                                        throw new BusinessException(ErrorCode.MALL_NOT_EXIST);
                                    }
                                }

                                //订单明细下的商品种类
                                int typeNum = items.size();//2
                                maxRow += typeNum;

                                int firstRow = i+maxRow-typeNum;
                                int lastRow = i+maxRow-1;
                                if(typeNum > 1) {//合并单元格
                                    addCellRangeAddress(firstRow, lastRow, 13, s, wb);//订单明细ID
                                    addCellRangeAddress(firstRow, lastRow, 23, s, wb);//售卖单价
                                    addCellRangeAddress(firstRow, lastRow, 24, s, wb);//数量
                                    addCellRangeAddress(firstRow, lastRow, 25, s, wb);//合计
                                    addCellRangeAddress(firstRow, lastRow, 26, s, wb);//结算(赢利=合计-进货价)
                                    row = s.getRow(firstRow);
                                }
                                setCell(row, 13, ""+orderItemEntity.getId(), cellStyle);
                                setCell(row, 23, ""+orderItemEntity.getPrice(), cellStyle);
                                setCell(row, 24, ""+orderItemEntity.getCount(), cellStyle);
                                double price = MallUtil.mul(orderItemEntity.getCount(),orderItemEntity.getPrice());
                                setCell(row, 25, ""+ price, cellStyle);
                                setCell(row, 26, ""+MallUtil.sub(price,importPrices), cellStyle);
                            }
                        }
                        //合并单元格范围 参数(int firstRow, int lastRow, int firstCol, int lastCol)
                        int firstRow = i;
                        int lastRow = i+maxRow-1;
                        if(lastRow > firstRow) {
                            addCellRangeAddress(firstRow, lastRow, 0, s, wb);//订单号
                            addCellRangeAddress(firstRow, lastRow, 1, s, wb);//用户ID
                            addCellRangeAddress(firstRow, lastRow, 2, s, wb);//姓名
                            addCellRangeAddress(firstRow, lastRow, 3, s, wb);//身份证
                            addCellRangeAddress(firstRow, lastRow, 4, s, wb);//手机号
                            addCellRangeAddress(firstRow, lastRow, 5, s, wb);//地址
                            addCellRangeAddress(firstRow, lastRow, 6, s, wb);//邮政编码
                            addCellRangeAddress(firstRow, lastRow, 7, s, wb);//商品备注
                            addCellRangeAddress(firstRow, lastRow, 8, s, wb);//订单状态
                            addCellRangeAddress(firstRow, lastRow, 9, s, wb);//支付方式
                            addCellRangeAddress(firstRow, lastRow, 10, s, wb);//订单实际支付价格
                            addCellRangeAddress(firstRow, lastRow, 11, s, wb);//下单时间
                            addCellRangeAddress(firstRow, lastRow, 12, s, wb);//运费
                            row = s.getRow(firstRow);
                        }
                        setCell(row, 0, ""+order.getOrderNo(), cellStyle);
                        setCell(row, 1, ""+order.getUser().getUserID(), cellStyle);
                        setCell(row, 2, ""+order.getName(), cellStyle);
                        setCell(row, 3, ""+order.getIdNo(), cellStyle);
                        setCell(row, 4, ""+order.getMobile(), cellStyle);
                        setCell(row, 5, ""+order.getAddress(), cellStyle);
                        setCell(row, 6, ""+order.getPostcode(), cellStyle);
                        setCell(row, 7, ""+order.getDemo(), cellStyle);
                        setCell(row, 8, ""+Order.getOrderStatus(order.getOrderStatus()), cellStyle);
                        setCell(row, 9, ""+Order.getPayChannel(order.getPayChannel()), cellStyle);
                        setCell(row, 10, ""+order.getPayTotalFee(), cellStyle);
                        setCell(row, 11, ""+order.getCreateTime(), cellStyle);
                        setCell(row, 12, ""+order.getFreight(), cellStyle);

                        i+=maxRow;
                    }
                }
            }

            //写入excel 关闭流
            wb.write(os);
        } catch (Exception e) {
            e.printStackTrace();
        }finally {
            try {
                os.flush();
                os.close();
            }catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    //设置单元格
    private static void setCell(HSSFRow row, int col, String content, CellStyle cellStyle) {
        Cell cell = row.createCell(col);
        cell.setCellStyle(cellStyle);
        cell.setCellValue(content);
    }

    //设置合并单元格
    private void addCellRangeAddress(int firstRow, int lastRow, int col, HSSFSheet sheet, Workbook wb) {
        CellRangeAddress address = new CellRangeAddress(firstRow, lastRow, col, col);
        sheet.addMergedRegion(address);//订单明细ID
        setRegionBorder(1,address,sheet,wb);
    }

    //给合并单元格增加边框
    private static void setRegionBorder(int border, CellRangeAddress region, HSSFSheet sheet, Workbook wb){
        RegionUtil.setBorderBottom(border,region, sheet, wb);
        RegionUtil.setBorderLeft(border,region, sheet, wb);
        RegionUtil.setBorderRight(border,region, sheet, wb);
        RegionUtil.setBorderTop(border,region, sheet, wb);

    }

    private String getDownloadTime(LocalDateTime date) {
        String str = date.toString();
        if(StringUtils.isEmpty(str)) {
            return "";
        }
        return str.substring(0,10);
    }
    
    private Map<String,String> getMap(String str, int size, String itemId) {
        if(StringUtils.isEmpty(str)) {
            return null;
        }
        if(!StringUtils.isEmpty(str) && size > 1) {
            return MallUtil.getMapFromGoodsStr(str);
        }else {
            Map<String,String> map = new HashMap<String,String>();
            map.put(itemId, str);
            return map;
        }
    }

单元格的列,行都从0开始。

合并单元格注意问题:

如果合并0-2行,则写单元格内容时,先取到0行的row,然后再设置cell列,如果取2行的row,写内容会失败。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值