正常导出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. 【简报】创建线框结构的PDF格式草图表
  2. Python的regex模块——更强大的正则表达式引擎
  3. 七夕节,程序员们都怎么哄女朋友开心?
  4. IOS15仿地铁我的页面
  5. 【HDU - 2398 】Savings Account (水题模拟)
  6. extjs 月份选择控件_ExtJs日期控件案例(可控制时间的选择) | 学步园
  7. SAP License:对虚拟利润中心的几点认识
  8. struts2.0+spring intercepter 不能注入属性
  9. ImportError : No module named graphics
  10. (一)Redis初学教程之安装篇
  11. 产品经理有话说——产品汪成长记(入职)
  12. 幸运红包娱乐微信小程序源码下载-多玩法安装简单
  13. “变速齿轮”研究手记
  14. 做后期必备!500组HDR贴图分享与使用方法讲解
  15. 泡泡龙游戏开发系列教程(六)
  16. Peer-to-Peer Sockets 工程入门
  17. 大数据开发学习脑图+学习路线清晰的告诉你!月薪50K很轻松
  18. 布隆过滤器之误识别率FPP公式的推导
  19. 第四章 web前端开发工程师--JavaScript京东商城项目开发 4-2 京东商城导航栏
  20. JAVA 单张牌出牌逻辑 实现斗地主

热门文章

  1. 猴子摘桃问题的C++解决
  2. denny的学习专栏——徐其华——tensorflow
  3. 数字视频编辑工具Adobe Premiere Pro for Mac 15.2.0
  4. scrollTop滚动的时候一直是0
  5. 橘子皮除甲醛,您被骗了多少年?除醛方法一箩筐,靠谱的才管用!
  6. CGB2102-京淘项目day04
  7. cgb2008-京淘day10
  8. 51单片机——DS1302时钟
  9. 在线翻译泄露:再次证明数据泄密无处不在
  10. 微信小程序 运行环境加载失败