POI 导入导出实践

根据一个朋友的需求,其需要处理一个 Excel 模板,把其中某一列的数据进行降序排序,并增加一列存放某两列的乘积

经过一段时间的折腾,基本功能算实现完了。发现对于我来说,难点在于单元格的合并。
1)排序后,前面的序号乱了,需写逻辑处理序号并合并相应单元格
2)对于excel内容的合并

处理前:
在这里插入图片描述
处理后(原料含量排序、增加一列实际含量,实际含量=原料含量*原料成分含量):
在这里插入图片描述

完整代码如下:
创建一个 springboot 项目
建表(表字段见实体类或mapper类)

pom.xml

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>2.4.5</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.xiao</groupId>
	<artifactId>handerPF</artifactId>
	<version>xiao.1.0</version>
	<name>handerPF</name>
	<description>handerPFexcel</description>
	<properties>
		<java.version>1.8</java.version>
	</properties>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>
		
		<dependency>
		    <groupId>org.mybatis.spring.boot</groupId>
		    <artifactId>mybatis-spring-boot-starter</artifactId>
		    <version>2.1.4</version>
		</dependency>
		<dependency>
	  		<groupId>org.springframework.boot</groupId>
	  		<artifactId>spring-boot-starter-jdbc</artifactId>
	  	</dependency>
		<dependency>
			<groupId>com.oracle.database.jdbc</groupId>
			<artifactId>ojdbc8</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
			<groupId>mysql</groupId>
			<artifactId>mysql-connector-java</artifactId>
			<scope>runtime</scope>
		</dependency>
		<dependency>
		    <groupId>org.apache.poi</groupId>
		    <artifactId>poi</artifactId>
		    <version>3.16</version>
		</dependency>
		<dependency>
		    <groupId>org.apache.poi</groupId>
		    <artifactId>poi-ooxml</artifactId>
		    <version>3.16</version>
		</dependency>
		<dependency>
		    <groupId>net.sf.json-lib</groupId>
		    <artifactId>json-lib</artifactId>
		    <version>2.4</version>
		    <classifier>jdk15</classifier>
		</dependency>
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

application.properties

server.port=8080

## 配置数据源
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver
spring.datasource.url=jdbc:mysql://localhost:3306/xiao_database202105?serverTimezone=GMT%2B8&useUnicode=true&characterEncoding=utf-8
spring.datasource.username=root
#spring.datasource.password=mysql8

## 配置数据源
#spring.datasource.driver-class-name=oracle.jdbc.driver.OracleDriver
#spring.datasource.url=jdbc:oracle:thin:@localhost:1521:ORCL
#spring.datasource.username=SCOTT
#spring.datasource.password=xiao

# mybatis 全局配置/主配置文件
mybatis.config-location=classpath:mybatis/mybatis-config.xml
# mybatis mapper映射文件
mybatis.mapper-locations=classpath:mybatis/mapper/*.xml

logging.file.name=logs/handlePF.log

三个实体类

public class Pffile {
   
	private String id;
	private String fjmc;
	private Date cjsj;
	private String pfmc;
	private String pfxh;
	
	//getter、setter方法
}
public class Ylinfo {
   
	private String id;
	private int xh;
	private String ylmc;
	private String inci;
	private BigDecimal ylhl;
	private BigDecimal ylcfhl;
	private BigDecimal ylsjhl;
	private String symd;
	private String bz;
	private String pfid;
	private int ylxh;
	
	private String pfmc; // 仅传值使用

	//getter、setter方法
}
// 处理表格时使用
public class PoiModel {
   
    //内容
    private Object content;
    //行标
    private int rowIndex;
    //列标
    private int cellIndex;
    //标记
    public int flag;
    
    //getter、setter方法
}

mapper.xml

<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.xiao.dao.PffileMapper">
	<sql id="columns">
		ID,FJMC,CJSJ,PFMC,PFXH
	</sql>
	
	<select id="queryPffile" resultType="com.xiao.entity.Pffile" parameterType="java.lang.String">
		select <include refid="columns"/>
		from XIAO_PFFILE_INFO
		where FJMC = #{fjmc, jdbcType=VARCHAR}
		order by PFXH ASC
	</select>	

	<insert id="insertPffile" parameterType="com.xiao.entity.Pffile">
		insert into XIAO_PFFILE_INFO 
		values(#{id},#{fjmc},#{cjsj},#{pfmc},#{pfxh})
	</insert>
	
	<delete id="deletePffileByFjmc" parameterType="java.lang.String">
		DELETE FROM XIAO_PFFILE_INFO WHERE FJMC = #{fjmc, jdbcType=VARCHAR}
	</delete>
</mapper>
<!DOCTYPE mapper
    PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
    "http://mybatis.org/dtd/mybatis-3-mapper.dtd">

<mapper namespace="com.xiao.dao.YlinfoMapper">
	<sql id="columns">
		ID,XH,YLMC,INCI,YLHL,YLCFHL,YLSJHL,SYMD,BZ,PFID
	</sql>
	
	<select id="queryYlInfo" resultType="com.xiao.entity.Ylinfo" parameterType="java.lang.String">
		select <include refid="columns"/>
		from XIAO_YLINFO
		where pfid = #{pfid, jdbcType=VARCHAR}
		order by ylhl desc,xh asc,ylcfhl desc
	</select>	

	<insert id="insertYlInfo" parameterType="com.xiao.entity.Ylinfo">
		insert into XIAO_YLINFO 
		values(#{id},#{xh},#{ylmc},#{inci},#{ylhl},#{ylcfhl},#{ylsjhl},#{symd},#{bz},#{pfid})
	</insert>
	
	<!-- oracle批量插入 -->
	<insert id="batchSave" parameterType="java.util.List">
		INSERT INTO XIAO_YLINFO
		(<include refid="columns"/>)
		<foreach item="item" index="index" collection="list" separator="union all">
         (
			SELECT 
				#{item.id},
				#{item.xh},
				#{item.ylmc},
				#{item.inci},
				#{item.ylhl},
				#{item.ylcfhl},
				#{item.ylsjhl},
				#{item.symd},
				#{item.bz},
				#{item.pfid}
			FROM DUAL
         )
         </foreach>
	</insert>
	
	<!-- mysql批量插入 -->
	<insert id="batchSaveMysql" parameterType="java.util.List">
		INSERT INTO XIAO_YLINFO
		(<include refid="columns"/>)
		VALUES
		<foreach item="item" index="index" collection="list" separator=",">
         (
			#{item.id},
			#{item.xh},
			#{item.ylmc},
			#{item.inci},
			#{item.ylhl},
			#{item.ylcfhl},
			#{item.ylsjhl},
			#{item.symd},
			#{item.bz},
			#{item.pfid}
         )
         </foreach>
	</insert>
	
	<delete id="deleteYlinfoByPfid" parameterType="java.lang.String">
		DELETE FROM XIAO_YLINFO WHERE PFID = #{pfid, jdbcType=VARCHAR}
	</delete>
</mapper>

DAO

public interface PffileMapper {
   
	/**
	 * 保存配方文件数据
	 * @param pffile
	 */
	void insertPffile(Pffile pffile);
	
	/**
	 * 查询配方文件数据
	 * @param fjmc
	 * @return
	 */
	List<Pffile> queryPffile(String fjmc);
	
	/**
	 * 删除配方文件数据
	 * @param fjmc
	 */
	void deletePffileByFjmc(String fjmc);
}
public interface YlinfoMapper {
   

	/**
	 * 保存原料数据
	 * @param ylpo
	 */
	void insertYlInfo(Ylinfo ylpo);
	
	/**
	 * 批量保存原料数据--oracle
	 * @param list
	 */
	void batchSave(List<Ylinfo> list);
	
	/**
	 * 批量保存原料数据--mysql
	 * @param list
	 */
	void batchSaveMysql(List<Ylinfo> list);
	
	/**
	 * 查询原料数据
	 * @param pfid
	 * @return
	 */
	List<Ylinfo> queryYlInfo(String pfid);
	
	/**
	 * 删除原料数据
	 * @param pfid
	 * @return
	 */
	void deleteYlinfoByPfid(String pfid);
}

工具类

public class CommonUtil {
   
	// 获取uuid
	
自己封装的excel导出/导入,可以根据注解来导出excel.本项目一共有13个类,里面还包含了一个反射工具,一个编码工具,10分值了。下面是测试代码 public class Test { public static void main(String[] arg) throws FileNotFoundException, IOException{ testBean(); testMap(); } public static void testBean() throws FileNotFoundException, IOException{ List l = new ArrayList(); for(int i=0;i<100;i++){ l.add(new MyBean()); } //很轻松,只需要二句话就能导出excel BeanExport be = ExportExcel.BeanExport(MyBean.class); be.createBeanSheet("1月份", "1月份人员信息").addData(l); be.createBeanSheet("2月份","2月份人员信息").addData(l); be.writeFile("E:/test/bean人员信息8.xlsx"); } //如果不想用注解,还能根据MAP导出. public static void testMap () throws FileNotFoundException, IOException{ List l = new ArrayList(); l.add(new MapHeader("姓名","name",5000)); l.add(new MapHeader("年龄","age",4000)); l.add(new MapHeader("生日","birthdate",3000)); l.add(new MapHeader("地址","address",5000)); l.add(new MapHeader("双精度","d",4000)); l.add(new MapHeader("float","f",6000)); List<Map> lm = new ArrayList<Map>(); for(int i=0;i<100;i++){ Map map = new HashMap(); map.put("name","闪电球"); map.put("age",100); map.put("birthdate",new Date()); map.put("address","北京市广东省AAA号123楼!"); map.put("d",22.222d); map.put("f",295.22f); lm.add(map); } MapExport me = ExportExcel.mapExport(l); me.createMapSheel("1月份","广东省人员信息").addData(lm); me.createMapSheel("2月份", "北京市人员信息").addData(lm); me.writeFile("E:/test/map人员信息9.xlsx"); } }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值