正常导出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 map = new HashMap();

// 模板所在的路径

map.put("tempFoldPath", path);

// 生成的路径

map.put("file", path + "/采购订单.xls");

// 模板名称

map.put("tampPath", "采购订单.ftl");

// 最后生成的表格的名称

map.put("excelName", "采购订单-" + "Demo" + ".xls");

// 封装数据

Map exlParam = new HashMap<>();

exlParam.put("findList", new Data().list());

// 调用方法,返回浏览器访问的地址

String downloadUrl = ExportExcelUtil.exportExcel(map, exlParam);

}

// 自己造假数据,正常来说都是从数据库查询出来拼装数据的

public List list() {

List 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 map, Map 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这个值设置和行数相等或者设置大一点就不会出现这种问题了。

错误提示

java导出复杂excel表格_java使用freemarker导出复杂的excel表格相关推荐

  1. java循环导出word文档_Java使用freemarker导出word文档

    通过freemarker,以及JAVA,导出word文档. 共分为三步: 第一步:创建模板文件 第二步:通过JAVA创建返回值. 第三步:执行 分别介绍如下: 第一步: 首先创建word文档,按照想要 ...

  2. java freemarker 图片_java通过freemarker导出包含富文本图片的word文档

    废话不多说,进入正题! 本文重点在于:对富文本图片的导出(基础的freemarker+word模板导出这里不做详细解说哈) (ps:大神的东西太深奥~~懵逼了 一周才搞定,为了方便后来在更加简单,清晰 ...

  3. java word导出表格_Java Word模板导出包含表格单元格合并

    java通过freemarker导出word循环合并表格单元格 本文主要讲解通过freemarker模板引擎来导出word,并且在word中包含表格的合并部分需要循环生成. 一.Java需要通过模板导 ...

  4. java excel 透视_java基于poi导出excel透视表代码实例

    这篇文章主要介绍了java基于poi导出excel透视表代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 从前,我是一个前端程序猿,怀着对打通 ...

  5. java怎么导出有模板的表格_java用模板导出数据表格-Go语言中文社区

    1.创建表格: 2.编写导出的controller; @PostMapping("/cust/report/customer/export") public void export ...

  6. java poi 读取excel 编码_Java使用POI 读取和写入Excel指南

    做项目时经常有通过程序读取Excel数据,或是创建新的Excel并写入数据的需求:网上很多经验教程里使用的POI版本都比较老了,一些API在新版里已经废弃,这里基于最新的Apache POI 4.0. ...

  7. java excel 批注_Java 添加、读取和删除 Excel 批注的操作代码

    批注是一种富文本注释,常用于为指定的Excel单元格添加提示或附加信息. Free Spire.XLS for Java为开发人员免费提供了在Java应用程序中对Excel文件添加和操作批注的功能. ...

  8. java删除word中批注_Java 添加、读取和删除 Excel 批注的操作代码

    批注是一种富文本注释,常用于为指定的Excel单元格添加提示或附加信息. Free Spire.XLS for Java为开发人员免费提供了在Java应用程序中对Excel文件添加和操作批注的功能. ...

  9. java io导出excel表格_Java IO 导入导出Excel表格

    1.将excel导入到内存 1. 调用工作簿Workbook的静态方法getWorkbook(),获得工作簿Workbook对象 InputStream in = new FileInputStrea ...

最新文章

  1. js文件的装载和执行
  2. java设计模式---工厂方法模式
  3. VMware ESX 主机的网卡负载均衡配置3种方法
  4. Spring cloud整合zookeeper
  5. Linux下怎样安装tomcat,Linux下安装Tomcat的步骤是怎样的?
  6. c html联调,JS与native 交互简单应用
  7. linux spi驱动分析 三,Linux下SPI驱动分析
  8. laravel 集成采集_新版2020 Laravel采集网站程序
  9. oracle数据库sql的执行过程,Oracle体系结构之SQL语句的执行过程
  10. Python相关的考试和认证
  11. 2020中关村论坛百度平行论坛:探索中国AI开源与产业智能化模式
  12. LeetCode Maximum Product Subarray 解题报告
  13. 伴随矩阵例题_§6_伴随矩阵及习题_精品.ppt
  14. android ViewBinding
  15. 数据挖掘——航空公司客户价值分析(分析+建模)
  16. Kotlin协程实现原理
  17. visual 创建c语言程序吗,visual studio怎么创建c语言
  18. OpenGL(QT平台)学习与实战(一)
  19. 使用电脑修改apk图标和名字
  20. js颜色 RGB 和 16进制转换

热门文章

  1. MongoDB数据库的密码和权限问题
  2. 快速理解宽带调频中的贝塞尔函数
  3. js 时间戳转日期(可直接复制)
  4. ADC0808/ADC0809引脚图及功能和工作原理介绍
  5. 护士岗前培训心得范文
  6. Matlab cnt是什么意思,cnt是什么意思
  7. linux 文件打包 tar,[技术]Linux文件打包tar命令详解
  8. 侯捷C++课程笔记03: STL标准库与泛型编程
  9. MySQL讲义第 31 讲—— DML 语句与 select 查询
  10. 使用Axure RP 8 的使用心得