• java使用freemarker导出复杂的excel表格


    正常导出excel表格使用的poi,但是导出复杂的excel有点困难,但是可以使用freemaker模板来导出复杂的excel。

    • 都是先生成一个Excel表格的模板,最好是增加一行数据。具体看图里面的步骤。

    • 项目整体结构

    • 下面就直接看代码

    public class Data {
    //代码复制之后直接就可以运行了
        public static void main(String[] args) {
            demo();
        }
    
        public static void demo() {
            // 项目下的template路径
            String path = new File("").getAbsolutePath() + "\template";
            Map<String, Object> map = new HashMap<String, Object>();
            // 模板所在的路径
            map.put("tempFoldPath", path);
            // 生成的路径
            map.put("file", path + "/采购订单.xls");
            // 模板名称
            map.put("tampPath", "采购订单.ftl");
            // 最后生成的表格的名称
            map.put("excelName", "采购订单-" + "Demo" + ".xls");
            // 封装数据
            Map<String, Object> exlParam = new HashMap<>();
            exlParam.put("findList", new Data().list());
            // 调用方法,返回浏览器访问的地址
            String downloadUrl = ExportExcelUtil.exportExcel(map, exlParam);
        }
    
        // 自己造假数据,正常来说都是从数据库查询出来拼装数据的
        public List<Purbill> list() {
            List<Purbill> purbillList = new ArrayList<>();
            purbillList.add(new Purbill("1", "2", "名称", "采购名称", "规格参数", "参数指标", "场地", "10吨", 10, 20.2, 220.2, "品牌"));
            return purbillList;
        }
    
    }
    
    class Purbill {
        private String bidId;
        private String billno;
        private String categoryName;
        private String purname;
        private String specparams;
        private String paramnorm;
        private String productAddress;
        private String unit;
        private Integer nums;
        private Double price;
        private Double totalprice;
        private String brand;
    
        public Purbill(String bidId, String billno, String categoryName, String purname, String specparams,
                String paramnorm, String productAddress, String unit, Integer nums, Double price, Double totalprice,
                String brand) {
            super();
            this.bidId = bidId;
            this.billno = billno;
            this.categoryName = categoryName;
            this.purname = purname;
            this.specparams = specparams;
            this.paramnorm = paramnorm;
            this.productAddress = productAddress;
            this.unit = unit;
            this.nums = nums;
            this.price = price;
            this.totalprice = totalprice;
            this.brand = brand;
        }
    
        public String getBidId() {
            return bidId;
        }
    
        public void setBidId(String bidId) {
            this.bidId = bidId;
        }
    
        public String getBillno() {
            return billno;
        }
    
        public void setBillno(String billno) {
            this.billno = billno;
        }
    
        public String getCategoryName() {
            return categoryName;
        }
    
        public void setCategoryName(String categoryName) {
            this.categoryName = categoryName;
        }
    
        public String getPurname() {
            return purname;
        }
    
        public void setPurname(String purname) {
            this.purname = purname;
        }
    
        public String getSpecparams() {
            return specparams;
        }
    
        public void setSpecparams(String specparams) {
            this.specparams = specparams;
        }
    
        public String getParamnorm() {
            return paramnorm;
        }
    
        public void setParamnorm(String paramnorm) {
            this.paramnorm = paramnorm;
        }
    
        public String getProductAddress() {
            return productAddress;
        }
    
        public void setProductAddress(String productAddress) {
            this.productAddress = productAddress;
        }
    
        public String getUnit() {
            return unit;
        }
    
        public void setUnit(String unit) {
            this.unit = unit;
        }
    
        public Integer getNums() {
            return nums;
        }
    
        public void setNums(Integer nums) {
            this.nums = nums;
        }
    
        public Double getPrice() {
            return price;
        }
    
        public void setPrice(Double price) {
            this.price = price;
        }
    
        public Double getTotalprice() {
            return totalprice;
        }
    
        public void setTotalprice(Double totalprice) {
            this.totalprice = totalprice;
        }
    
        public String getBrand() {
            return brand;
        }
    
        public void setBrand(String brand) {
            this.brand = brand;
        }
    
    }
    

    主要是两个map,一个map是封装模板的位置和生成表格的位置,第二个map是封装的数据。正常来说导出表格之后都是返回url请求的地址,这样在真实项目中根据地址就可以下载出来了。

    • 下面是一个excel导出的一个工具类
    public class ExportExcelUtil {
    
        public static String exportExcel(Map<String, Object> map, Map<String, Object> exlParam) {
            Template dateTmp = null;
            Writer fw = null;
            InputStream in = null;
            OutputStream out = null;
            try {
                // 此处需要给你个版本信息,Configuration cfg = new Configuration();这个方法已经过时了
                Configuration cfg = new Configuration(Configuration.VERSION_2_3_28);
                String tempFoldPath = (String) map.get("tempFoldPath"); // 模板所在的路径
                String file = (String) map.get("file");// 生成表格模板的路径
                String tampPath = (String) map.get("tampPath");// 模板名称
                String excelName = (String) map.get("excelName");// 最后生成表格的名称
    
                // **********初始化参数**********
                File tempFoldFile = new File(tempFoldPath);
                if (!tempFoldFile.exists()) {
                    tempFoldFile.mkdirs();
                }
                cfg.setDirectoryForTemplateLoading(tempFoldFile);
                cfg.setDefaultEncoding("UTF-8");
                cfg.setTemplateUpdateDelay(0);
                cfg.setTemplateExceptionHandler(TemplateExceptionHandler.RETHROW_HANDLER);
                // **********获取freemaker模板**********
                dateTmp = cfg.getTemplate(tampPath);
    
                // **********将数据写入freemaker模板**********
                fw = new BufferedWriter(new OutputStreamWriter(new FileOutputStream(new File(file)), "UTF-8"));
                dateTmp.process(exlParam, fw);
    
                // **********从freemaker模板读出数据写到Excel表格并生成出来**********
                String fileDir = "excel";
                // 文件保存目录  项目目录下面
                String filePath =  new File("").getAbsolutePath();
                // 生成保存文件路径
                String createPath = filePath + "/" + fileDir + "/";
                // 构建源文件
                File files = new File(file);
                // 文件夹不存在就创建
                createFolder(createPath);
                // 删除原来的文件
                deleteFile(createPath + excelName);
                // 构建目标文件
                File fileCopy = new File(createPath + excelName);
                // 目标文件不存在就创建
                if (!(fileCopy.exists())) {
                    fileCopy.createNewFile();
                }
                // 源文件创建输入流
                in = new FileInputStream(files);
                // 目标文件创建输出流
                out = new FileOutputStream(fileCopy, true);
                // 创建字节数组
                byte[] temp = new byte[1024];
                int length = 0;
                // 源文件读取一部分内容
                while ((length = in.read(temp)) != -1) {
                    // 目标文件写入一部分内容
                    out.write(temp, 0, length);
                }
                // 资源服务器访问目录 这边需要配置tomcat的虚拟路径,就可以直接在url上面下载表格了
                String serverPath = "resourceServer";
                String savePath = "/" + serverPath + "/" + fileDir + "/" + excelName;
                // 服务器图片访问目录
                return savePath;
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            } finally {
                try {
                    fw.close();
                    // 关闭文件输入输出流
                    in.close();
                    out.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
    
            }
    
        }
    
        // 创建文件
        public static boolean createFolder(String path) {
            File file = new File(path);
            if (!file.exists()) {
                return file.mkdir();
            } else {
                return true;
            }
        }
    
        public static boolean deleteFile(String filePath) {// 删除单个文件
            boolean flag = false;
            File file = new File(filePath);
            if (file.exists() && file.isFile()) {
                file.delete();// 文件删除
                flag = true;
            }
            return true;
        }
    
    }
    

    这个也不用多说,里面注释基本上已经解释清楚了,

    • 因为数据放到freemaker模板里面了所以只需要使用freemaker模板的语法取出数据存放在模板里面就可以了

    • Excel导出打开出现问题的原因
      当office2010之前的版本打开会出现格式不正确的提示,然后点击确定之后还是报格式错误或者可以打开但是没有数据,这种解决方法只需要将ss:ExpandedRowCount这个值设置和行数相等或者设置大一点就不会出现这种问题了。

      错误提示

      Demo地址:https://files.cnblogs.com/files/yangk1996/FreeMaker.zip

  • 相关阅读:
    项目延期原因及应对之道
    我只是来刷屏的
    php学习1留言板的创建
    位运算
    hnu 12264 collisions
    数组和指针的区别
    hnu12263 Gluttonous robot
    解决Mac上安装Zookeeper问题:FAILED TO WRITE PID
    Dubbo问题记录:No provider available for the service xxx from registry localhost:9090
    SqlServer和mysql的日期函数备忘
  • 原文地址:https://www.cnblogs.com/yangk1996/p/12651232.html
Copyright © 2020-2023  润新知