关于java生成excel和读取有规律的excel返回list在这篇文章https://blog.csdn.net/lianzhang861/article/details/83092835
1.需求
这次需求是将有合并单元格的Excel数据读取出来并保存,难点是要将合并的单元格所占的行列数都保存下来,以便到时候可以完成还原Excel的表现格式。
excel模板:
要求进入数据库的格式:
每张表示一条记录,每一行的数据变成一个字段,有合并单元格的用数字记录占行列数,不是合并的用 “数据,1,1;” 表示
2.思路
用poi组件读取excel,其关键思想就是先循环sheet数量,再循环每个sheet的每一行,在循环每行row的每一列cell,循环的时候判断此cell是否属于合并单元格区域,(关于一大片的合并区域,poi只会返回左上角第一个cell的数据,其余的全都返回空),如果属于合并区域,则判断是否返回了值,如果返回了,则说明是左上角第一个cell,记录此cell的值和占据行列数,如果不属于合并区域,直接返回值即可,最后再将返回值处理一下字符串
3.实现
先写个工具类 ExcelUtil.java(关于引包看最上面的上篇文章)
package com.mobileBass.utils.util;
import com.alibaba.fastjson.JSON;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.orm.jpa.vendor.OpenJpaDialect;
import java.io.File;
import java.io.FileInputStream;
import java.io.InputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ExcelUtil {
private final static String excel2003L = ".xls"; // 2003- 版本的excel
private final static String excel2007U = ".xlsx"; // 2007+ 版本的excel
/**
* 导出Excel
* @param sheetName sheet名称
* @param title 标题
* @param values 内容
* @param wb HSSFWorkbook对象
* @return
*/
public static HSSFWorkbook getHSSFWorkbook(String sheetName,String []title,String [][]values, HSSFWorkbook wb){
// 第一步,创建一个HSSFWorkbook,对应一个Excel文件
if(wb == null){
wb = new HSSFWorkbook();
}
// 第二步,在workbook中添加一个sheet,对应Excel文件中的sheet
HSSFSheet sheet = wb.createSheet(sheetName);
// 第三步,在sheet中添加表头第0行,注意老版本poi对Excel的行数列数有限制
HSSFRow row = sheet.createRow(0);
// 第四步,创建单元格,并设置值表头 设置表头居中
HSSFCellStyle style = wb.createCellStyle();
style.setAlignment(HSSFCellStyle.ALIGN_CENTER); // 创建一个居中格式
//声明列对象
HSSFCell cell = null;
//创建标题
for(int i=0;i(读取Excel)
*
* @param in
* 输入流
* @param fileName
* 文件名(判断Excel版本)
* @return
* @throws Exception
*/
public static List
controller中调用
@RequestMapping(value = "/insertTable", produces = "text/html;charset=utf-8")
@ResponseBody
public String insertTable(@RequestParam(value = "file") MultipartFile file) {
Map result=new HashMap<>();
List> list=new ArrayList<>();
try {
String fileName = file.getOriginalFilename();
//将multipartFile转为inputstream
CommonsMultipartFile cFile = (CommonsMultipartFile) file;
DiskFileItem fileItem = (DiskFileItem) cFile.getFileItem();
InputStream inputStream = fileItem.getInputStream();
Map params=new HashMap<>();
list= ExcelUtil.readExcel(inputStream,fileName);
for(int i=0;i
4.总结
1.要判断是否属于合并单元格要先获取合并单元格集合,这个poi可以返回,方法是我的工具类的getCombineCellList方法
2.循环每个cell时都要判断一下是否在合并单元格集合内,如果是需要判断其值是否为空,空的话不要保存,就保存左上角那一个唯一有值的
3.如果不需要行列信息,在处理字符串时不拼行列数即可