Java根据模板创建excel文件

Java后端按照模板自动导出excel功能实现并合并多个页签 本文主要是通过使用XLSTransformer与Apache POI库实现按照模板进行excel文件的导出功能。XLSTransformer是一种模板引擎(是JXLS库的一部分),它能够根据预定义的Excel模板文件以及传入的数据进行动态填充。这意味着它可以查找并替换模板中的特定标记(例如${list.xxx}),用实际数据填充这些位置。Apache POI库的Workbook对象是一个用于处理Microsoft Office格式文件的Java API,尤其是这里用来操作Excel工作簿。 阅读详情

1.首先导入xml文件,src下建包xml,将student.xml文件放入此文件夹中


[html]  view plain  copy
  1. <excel id="student" code="student" name="学生信息导入">  
  2.     <colgroup>  
  3.         <col index="A" width='17em'></col>  
  4.         <col index="B" width='17em'></col>  
  5.         <col index="C" width='17em'></col>  
  6.         <col index="D" width='17em'></col>  
  7.         <col index="E" width='17em'></col>  
  8.         <col index="F" width='17em'></col>          
  9.     </colgroup>  
  10.     <title>  
  11.         <tr height="16px">  
  12.             <td rowspan="1" colspan="6" value="学生信息导入" />  
  13.         </tr>  
  14.     </title>  
  15.     <thead>  
  16.         <tr height="16px">  
  17.             <th value="编号" />  
  18.             <th value="姓名" />  
  19.             <th value="年龄" />  
  20.             <th value="性别" />  
  21.             <th value="出生日期" />  
  22.             <th value=" 爱好" />              
  23.         </tr>  
  24.     </thead>  
  25.     <tbody>  
  26.         <tr height="16px" firstrow="2" firstcol="0" repeat="5">  
  27.             <td type="string" isnullable="false" maxlength="30" /><!--用户编号 -->  
  28.             <td type="string" isnullable="false" maxlength="50" /><!--姓名 -->  
  29.             <td type="numeric" format="##0" isnullable="false" /><!--年龄 -->  
  30.             <td type="enum" format="男,女" isnullable="true" /><!--性别 -->  
  31.             <td type="date" isnullable="false" maxlength="30" /><!--出生日期 -->  
  32.             <td type="enum" format="足球,篮球,乒乓球" isnullable="true" /><!--爱好 -->  
  33.         </tr>  
  34.     </tbody>  

2.导入架包

1)commons-lang3-3.1.jar

2)jdom.jar

3)commons-io-2.2.jar

4)poi-3.11-20141221.jar


3.创建测试类

1)sax解析xml文件

[java]  view plain  copy
  1. //获取解析xml文件路径  
  2.         String path = System.getProperty("user.dir") + "/xml/student.xml";  
  3.         File file = new File(path);  
  4.         SAXBuilder builder = new SAXBuilder();  
  5.         //解析xml文件  
  6.         Document parse = builder.build(file);  


2)创建excel

[java]  view plain  copy
  1. //创建Excel  
  2.         HSSFWorkbook wb = new HSSFWorkbook();  
  3.         //创建sheet  
  4.         HSSFSheet sheet = wb.createSheet("Sheet0");  


3)从xml文件中取值

[java]  view plain  copy
  1. //获取xml文件跟节点  
  2.         Element root = parse.getRootElement();  
  3.         //获取模板名称  
  4.         String templateName = root.getAttribute("name").getValue();  

4)设置excel列宽

[java]  view plain  copy
  1. int rownum = 0;  
  2.         int column = 0;  
  3.         //设置列宽  
  4.         Element colgroup = root.getChild("colgroup");  
  5.         setColumnWidth(sheet,colgroup);  
  6.         此处设置列宽,将其封装成一个方法  
  7.     private static void setColumnWidth(HSSFSheet sheet, Element colgroup) {  
  8.         List<Element> cols = colgroup.getChildren("col");  
  9.         for (int i = 0; i < cols.size(); i++) {  
  10.             Element col = cols.get(i);  
  11.             //获取col的设置  
  12.             Attribute width = col.getAttribute("width");  
  13.             //正则表达式截取字符串,获取xml中列的单位  
  14.             String unit = width.getValue().replaceAll("[0-9,\\.]", "");  
  15.             //获取宽度值  
  16.             String value = width.getValue().replaceAll(unit, "");  
  17.             int v=0;  
  18.             //poi宽度转化为excel宽度  
  19.             if(StringUtils.isBlank(unit) || "px".endsWith(unit)){  
  20.                 //空或者px单位的宽度转换为excel宽度  
  21.                 v = Math.round(Float.parseFloat(value) * 37F);  
  22.                 //em单位的宽度转换为excel宽度  
  23.             }else if ("em".endsWith(unit)){  
  24.                 v = Math.round(Float.parseFloat(value) * 267.5F);  
  25.             }  
  26.             sheet.setColumnWidth(i, v);  
  27.         }  
  28.     }  

5)设置标题
[java]  view plain  copy
  1. Element title = root.getChild("title");  
  2.             List<Element> trs = title.getChildren("tr");  
  3.             for (int i = 0; i < trs.size(); i++) {  
  4.                 Element tr = trs.get(i);  
  5.                 List<Element> tds = tr.getChildren("td");  
  6.                 HSSFRow row = sheet.createRow(rownum);  
  7.                 for(column = 0;column <tds.size();column ++){  
  8.                     Element td = tds.get(column);  
  9.                     //创建单元格  
  10.                     HSSFCell cell = row.createCell(column);  
  11.                     Attribute rowSpan = td.getAttribute("rowspan");  
  12.                     Attribute colSpan = td.getAttribute("colspan");  
  13.                     Attribute value = td.getAttribute("value");  
  14.                     if(value !=){  
  15.                         String val = value.getValue();  
  16.                         cell.setCellValue(val);  
  17.                         int rspan = rowSpan.getIntValue() - 1;  
  18.                         int cspan = colSpan.getIntValue() -1;  
  19.                         //合并单元格居中   (开始行,结束行,开始列,结束列)                         
  20.                         sheet.addMergedRegion(new CellRangeAddress(rspan, rspan, 0, cspan));  
  21.                     }  
  22.                 }  
  23.                 rownum ++;  
  24.             }  

6)设置单元格样式

[java]  view plain  copy
  1. HSSFCellStyle cellStyle = wb.createCellStyle();  
  2.                 //居中  
  3.                 cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);  
  4.                 //设置字体  
  5.                         HSSFFont font = wb.createFont();  
  6.                         font.setFontName("仿宋_GB2312");  
  7.                         font.setBoldweight(HSSFFont.BOLDWEIGHT_BOLD);//字体加粗  
  8. //                      font.setFontHeight((short)12);//设置高度  
  9.                         font.setFontHeightInPoints((short)12);  
  10.                         //将字体加入样式中  
  11.                         cellStyle.setFont(font);  
  12.                         //设置单元格样式  
  13.                         cell.setCellStyle(cellStyle);  


7)设置表头

[java]  view plain  copy
  1. Element thead = root.getChild("thead");  
  2.             trs = thead.getChildren("tr");  
  3.             //循环得到节点信息  
  4.             for (int i = 0; i < trs.size(); i++) {  
  5.                 Element tr = trs.get(i);  
  6.                 //创建excel行  
  7.                 HSSFRow row = sheet.createRow(rownum);  
  8.                 //获取节点信息  
  9.                 List<Element> ths = tr.getChildren("th");  
  10.                 //循环列  
  11.                 for(column = 0;column < ths.size();column++){  
  12.                     //元素  
  13.                     Element th = ths.get(column);  
  14.                     //属性值  
  15.                     Attribute valueAttr = th.getAttribute("value");  
  16.                     HSSFCell cell = row.createCell(column);  
  17.                     if(valueAttr != ){  
  18.                         String value =valueAttr.getValue();  
  19.                         //单元格赋值  
  20.                         cell.setCellValue(value);  
  21.                     }  
  22.                 }  
  23.                 rownum++;  
  24.             }  


8)设置区域样式

[java]  view plain  copy
  1. //设置数据区域样式  
  2.             Element tbody = root.getChild("tbody");  
  3.             Element tr = tbody.getChild("tr");  
  4.             //repeat:初始化行数  
  5.             int repeat = tr.getAttribute("repeat").getIntValue();  
  6.               
  7.             List<Element> tds = tr.getChildren("td");  
  8.             for (int i = 0; i < repeat; i++) {  
  9.                 HSSFRow row = sheet.createRow(rownum);  
  10.                 for(column =0 ;column < tds.size();column++){  
  11.                     Element td = tds.get(column);  
  12.                     HSSFCell cell = row.createCell(column);  
  13.                     setType(wb,cell,td);  
  14.                 }  
  15.                 rownum++;  
  16.             }  
  17.   
  18.   
  19.             设置属性及样式封装的方法  
  20.     private static void setType(HSSFWorkbook wb, HSSFCell cell, Element td) {  
  21.         Attribute typeAttr = td.getAttribute("type");  
  22.         String type = typeAttr.getValue();  
  23.         HSSFDataFormat format = wb.createDataFormat();  
  24.         HSSFCellStyle cellStyle = wb.createCellStyle();  
  25.         //判断节点类型  
  26.         //数字类型  
  27.         if("NUMERIC".equalsIgnoreCase(type)){  
  28.             cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);  
  29.             Attribute formatAttr = td.getAttribute("format");  
  30.             String formatValue = formatAttr.getValue();  
  31.             //如果不为空赋值,为空赋初始值  
  32.             formatValue = StringUtils.isNotBlank(formatValue)? formatValue : "#,##0.00";  
  33.             cellStyle.setDataFormat(format.getFormat(formatValue));  
  34.         //字符串类型  
  35.         }else if("STRING".equalsIgnoreCase(type)){  
  36.             cell.setCellValue("");  
  37.             cell.setCellType(HSSFCell.CELL_TYPE_STRING);  
  38.             //格式化 @表示文本  
  39.             cellStyle.setDataFormat(format.getFormat("@"));  
  40.         //日期类型  
  41.         }else if("DATE".equalsIgnoreCase(type)){  
  42.             cell.setCellType(HSSFCell.CELL_TYPE_NUMERIC);  
  43.             cellStyle.setDataFormat(format.getFormat("yyyy-m-d"));  
  44.         //枚举类型  
  45.         }else if("ENUM".equalsIgnoreCase(type)){  
  46.             CellRangeAddressList regions =   
  47.             //方法参数(开始行,结束行,开始列,结束列)  
  48.                 new CellRangeAddressList(cell.getRowIndex(), cell.getRowIndex(),   
  49.                         cell.getColumnIndex(), cell.getColumnIndex());  
  50.             Attribute enumAttr = td.getAttribute("format");  
  51.             String enumValue = enumAttr.getValue();  
  52.             //加载下拉列表内容  
  53.             DVConstraint constraint =   
  54.             //方法参数(下拉列表数组)  
  55.                 DVConstraint.createExplicitListConstraint(enumValue.split(","));  
  56.             //数据有效性对象  
  57.             HSSFDataValidation dataValidation = new HSSFDataValidation(regions, constraint);  
  58.             wb.getSheetAt(0).addValidationData(dataValidation);  
  59.         }  
  60.         cell.setCellStyle(cellStyle);  
  61.     }  


9)将文件保存到本地

[java]  view plain  copy
  1. File tempFile = new File("e:/" + templateName + ".xls");  
  2.             tempFile.delete();  
  3.             tempFile.createNewFile();  
  4.             FileOutputStream stream = FileUtils.openOutputStream(tempFile);  
  5.             wb.write(stream);  
  6.             stream.close();  


4.在E盘将找到生成的excel文件,其中年龄初始值为0(xml中赋初始值为0),出生年月1900-1-0(架包默认),性别和爱好为下拉列表

Java中使用JXLS工具类导出复杂Excel表格 在项目开发中,我们会遇到各种文件导出的开发场景,但是这种情况并都不常用,于是本人将自己工作中所用的代码封装成工具类,旨在记录工具类使用方法和技术分享。一、Jxls的简介Jxls是一个简单的、轻量级的excel导出库,使用特定的标记在excel模板文件中来定义输出格式和布局。Java中成熟的excel导出工具备Pol、Jxl,但他们都是使用java代码的方式来导出Excel,编码效率很低且不方便维护。二、快速开始1、导入依赖2、定义导出的模板。 阅读详情

相关推荐

根据excel 模板导出excel,jxls 实现 合并单元格,多个不同类型的sheet

java jxls实现模板导出,多sheet导出,不同sheet不同数据

skvmeimei的博客 1028

Java根据模板生成excel文件【Java】【EasyExcel】【xls】

Background 前两天客户反应对数据导出的文件格式不太满意,然后给了我们模板,让我们按照模板导出数据。于是一通修改(excel数据量有限制他们也不管,之前我们给的csv格式)。 Java操作excel常用的有poi和阿里开源的easyexcel两种方式,poi太麻烦了这里用的easyexcel。 根据模板生成文件还是比较简单的,因为我们不需要在代码中再设置各种格式、样式,模板设置好所有格式、样式以及占位符,只用写数据就行了,easyexcel使用个数据类非常方便。 1、简介 如下图所示,t

on the way . . . 1万+

Java POI根据模板生成Excel(xlsx)文件

Java POI根据模板生成Excel文件并写入磁盘,资源文件仅为实现的简单测试Demo,并没有进行代码优化,可以直接导入运行,资源文件仅供参考。

java手动/按模板生成word与excel

使用Apache poi或easypoi生成word,使用Apache poi或easyexcel或jxls生成excel

weixin_71543277的博客 6983

飞书文档API深度使用指南:如何用n8n社区节点绕过HTTP Request的复杂配置

本文详细解析了如何利用n8n社区节点简化飞书文档API的集成过程,绕过复杂的HTTP Request配置。通过n8n-feishu-lite社区节点,开发者可以轻松实现飞书文档的创建、编辑和查询操作,大幅提升自动化工作流的效率。文章还提供了高级应用场景和性能优化建议,帮助开发者更好地利用飞书开放平台的API功能。

weixin_29227585的博客 84

企业级防火墙实战:用深信服AF8.0打造安全办公网络(含流控/僵尸防护配置)

本文详细介绍了如何利用深信服AF8.0防火墙构建企业级安全办公网络,涵盖设备初始化、多接入方式配置、三维一体安全防护体系(包括应用控制、僵尸防护和智能流控)以及典型问题排查。通过实战案例和配置模板,帮助IT管理员高效部署和优化网络安全管理,提升企业网络安全防护能力。

weixin_28716443的博客 282

【Java】使用POI按模板样式导出Excel

1. 将excel表抽象为xy轴坐标图,更易于理解POI的操作,y轴对应行,x轴对应列,每个单元格都有一个xy坐标。 2. 单元格才是实际可操作的对象,行和列都只是用来定位单元格位置的。所以新增行后都要根据列数进行循环,来新增单元格。 3. 新增的单元格都不具备任何样式,可以获取其他单元格的样式进行赋予。 4. 如果不涉及对模板新增行、新增列等操作,那修改一下单元格的值就够用了,毕竟单元格样式完全可以在wps先设置好。

各行棋道丶的博客 6458

如何使用superpowers

"这个 bug 帮我修一下" → 我会自动走 systematic-debugging → TDD → verify 流程。- "帮我添加一个登录功能" → 我会自动走 brainstorming → plan → TDD → verify 流程。只要任务有 1% 的可能性适用某个技能,我就会先调用它再行动。→ TDD(测试驱动开发)→ verification(验证)→ code review(代码审查)提出需求 → brainstorming(头脑风暴)→ writing-plans(编写计划)

xiaojingjianqiang的博客 612

java 创建excel文件_java批量生成excel文件

packagetest.job.day1130;importjava.io.BufferedInputStream;importjava.io.BufferedOutputStream;importjava.io.File;importjava.io.FileInputStream;importjava.io.FileOutputStream;importjava.io.InputStream;i...

weixin_35589806的博客 349

【NIFI】实现HANA->ORACLE数据同步

实现 HANA->ORACLE数据同步。

weixin_43159039的博客 1510

Yolov5s/Yolov8s网络结构图

yolov8、yolov5网络结构图

Goodness2020的博客 9926

springboot导出excel文件

用于操纵excel表格。

qq_65130017的博客 2936

STM32 FDCAN热插拔恢复机制与自动重发功能优化

本文深入分析了STM32 FDCAN在热插拔场景下触发bus-off状态导致通讯中断的根本原因,指出自动重发功能是问题关键。通过禁用自动重发、配置硬件自动恢复机制及优化总线参数,实现了FDCAN热插拔后的100%稳定恢复,为工业应用提供了可靠的CAN总线解决方案。

ice55的博客 687

poi使用excel模板导出数据,如何防止模板被修改

使用poi根据Excel模板填充数据 遇到的问题(模板文件会被修改 类似有缓存) 通过 File方式创建Workbook时源模板文件会被修改,Workbook中会残留之前的数据,但模板文件 xls中并不会体现 File excelFile = GetLocalFileUtil.getFile("temp.xlsx", "fileTemp"); //通过file创建 XSSFWork...

抛洒的阳光专栏 1566

从传感器到执行-智能家居 Agent 的感知-决策-执行闭环

本文提出了一种面向智能家居的感知型Agent架构,通过"感知-决策-执行"的闭环系统实现智能化控制。感知模块整合多源传感器数据,决策模块基于规则或机器学习模型生成控制策略,执行模块完成设备操作。系统能够实时监测环境参数和用户状态,自动调节温度、照明等设备,提升家居舒适度。该架构可扩展为多模态感知与强化学习相结合的智能系统,为智慧家居发展提供技术基础。

一键难忘的博客 1123

解锁RK3588多屏异显:MIPI+HDMI+EDP混合输出全攻略

本文详细介绍了RK3588处理器在MIPI+HDMI+EDP混合输出配置中的技术实现与应用。作为一款高性能处理器,RK3588凭借其强大的图形处理能力,支持多屏异显功能,可满足智能安防、工业控制等领域的多屏显示需求。文章从硬件连接、设备树配置、内核驱动设置到显示参数调整,系统阐述了配置流程,并针对信号不稳定、显示模式不匹配等常见问题提供了解决方案。通过智能安防监控案例,展示了该技术在提高监控效率方面的实际应用价值。随着技术进步,RK3588多屏异显技术将在更多领域发挥重要作用,为开发者提供灵活多样的显示方案

远程部署调试 运行安装 项目调试 二次开发 项目技术新 持续迭代 部分源码免费分享 2434

java:浏览器下载excel模板

java:浏览器下载excel模板

擎云科技的博客 1446

IEM模型,地表粗糙度模拟

利用微波反演土壤水分时候,利用IEM模型可以实现对随机地表的模拟

使用EasyExcel根据模板生成结果文件

使用EasyExcel将两个类根据模板写入表格中。

aykkkkkkk的博客 798

RU DOS版、EFI版32bit/64bit BIOS常用工具

DOS版、EFI版的RU工具,可用来查看IO、MEM、PCI、SMBIOS等资源。亲测在EFI SHELL下可用。

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

导入Excel(通用)模板(简单),生成Java代码

注:博主生成的是一个类中的方法,需要使用main方法去调用,或者直接把方法中的代码,复制到main方法中,下列就是博主使用复制到main方法中测试的。博主只是帮忙生成了一个简单的模板,根据业务的需求做调整,即可。运行后,将生成的Java代码,复制到编译工具中。执行生成Java代码后,导出的Excel。首先,准备要Excel模板。ExcelUtils工具类。

LCJ0018的博客 1322

java XSSFWorkbook实现赋值Excel模板并写入后导出

/** * 根据指定的excel模板导出数据 * * @param srcFilePath * 输入路径 * @param desFilePath * 输出路径 * @throws Exception */ @GetMapping("/downloadExcel") public void downloadExce...

yellow757的博客 4902

poi excel 模板 使用{} 替换内容

效果: 替换前 替换后 填入数据 package co.yixiang; import cn.hutool.core.io.file.FileWriter; import java.io.File; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class ExcelTest { public static voi

qq_31683775的博客 4242

java中excel导出excel_java实现Excel的导入导出

本文实例为大家分享了java实现Excel导入导出的具体代码,供大家参考,具体内容如下一.Excel读写技术区别:二.jxl读写基础代码1.从数据库将数据导出到excel表格public class JxlExcel {public static void main(String[] args) {//创建Excel文件String[] title= {"姓名","课程名","分数"};File ...

weixin_33823399的博客 882

java模板导出,一个sheet两张表

controller中(偷懒业务层代码卸载了controller中):(借鉴了。1.创建excel模板。

qq_68633809的博客 853

Java操作Excel文件

创建一个Excel文件 public static void creatExcelFile(String filepath){ Workbook wb = new XSSFWorkbook(); try { FileOutputStream fileOut = new FileOutputStream(filepath); wb.write(fileOut); fileOut.close();

Technology Blog 474

向模板中导入

String fileName = "豆粕发货记录" + beginTime + "_to_" + endTime + ".xls";// 假设数据将填充到模板的第一个工作表。// 设置单元格样式。// 假设模板文件中,数据从第2行(索引1)开始填充。rowIndex++;// 创建样式(可以根据模板中的样式调整)// 保存并导出Excel文件。// 加载Excel模板文件。

weixin_54992637的博客 479
上一篇: Java基础:IO 流中的 flush
下一篇: java导出多个excel并打成zip包
ole_triangle_java
博客等级 码龄10年 82粉丝 83原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值