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

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

2、项目整体结构

3、下面就直接看代码

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请求的地址,这样在真实项目中根据地址就可以下载出来了。

4、下面是一个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;
    }

}

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

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

4、Excel导出打开出现问题的原因

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

错误提示

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

java使用freemarker导出复杂的excel表格的更多相关文章

  1. Java使用freemarker导出word和excel

    www.linxiaosheng.com/post/2013-12-05/40060346181 https://github.com/upyun/java-sdk

  2. Java操作Jxl实现导出数据生成Excel表格数据文件

    实现:前台用的框架是Easyui+Bootstrap结合使用,需要引入相应的Js.Css文件.页面:Jsp.拦截请求:Servlet.逻辑处理:ClassBean.数据库:SQLserver. 注意: ...

  3. java用freemarker导出数据到word(含多图片)

    一.制作word模版 新建word文档,按照需要设置好字体等各种格式:这里为了显得整齐使用了无边框的表格. 将word文档另存为xml文件(注意不是word xml文档,我吃了这家伙的大亏了) 然后用 ...

  4. 在ASP.NET Web Forms中使用页面导出伪xls Excel表格

    将数据导出为Excel表格是比较常见的需求,也有很多组件支持导出真正的Excel表格.由于Excel能打开HTML文件,并支持其中的table元素以及p之类的文本元素的显示,所以把.html扩展名改为 ...

  5. 导出数据到Excel表格

    开发工具与关键技术:Visual Studio 和 ASP.NET.MVC,作者:陈鸿鹏撰写时间:2019年5月25日123下面是我们来学习的导出数据到Excel表格的总结首先在视图层写导出数据的点击 ...

  6. spring boot 使用POI导出数据到Excel表格

    在spring boot 的项目经常碰到将数据导出到Excel表格的需求,而POI技术则对于java操作Excel表格提供了API,POI中对于多种类型的文档都提供了操作的接口,但是其对于Excel表 ...

  7. PHP批量导出数据为excel表格

    之前用插件phoexcel写过批量导入数据,现在用到了批量导出,就记录一下,这次批量导出没用插件,是写出一个表格,直接输出 //$teacherList 是从数据库查出来的二维数组 $execlnam ...

  8. php动态导出数据成Excel表格

    一.封装 Excel 导出类 include/components/ExecExcel.php <?php /*** * @Excel 导入导出类. */ class ExecExcel { / ...

  9. Python导出数据到Excel表格-NotImplementedError: formatting_info=True not yet implemented

    在使用Python写入数据到Excel表格中时出现报错信息记录:“NotImplementedError: formatting_info=True not yet implemented” 报错分析 ...

随机推荐

  1. android-tip-关于SurfaceView的使用

    1. SurfaceView的创建和销毁     当SurfaceView隐藏时,SurfaceView被销毁,此时会调用SurfaceHolder.Callback.surfaceDestroyed ...

  2. DBArtist之Oracle入门第3步: 安装配置PL/SQL Developer

    操作系统:            WINDOWS 7 (64位) 数据库:               Oracle 11gR2 (64位) PL/SQL Developer :    PL/SQL ...

  3. SpringMVC的问题No mapping found for HTTP request with URI

    做了一个屏蔽进数据库的操作: Applicaition.xml配置: <?xml version="1.0" encoding="UTF-8"?> ...

  4. JavaBugCharSequence

    目录 文章背景 目录 问题分析 问题解决 说明 参考文章 版本记录 文章背景 新建一个项目时候,不知道为什么,代码出现java.lang.CharSequence cannot be resolved ...

  5. 编写高质量代码改善C#程序的157个建议——建议89:在并行方法体中谨慎使用锁

    建议89:在并行方法体中谨慎使用锁 除了建议88所提到的场合,要谨慎使用并行的情况还包括:某些本身就需要同步运行的场合,或者需要较长时间锁定共享资源的场合. 在对整型数据进行同步操作时,可以使用静态类 ...

  6. 怎么用谷歌浏览器查看请求或响应HTTP头?

    要使用谷歌浏览器查看请求或响应HTTP标头,可以采取以下步骤: 在Chrome浏览器,访问一个网址,点击右键,选择检查,打开开发人员工具(或直接按F12). 选择 Network 选项卡. 重新加载页 ...

  7. 4、Semantic-UI之图标的使用

    4.1 图标的使用   在Semantic-UI中定义了很多的图标样式,这些图标样式可以通过官网查看名称(官网中名称首字母都是大写的,但是在实际使用中全部都是小写使用的): 实例:图标样式 定义基础图 ...

  8. 修改TomCat端口实现多实例

      TomCat默认的端口是8080,还会占用8005,8009和8443端口.如果已经启动了tomcat,再启动一个tomcat会发现这些端口已经被占用了,这个时候就需要修改端口号.   以apac ...

  9. vs项目属性中的包含目录和库目录以及附加依赖项全都配置正确了,却还是提示:无法解析的外部符号

    这种情况下,很大可能是lib文件有问题 我是用vs编译下载的源代码文件得到的lib出现了如题的情况, 后来去网站上直接下载了lib文件,竟然解决了!-.-

  10. Tomcat配置文件与启动顺序

    三个配置应用的位置: 1.conf目录下的server.xml文件:此方式为Eclipse默认配置方法,同时也是三种方式中优先级最高的. <?xml version="1.0" ...