Excel按照模板导出并下载

仅记录方法,如果使用中遇到问题,并不负责

一般来讲,导出关系型数据库的Excel,可以直接按照数据库中的格式导出,非常简单,之后会贴上简单格式导出的代码。
如果涉及到按照模板导出,仅靠java绘制一摸一样的模板型导出文档就十分麻烦了。

首先验证导出模板的Excel版本

         //获取文件名根据后缀名验证版本if(fileName.endsWith(xls)){//2003workbook = new HSSFWorkbook(is);}else if(fileName.endsWith(xlsx)){//2007 及2007以上workbook = new XSSFWorkbook(is);}
原文链接:https://blog.csdn.net/T_james/article/details/83302681
response.setContentType("application/vnd.ms-excel");
response.addHeader("Content-Disposition", "attachment;filename="+ URLEncoder.encode(fileName, "UTF-8") + ".xls");

根据请求路径响应回文件以供下载,加号中的导出文件名可以自己定义

public String exportBaseLineDataExcel(HttpServletRequest request, HttpServletResponse response,List<Debtmonthdetailsexcel> list,String deptname)

此处我为了使用简单,未将版本控制和构筑Excel文件的方法关联,具体方法可以加一个参数。

         //这个方法中添加版本验证,并将通过验证后的正确版本Excel对象传入构建方法,实现版本验证public checkVersion(HttpServletRequest request,fileName,Collection<T> dataset){// 1.读取已有的基线模板,通过获取项目相对路径找到模板ServletContext sc = request.getSession().getServletContext();String path=sc.getRealPath("/").toString()+"WEB-INF/"+"common/"+"fileTemplete/"+"债务月度调查明细.xls";XSSFWorkbook workbook = new XSSFWorkbook(fis);}

构建Excel的方法,可以具体为三步骤,

  1. Excel生成sheet(文档目录号)
  2. sheet生成row(行)
  3. row生成cell(列)
XSSFSheet hssfSheet = workbook.getSheetAt(0);
XSSFRow row = hssfSheet.getRow();
Cell cell = row.getCell();

这里就要注意了,导出Excel如果没有模板 ,从第一行第一列开始导出,没有问题,如果有模板,准确定位插入数据就是
关键。row和cell都是从0开始的

         //由于我的模板从第四行第五列开始插入所以预先定义两个值//向我这种有bean可以直接点对点的插入,如果需要插入的数据过多可以考虑循环参数//之所以循环三次是应为前三行之后有一行为模板行不用插入数据,之后的插入行列也要重新定位位置int a = 4;int c = 4;for (int aa = 0; aa < 3 ;aa++) {Debtmonthdetailsexcel ex = list.get(aa);XSSFRow row = hssfSheet.getRow(c);Cell cell = row.getCell(a+1);cell.setCellValue(ex.getYearearlyba().toString());Cell cell2 = row.getCell(a+2);cell2.setCellValue(ex.getStaearlyba().toString());Cell cell3 = row.getCell(a+3);cell3.setCellValue(ex.getMonthadd().toString());Cell cell4 = row.getCell(a+4);cell4.setCellValue(ex.getMonthsub().toString());Cell cell5 = row.getCell(a+5);cell5.setCellValue(ex.getStaendba().toString());Cell cell6 = row.getCell(a+6);cell6.setCellValue(ex.getCapital().toString());Cell cell7 = row.getCell(a+7);cell7.setCellValue(ex.getInterest().toString());Cell cell8 = row.getCell(a+8);cell8.setCellValue(ex.getCapoverdue().toString());Cell cell9 = row.getCell(a+9);cell9.setCellValue(ex.getIntoverdue().toString());a = 4;c = c + 1;}

这是我的前三行的构建代码,为前三行插入从数据库中拿到的值
传入的参数可以根据具体需求和情况修改 ,之前代码中有写传入的map和list的父类,由于大多数查出的数据基本为这两类,所以可以直接传入。

         OutputStream out = response.getOutputStream();workbook.write(out);out.close();

最后将构建好的文件写入响应流,关闭。由于设置了响应方式,controller中不需要对返回值再次处理。

附无模板导出:
ps:这个无模板导出是我从别处大神c过来的,可以参数传对了就可以直接使用
另:此为2007版本 2003只用把Excel对象修改为2003即可。上面有03对象名

//titile (文件名),headers(第一行列头,可以自己定义,与数据一一对应),out从response中获取响应对象
//pattern 时间类型显示格式 例 "yyyy-MM-dd HH:mm:ss"
public void exportExcel2007(String title, String[] headers, Collection<T> dataset, OutputStream out, String pattern) {// 声明一个工作薄XSSFWorkbook workbook = new XSSFWorkbook();// 生成一个表格XSSFSheet sheet = workbook.createSheet(title);// 设置表格默认列宽度为15个字节sheet.setDefaultColumnWidth(20);// 生成一个样式XSSFCellStyle style = workbook.createCellStyle();// 设置这些样式style.setFillForegroundColor(new XSSFColor(java.awt.Color.BLUE));style.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);style.setBorderBottom(XSSFCellStyle.BORDER_THIN);style.setBorderLeft(XSSFCellStyle.BORDER_THIN);style.setBorderRight(XSSFCellStyle.BORDER_THIN);style.setBorderTop(XSSFCellStyle.BORDER_THIN);style.setAlignment(XSSFCellStyle.ALIGN_CENTER);// 生成一个字体XSSFFont font = workbook.createFont();font.setBoldweight(XSSFFont.BOLDWEIGHT_BOLD);font.setFontName("宋体"); font.setColor(new XSSFColor(java.awt.Color.BLACK));font.setFontHeightInPoints((short) 11);// 把字体应用到当前的样式style.setFont(font);// 生成并设置另一个样式XSSFCellStyle style2 = workbook.createCellStyle();style2.setFillForegroundColor(new XSSFColor(java.awt.Color.WHITE));style2.setFillPattern(XSSFCellStyle.SOLID_FOREGROUND);style2.setBorderBottom(XSSFCellStyle.BORDER_THIN);style2.setBorderLeft(XSSFCellStyle.BORDER_THIN);style2.setBorderRight(XSSFCellStyle.BORDER_THIN);style2.setBorderTop(XSSFCellStyle.BORDER_THIN);style2.setAlignment(XSSFCellStyle.ALIGN_CENTER);style2.setVerticalAlignment(XSSFCellStyle.VERTICAL_CENTER);// 生成另一个字体XSSFFont font2 = workbook.createFont();font2.setBoldweight(XSSFFont.BOLDWEIGHT_NORMAL);// 把字体应用到当前的样式style2.setFont(font2);// 产生表格标题行XSSFRow row = sheet.createRow(0);XSSFCell cellHeader;for (int i = 0; i < headers.length; i++) {cellHeader = row.createCell(i);cellHeader.setCellStyle(style);cellHeader.setCellValue(new XSSFRichTextString(headers[i]));}// 遍历集合数据,产生数据行Iterator<T> it = dataset.iterator();int index = 0;T t;Field[] fields;Field field;XSSFRichTextString richString;Pattern p = Pattern.compile("^//d+(//.//d+)?$");Matcher matcher;String fieldName;String getMethodName;XSSFCell cell;Class tCls;Method getMethod;Object value;String textValue;SimpleDateFormat sdf = new SimpleDateFormat(pattern);while (it.hasNext()) {index++;row = sheet.createRow(index);t = (T) it.next();// 利用反射,根据JavaBean属性的先后顺序,动态调用getXxx()方法得到属性值fields = t.getClass().getDeclaredFields();for (int i = 0; i < fields.length; i++) {cell = row.createCell(i);cell.setCellStyle(style2);field = fields[i];fieldName = field.getName();getMethodName = "get" + fieldName.substring(0, 1).toUpperCase()+ fieldName.substring(1);try {tCls = t.getClass();getMethod = tCls.getMethod(getMethodName, new Class[] {});value = getMethod.invoke(t, new Object[] {});// 判断值的类型后进行强制类型转换textValue = null;if (value instanceof Integer) {cell.setCellValue((Integer) value);} else if (value instanceof Float) {textValue = String.valueOf((Float) value);cell.setCellValue(textValue);} else if (value instanceof Double) {textValue = String.valueOf((Double) value);cell.setCellValue(textValue);} else if (value instanceof Long) {cell.setCellValue((Long) value);}if (value instanceof Boolean) {textValue = "是";if (!(Boolean) value) {textValue = "否";}} else if (value instanceof Date) {textValue = sdf.format((Date) value);} else {// 其它数据类型都当作字符串简单处理if (value != null) {textValue = value.toString();}}if (textValue != null) {matcher = p.matcher(textValue);if (matcher.matches()) {// 是数字当作double处理cell.setCellValue(Double.parseDouble(textValue));} else {richString = new XSSFRichTextString(textValue);cell.setCellValue(richString);}}} catch (SecurityException e) {e.printStackTrace();} catch (NoSuchMethodException e) {e.printStackTrace();} catch (IllegalArgumentException e) {e.printStackTrace();} catch (IllegalAccessException e) {e.printStackTrace();} catch (java.lang.reflect.InvocationTargetException e) {// TODO Auto-generated catch blocke.printStackTrace();} finally {// 清理资源}}}try {workbook.write(out);} catch (IOException e) {e.printStackTrace();}}

Excel按照模板导出并下载相关推荐

  1. POI之excel固定模板导出

    POI之excel固定模板导出 一.简介 二.excel模板 三.项目中maven依赖 四.Excel模板操作代码 五.Controller层excel模板导出接口代码 六.导出excel 一.简介 ...

  2. 模板导出,浏览器下载

    目录 自己总结的excel空模板导出 1.ExcelUtil 2.在controller层 3.样例参考: 自己总结的excel空模板导出 1.ExcelUtil 这里没有设置任何的样式 packag ...

  3. poi导出Excel之模板导出

    模板导出 实现流程1.自定义excel模板,放到Springboot的resource路径下,程序按照excel的路径将Excel读取成workbook流, 2.给单元格赋值,我们知道模板长什么样子, ...

  4. Laravel Excel文件模板导出

    这篇主要描述如何从模板中导出的内容,如果不想使用模板 可参考Laravel Excel 3.1 导出_json_li的博客-CSDN博客 目录 创建导出模型 创建模板文件 控制器中调用 1.激活下载窗 ...

  5. JXLS导出Excel(模板导出)

    1.导包 在pom.xml中加入依赖如下: <dependency><groupId>org.jxls</groupId><artifactId>jxl ...

  6. java实现excel的模板导出

    映入pom依赖: <dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml& ...

  7. php下载excel文件模板文件,PHP下载excel文件变得腐败

    我有一个excel文件,我希望用户能够从我的服务器下载.我在这里看了很多问题,但我找不到正确下载没有腐败的文件的方法.我假设它是标题但我还没有它们的工作组合.这就是我现在所拥有的,在我收到的损坏文件中 ...

  8. excel动态模板导出

    导入maven jar <dependency><groupId>org.apache.poi</groupId><artifactId>poi< ...

  9. springboot+poi开发excel导出 加载Excel模板导出 Excel批量导出详解

    提到Excel导出功能,可能很多人都使用springmvc框架做过,笔者今天要给大家分享的是基于springBoot开发Excel复杂模板导出功能(所谓复杂模板指在模板里的特定表头里有不同的单元格合并 ...

最新文章

  1. Python中的matplotlib xticks
  2. 来自Riot 的一份游戏美术教程(五):技术美术
  3. PHP动态多文件上传的具体代码
  4. 修改浏览器下拉条颜色和粗细
  5. 取两堆石子(威佐夫博弈)
  6. php源码怎样安装mysql_Linux下源码包安装mysql、apache以及php
  7. SQLite指南(0) 表和索引的文件存储结构
  8. frdora10_a8_linux,硬盘安装fedora10
  9. ACM-百度之星资格赛之Energy Conversion——hdu4823
  10. FPGA经典设计思想
  11. dell服务器配置信息,DELL服务器配置(710)
  12. 有奖互动 | 感恩节福利放送中
  13. C#-钉钉开发H5应用-事件订阅
  14. Lipschitz连续,一致连续
  15. SQL SEVER登录失败,无法连接服务器或已成功与服务器建立连接,但是在登录过程中发生错误。(Win10版本,SQL 2019)
  16. 易推影视推手系统,支持苹果v8 v10影视系统
  17. MQTT-java使用说明
  18. Line-line Intersection
  19. 有哪些好的习惯值得培养
  20. 饥荒控制台指令【转自Steam社区】

热门文章

  1. 永宏plc的ip通信转接模块,能ping通了,却无法建立modbus tcp连接的问题解决
  2. Hadoop获取namenode的命令
  3. [办公软件教程] Excel迷你图在哪里?Excel迷你图怎么设置
  4. 定个小目标:一月一万行代码3
  5. 今日小程序推荐:熊猫签证-足不出户办签证
  6. html js实现跳转页面,js跳转页面方法实现汇总
  7. 电脑表格日期怎么修改原有日期_如何修改电子档案资料里的显示日期
  8. 智能家居市场发展困境
  9. vue-chartjs使用教程
  10. java歌唱比赛冠亚军_歌手历届冠军盘点 这是一档歌唱竞演类真人秀节目