制作execl表格心得(二)

@RequestMapping("/exportExecl")
    public void importExecl(String billNo, HttpServletRequest request, HttpServletResponse response) throws Exception {
        InputStream imageInputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("pay.jpg");
        byte[] imageBytes = Util.toByteArray(imageInputStream);
        SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd");
        Map map=cmSaleMianBillService.findSaleBillDetailAny(billNo);
        Double wips = Double.parseDouble(map.get("wips").toString());
        List<SaleBillExecle> list=  cmSaleMianBillService.findSaleBillDetailExecl(billNo);
        Double d=Double.valueOf(map.get("balance").toString());
        // Double d=Double.valueOf(map.get("balance").toString())-(Double.valueOf(map.get("creditLine").toString())-Double.valueOf(map.get("creditLineBalance").toString()));
        Map<String , Object> model=new HashMap<String , Object>();
        model.put("list", list);
        model.put("billDate",formatter.format(map.get("billDate")));
        model.put("payMoney",map.get("payMoney"));
        Double cb = Double.valueOf(map.get("creditLine").toString())-Double.valueOf(map.get("creditLineBalance").toString());
        if(d==0d){
            model.put("balance",-cb);
        }else{
            model.put("balance",d);
        }

        model.put("allQty",list.get(0).getAllQty());
        model.put("allMoney",list.get(0).getAllMoney());
        model.put("img",imageBytes);
       
//        if(cb ==0){
//            model.put("surMoney",list.get(0).getAllMoney() - Double.parseDouble(map.get("payMoney").toString()));
//        }else{
//            model.put("surMoney",Double.valueOf(list.get(0).getAllMoney())-Double.valueOf(map.get("payMoney").toString())+d);
//        }
//        String path="E:\\";
//        String url="E:\\";
        String path = CacheManager2.getConfigArgByKey("imagePath");
        String url = CacheManager2.getConfigArgByKey("imageUrl");
        Double sur= list.get(0).getAllMoney() - Double.parseDouble(map.get("payMoney").toString())-wips;
        if(d>=(sur+cb)) {
           model.put("surMoney",0);
        }else {
           model.put("surMoney",(sur+cb)-d);
        }
        File temp=new File(path+"/saleBillDetail.xlsx");
        if(!temp.exists()) {
           InputStream reportInputStream = Thread.currentThread().getContextClassLoader().getResourceAsStream("saleBillDetail.xlsx");
            OutputStream outputStream = new FileOutputStream(path+"/saleBillDetail.xlsx");
            int bytesWritten = 0;
            int byteCount = 0;
            byte[] bytes = new byte[1024];
            while ((byteCount = reportInputStream.read(bytes)) != -1)
            {
                outputStream.write(bytes, bytesWritten, byteCount);
                outputStream.flush();
            }
            reportInputStream.close();
            outputStream.close();
        }

        File file=new File(path+"/xls");
        if(!file.exists()){//目录不存在就创建
            file.mkdirs();
        }
        String filName= DateUtil.getCurrentTimeStr(DateUtil.FORMAT_YYYYMMDDHHMMSSSSS);
        String save= path+"/xls/"+ filName+".xlsx";
        OutputStream os = new FileOutputStream(save);
        JxlsUtilskey.exportExcel(path+"/saleBillDetail.xlsx", os, model);
        os.close();
        
      //1.读取Excel文档对象
        XSSFWorkbook hssfWorkbook = new XSSFWorkbook(new FileInputStream(save));
        //2.获取要解析的表格(第一个表格)
        XSSFSheet sheet = hssfWorkbook.getSheetAt(0);
        CellRangeAddress region = new CellRangeAddress(2, // first row
                list.size(), // last row
                14, // first column
                 15// last column
        );
        sheet.addMergedRegion(region);
        hssfWorkbook.write(new FileOutputStream(path+"/xls/"+ filName+".xlsx"));
        hssfWorkbook.close();
        // 取得文件名。
        // 以流的形式下载文件。
        InputStream fis = new BufferedInputStream(new FileInputStream(path+"/xls/"+ filName+".xlsx"));
        byte[] buffer = new byte[fis.available()];
        fis.read(buffer);
        fis.close();
        // 清空response
        response.reset();
        // 设置response的Header
        response.setContentType("application/msexcel;charset=UTF-8");
        response.addHeader("Content-Disposition",
                "attachment;filename=" + new String((filName + "-out.xlsx").getBytes("GBK"), "ISO8859_1"));
        response.addHeader("fileName", new String((filName + "-out.xlsx")));
        response.setHeader("Access-control-Allow-Origin", request.getHeader("Origin"));
        response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE");
        response.setHeader("Access-Control-Max-Age", "3600");
        response.setHeader("Access-Control-Allow-Headers", request.getHeader("Access-Control-Request-Headers"));
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setHeader("Access-Control-Expose-Headers", "x-requested-with, Content-Type, Content-Disposition, fileName"); // or *

        OutputStream toClient = new BufferedOutputStream(
                response.getOutputStream());
        toClient.write(buffer);
        toClient.flush();
        toClient.close();


    }

 

public class JxlsUtilskey {
    static{
        //添加自定义指令(可覆盖jxls原指令)
        //合并单元格(模板已经做过合并单元格操作的单元格无法再次合并)
        XlsCommentAreaBuilder.addCommandMapping("merge", MergeCommand.class);
    }

    public static void exportExcel(InputStream is, OutputStream os, Map<String, Object>
            model) throws IOException{
        Context context = PoiTransformer.createInitialContext();
        if (model != null) {
            for (Map.Entry<String, Object> entry : model.entrySet()){
                context.putVar(entry.getKey(), entry.getValue());
            }
        }
        JxlsHelper jxlsHelper = JxlsHelper.getInstance();
        Transformer transformer  = jxlsHelper.createTransformer(is, os);
        //获得配置
        JexlExpressionEvaluator evaluator = (JexlExpressionEvaluator)transformer.getTransformationConfig().getExpressionEvaluator();
        //设置静默模式,不报警告
        evaluator.getJexlEngine().setSilent(true);
        //函数强制,自定义功能
        Map<String, Object> funcs = new HashMap<String, Object>();
        funcs.put("jx", new JxlsUtils());    //添加自定义功能
        evaluator.getJexlEngine().setFunctions(funcs);
        //必须要这个,否者表格函数统计会错乱
        jxlsHelper.setUseFastFormulaProcessor(false).processTemplate(context, transformer);
    }

    public static void exportExcel(File xls, File out, Map<String, Object> model) throws FileNotFoundException, IOException {
        exportExcel(new FileInputStream(xls), new FileOutputStream(out), model);
    }

    public static void exportExcel(String templatePath, OutputStream os, Map<String, Object> model) throws Exception {
        File template = getTemplate(templatePath);
        if(template != null){
            exportExcel(new FileInputStream(template), os, model);
        } else {
            throw new Exception("Excel 模板未找到。");
        }
    }

    //获取jxls模版文件
    public static File getTemplate(String path){
        File template = new File(path);
        if(template.exists()){
            return template;
        }
        return null;
    }

    // 日期格式化
    public String dateFmt(Date date, String fmt) {
        if (date == null) {
            return "";
        }
        try {
            SimpleDateFormat dateFmt = new SimpleDateFormat(fmt);
            return dateFmt.format(date);
        } catch (Exception e) {
            e.printStackTrace();
        }
        return "";
    }

    // if判断
    public Object ifelse(boolean b, Object o1, Object o2) {
        return b ? o1 : o2;
    }

 

 

public class MergeCommand extends AbstractCommand {
    private String cols;        //合并的列数
    private String rows;        //合并的行数
    private String minCols;     //最小合并的列数
    private String minRows;     //最小合并的行数
    private CellStyle cellStyle;//第一个单元格的样式

    private Area area;

    @Override
    public String getName() {
        return "merge";
    }

    @Override
    public Command addArea(Area area) {
        if (super.getAreaList().size() >= 1) {
            throw new IllegalArgumentException("You can add only a single area to 'merge' command");
        }
        this.area = area;
        return super.addArea(area);
    }

    @Override
    public Size applyAt(CellRef cellRef, Context context) {
        int rows = area.getSize().getHeight();
        int cols = area.getSize().getWidth();
        rows = Math.max(getVal(this.rows, context), rows);
        cols = Math.max(getVal(this.cols, context), cols);
        rows = Math.max(getVal(this.minRows, context), rows);
        cols = Math.max(getVal(this.minCols, context), cols);
        if(rows > 1 || cols > 1){
            Transformer transformer = this.getTransformer();
            if(transformer instanceof PoiTransformer){
                poiMerge(cellRef, context, (PoiTransformer)transformer, rows, cols);
            }else if(transformer instanceof JexcelTransformer){
                jexcelMerge(cellRef, context, (JexcelTransformer)transformer, rows, cols);
            }
        }
        area.applyAt(cellRef, context);
        return new Size(cols, rows);
    }

    protected Size poiMerge(CellRef cellRef, Context context, PoiTransformer transformer, int rows, int cols){
        Sheet sheet = transformer.getWorkbook().getSheet(cellRef.getSheetName());
        CellRangeAddress region = new CellRangeAddress(
                cellRef.getRow(),
                cellRef.getRow() + rows - 1,
                cellRef.getCol(),
                cellRef.getCol() + cols - 1);
        sheet.addMergedRegion(region);

        //合并之后单元格样式会丢失,以下操作将合并后的单元格恢复成合并前第一个单元格的样式
        area.applyAt(cellRef, context);
        if(cellStyle == null){
            PoiCellData cellData = (PoiCellData)transformer.getCellData(area.getStartCellRef());
            if(cellData != null){
                cellStyle = cellData.getCellStyle();
            }
        }
        setRegionStyle(cellStyle, region, sheet);
        return new Size(cols, rows);
    }

    protected Size jexcelMerge(CellRef cellRef, Context context, JexcelTransformer transformer, int rows, int cols){
        try {
            transformer.getWritableWorkbook().getSheet(cellRef.getSheetName())
                    .mergeCells(
                            cellRef.getRow(),
                            cellRef.getCol(),
                            cellRef.getRow() + rows - 1 ,
                            cellRef.getCol() + cols - 1);
            area.applyAt(cellRef, context);
        } catch (WriteException e) {
            throw new IllegalArgumentException("合并单元格失败");
        }
        return new Size(cols, rows);
    }

    private static void setRegionStyle(CellStyle cs, CellRangeAddress region, Sheet sheet) {
        for (int i = region.getFirstRow(); i <= region.getLastRow(); i++) {
            Row row = sheet.getRow(i);
            if (row == null) {
                row = sheet.createRow(i);
            }for (int j = region.getFirstColumn(); j <= region.getLastColumn(); j++) {
                Cell cell = row.getCell(j);
                if (cell == null) {
                    cell = row.createCell(j);
                }
                if (cs == null){
                    cell.getCellStyle().setAlignment(CellStyle.ALIGN_CENTER);
                    cell.getCellStyle().setVerticalAlignment(CellStyle.VERTICAL_CENTER);
                }else {
                    cell.setCellStyle(cs);
                }
            }
        }
    }

    private int getVal(String expression, Context context){
        if(StringUtils.isNotBlank(expression)){
            Object obj = getTransformationConfig().getExpressionEvaluator().evaluate(expression, context.toMap());
            try {
                return Integer.parseInt(obj.toString());
            } catch (NumberFormatException e) {
                throw new IllegalArgumentException("表达式:" + expression + " 解析失败");
            }
        }
        return 0;
    }

    public String getCols() {
        return cols;
    }

    public void setCols(String cols) {
        this.cols = cols;
    }

    public String getRows() {
        return rows;
    }

    public void setRows(String rows) {
        this.rows = rows;
    }

    public String getMinCols() {
        return minCols;
    }

    public void setMinCols(String minCols) {
        this.minCols = minCols;
    }

    public String getMinRows() {
        return minRows;
    }

    public void setMinRows(String minRows) {
        this.minRows = minRows;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
1.添加依赖 在pom.xml文件中添加以下依赖: ``` <!-- Excel导出依赖 --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.0</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.1.0</version> </dependency> ``` 2.编写控制器 在控制器中编写导出Excel的方法: ``` @GetMapping("/export") public void export(HttpServletResponse response) throws IOException { // 1.创建工作簿 XSSFWorkbook workbook = new XSSFWorkbook(); // 2.创建工作表 XSSFSheet sheet = workbook.createSheet("用户信息"); // 3.创建行 XSSFRow row = sheet.createRow(0); // 4.创建单元格 XSSFCell cell = row.createCell(0); cell.setCellValue("用户名"); cell = row.createCell(1); cell.setCellValue("年龄"); cell = row.createCell(2); cell.setCellValue("性别"); // 5.写入数据 List<User> userList = userService.getUserList(); for (int i = 0; i < userList.size(); i++) { row = sheet.createRow(i + 1); User user = userList.get(i); row.createCell(0).setCellValue(user.getName()); row.createCell(1).setCellValue(user.getAge()); row.createCell(2).setCellValue(user.getGender()); } // 6.设置响应头 response.setContentType("application/octet-stream"); response.setHeader("Content-Disposition", "attachment;filename=userInfo.xlsx"); // 7.输出Excel OutputStream outputStream = response.getOutputStream(); workbook.write(outputStream); outputStream.flush(); outputStream.close(); } ``` 3.测试 启动SpringBoot应用,访问导出Excel的接口,即可下载Excel文件。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值