96SEO 2026-02-20 00:36 11
/dependencydependencygroupIdcn.afterturn/groupIdartifactIdeasypoi-annotation/artifactIdversion3.2.0/version

easypoi起因就是Excel的导入导出,最初的模板是实体和Excel的对应,model--row,filed--col
这样利用注解我们可以和容易做到excel到导入导出经过一段时间发展,现在注解有5个类分别是Excel
作用到filed上面,是对Excel一列的一个描述ExcelCollection
表示一个集合,主要针对一对多的导出,比如一个老师对应多个科目,科目就可以用集合表示ExcelEntity
表示一个继续深入导出的实体,但他没有太多的实际意义,只是告诉系统这个对象里面同样有导出的字段ExcelIgnore
和名字一样表示这个字段被忽略跳过这个导导出ExcelTarget
这个是作用于最外层的对象,描述这个对象的id,以便支持一个对象可以针对不同导出做出不同处理
[String][生成Excel表格中列名]needMerge:
[boolean][是否需要纵向合并单元格(用于含有list中,单个的单元格,合并list创建的多个row)]orderNum
[String][指定生成Excel中列的顺序,按照数字自然顺序排序]savePath
[String][指定导入Excel中图片的保存路径]type
[Double][指定导出Excel时列的宽度]isImportField:
[boolean][是否是导入字段,如果没有说明是错误的Excel]exportFormat:
[String][导出Excel的时间格式]importFormat:
[String][相当于同时设置了exportFormat和importFormat]imageType:
{Excel(name编号,orderNum1,replace
id;Excel(name姓名,orderNum2)private
name;Excel(name年龄,orderNum4,suffix
[String][定义唯一标识]ExcelTarget(users)
SET和其他属性ExcelEntity(name身份信息)private
[Class\?][用来指定导出是创建对象类型]ExcelTarget(users)
SET其他属性ExcelCollection(name订单,orderNum
{Excel(name编号,orderNum1,replace
id;Excel(name姓名,orderNum2)private
name;Excel(name年龄,orderNum4,suffix
User();user.setId(String.valueOf(i));user.setName(小陈);user.setAge(20i);user.setBir(new
Date());users.add(user);}return
ExcelExportUtil.exportExcel(new
ExportParams(用户列表,测试),User.class,getUsers());
FileOutputStream(/Users/chenyannan/Desktop/aa.xls);
//Excel(name年龄,orderNum4,suffix
往往有时候导出的对象中含有数组或者集合,需要导出这样的数据可以直接使用Excel进行导出ExcelTarget(users)
从上面运行结果可以看出,导出的格式默认是上述图片中格式,如果需要自定义导出格式怎么办?
自定义导出格式可以在对应的set方法中进行处理即可ExcelTarget(users)
StringBuilder();this.habbys.forEach(s-sb.append(s).append(、));return
导出对象中含有对象的ExcelExcelTarget(users)
User();user.setId(String.valueOf(i));user.setName(小陈);user.setAge(20i);user.setBir(new
Date());user.setHabbys(Arrays.asList(看书,听歌,打篮球));user.setCard(new
Card(11000103422323212342,北京市朝阳区));users.add(user);}return
ExcelExportUtil.exportExcel(new
ExportParams(用户列表,测试),User.class,getUsers());
FileOutputStream(/Users/chenyannan/Desktop/aa.xls);
{//......ExcelCollection(name订单信息,orderNum8)private
User();user.setId(String.valueOf(i));user.setName(小陈);user.setAge(20i);user.setBir(new
Date());user.setHabbys(Arrays.asList(看书,听歌,打篮球));user.setCard(new
Card(11000103422323212342,北京市朝阳区));user.setOrders(Arrays.asList(new
ExcelExportUtil.exportExcel(new
ExportParams(用户列表,测试),User.class,getUsers());
FileOutputStream(/Users/chenyannan/Desktop/aa.xls);
往往随着业务不断变化,可能需要在导出excel时将图片信息也一并导出,如商品图标,用户头像信息等数据,这个时候easypoi该如何处理呢?ExcelTarget(users)
2.准备图片放入指定路径中,并在测试数据中进行赋值//测试数据
User();user.setId(String.valueOf(i));user.setName(小陈);user.setAge(20i);user.setBir(new
Date());user.setHabbys(Arrays.asList(看书,听歌,打篮球));
Card(11000103422323212342,北京市朝阳区));//设置对象user.setOrders(Arrays.asList(new
X)));//设置集合user.setPhoto(/Users/chenyannan/Desktop/1.jpeg);//设置头像users.add(user);}return
大数据导出是当我们的导出数量在几万,到上百万的数据时,一次从数据库查询这么多数据加载到内存然后写入会对我们的内存和CPU都产生压力,这个时候需要我们像分页一样处理导出分段写入Excel缓解Excel的压力Workbook
ExcelExportUtil.exportBigExcel(new
ExcelExportUtil.closeExportBigExcel();注意:最好大量数据进行分页处理,每次导出数据最好不要超过1W条记录
为了节省篇幅,一下代码统一忽略getter,setterpublic
ImportParams();importParams.setTitleRows(1);//标题列占几行importParams.setHeadRows(1);//列名占几行//导出数据
ExcelImportUtil.importExcel(new
File(/Users/chenyannan/Desktop/student.xls),
Student.class,importParams);students.forEach(s-
设置下值,就是表示表头必须至少包含的字段,如果缺一个就是不合法的excel,不导入3.带图片导入
有图片的导出就有图片的导入,导入的配置和导出是一样的,但是需要设置保存路径public
/Users/chenyannan/IdeaProjects/180codes/baizhimail/src/main/webapp)private
ImportParams();importParams.setTitleRows(1);importParams.setHeadRows(1);importParams.setImportFields(new
String[]{生日});importParams.setNeedSave(false);//是否保存上传的excelimportParams.setSaveUrl(/Users/chenyannan/IdeaProjects/180codes/baizhimail/src/main/webapp);//导出数据
ExcelImportUtil.importExcel(new
File(/Users/chenyannan/Desktop/students.xls),
Student.class,importParams);students.forEach(s-
dependencygroupIdorg.mybatis.spring.boot/groupIdartifactIdmybatis-spring-boot-starter/artifactIdversion2.1.3/version
dependencygroupIdmysql/groupIdartifactIdmysql-connector-java/artifactIdversion5.1.38/version
dependencygroupIdcom.alibaba/groupIdartifactIddruid/artifactIdversion1.1.19/version
dependencygroupIdorg.springframework.boot/groupIdartifactIdspring-boot-starter-thymeleaf/artifactId
dependencygroupIdcn.afterturn/groupIdartifactIdeasypoi-base/artifactIdversion3.2.0/version
dependencygroupIdcn.afterturn/groupIdartifactIdeasypoi-web/artifactIdversion3.2.0/version
dependencygroupIdcn.afterturn/groupIdartifactIdeasypoi-annotation/artifactIdversion3.2.0/version
spring.application.nameeasypoispring.thymeleaf.cachefalsespring.datasource.typecom.alibaba.druid.pool.DruidDataSource
spring.datasource.driver-class-namecom.mysql.jdbc.Driver
spring.datasource.urljdbc:mysql://localhost:3306/easypoi?characterEncodingUTF-8
spring.datasource.passwordrootmybatis.mapper-locationsclasspath:com/baizhi/mapper/*.xml
mybatis.type-aliases-packagecom.baizhi.entity#
charsetUTF-8title导入excel的主页面/titlelink
hrefhttps://cdn.jsdelivr.net/npm/bootstrap3.3.7/dist/css/bootstrap.min.css
integritysha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4VaPmSTsz/K68vbdEjh4u
classcol-md-12h1选择Excel文件导入到数据中/h1form
classcol-md-12h1显示导入数据列表/h1table
trth编号/thth头像/thth姓名/thth年龄/thth生日/th/trtrtd1/tdtdimg
alt/tdtd小王/tdtd23/tdtd2012-12-12/td/trtrtd1/tdtdimg
alt/tdtd小王/tdtd23/tdtd2012-12-12/td/tr/tablehrinput
/Users/chenyannan/IdeaProjects/180codes/easypoi/src/main/resources/static/imgs)private
http://mybatis.org/dtd/mybatis-3-mapper.dtd
namespacecom.baizhi.dao.UserDAO!--查询所有--select
id,name,bir,photo,habbys,cardno,address
userService;//查询所有RequestMapping(/findAll)public
userService.findAll();request.setAttribute(users,users);return
6.修改index.html展示所有数据引入thymeleaf语法解析:html
xmlns:thhttp://www.thymeleaf.org
xmlns:thhttp://www.thymeleaf.org
charsetUTF-8title导入excel的主页面/titlelink
hrefhttps://cdn.jsdelivr.net/npm/bootstrap3.3.7/dist/css/bootstrap.min.css
integritysha384-BVYiiSIFeK1dGmJRAkycuHAHRg32OmUcww7on3RYdg4VaPmSTsz/K68vbdEjh4u
classcol-md-12h1选择Excel文件导入到数据中/h1form
classcol-md-12h1显示导入数据列表/h1table
trth编号/thth头像/thth姓名/thth生日/thth爱好/thth身份证号/thth家庭住址/th/trtr
th:text${#dates.format(user.bir,yyyy-MM-dd)}/tdtd
th:text${user.address}/td/tr/tablehra
btn-info导出excel/a/div/div/div/body
http://mybatis.org/dtd/mybatis-3-mapper.dtd
namespacecom.baizhi.dao.UserDAO!--查询所有--select
id,name,bir,photo,habbys,cardno,address
(#{id},#{name},#{bir},#{photo},#{habbys},#{cardno},#{address})/insert
userDAO.findAll();}Overridepublic
{user.setId(null);user.setPhoto(user.getPhoto().substring(user.getPhoto().lastIndexOf(/)1));userDAO.save(user);});}}#
[{}],excelFile.getOriginalFilename());ImportParams
ImportParams();params.setTitleRows(1);//设置一级标题行为1行params.setHeadRows(1);//设置header标题为1行ListUser
ExcelImportUtil.importExcel(excelFile.getInputStream(),
users.size());userService.saveAll(users);return
表单的enctype必须为multipart/form-dataform
exportExcel(HttpServletResponse
userService.findAll();users.forEach(user
user.getClass().getDeclaredField(photo).getAnnotation(Excel.class);user.setPhoto(excelAnn.savePath()/user.getPhoto());}
{e.printStackTrace();}});Workbook
ExcelExportUtil.exportExcel(new
users);response.setHeader(content-disposition,attachment;fileName
URLEncoder.encode(用户列表.xls,UTF-8));ServletOutputStream
response.getOutputStream();workbook.write(os);os.close();workbook.close();
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback