Excel模板下载/导入导出工具类
环境 :jdk1.8
maven :3.8.1
引入jar :
org.apache.poi poi 3.10-FINAL org.apache.poi poi-ooxml 3.9
构建测试 Controller :
package com...controller; import com...service.ExcelService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.RestController; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; /** * @author lifan */ @RestController public class ExcelController { @Autowired private ExcelService excelService; /** * 模板下载 */ @GetMapping("/v1/dataModelDownload") public void insureDataModelDownload(HttpServletResponse response) throws Exception { excelService.dataModelDownload(response); } /** *批量上传 */ @PostMapping("/v1/addAll") public void dxccAddAll(@RequestParam(value = "addFile") MultipartFile addFile) { excelService.addAll(addFile); } }
Service:
package com...service; import com...utils.ExportExcelUtil; import com...utils.ImportExcelUtil; import lombok.extern.slf4j.Slf4j; import org.springframework.stereotype.Service; import org.springframework.web.multipart.MultipartFile; import javax.servlet.http.HttpServletResponse; import java.io.BufferedInputStream; import java.io.InputStream; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; /** * @author lifan */ @Slf4j @Service public class ExcelService { public void dataModelDownload(HttpServletResponse response) { List> list = new ArrayList<>(); List
headList = new ArrayList<>(); //标题行 headList.add("订单类型"); headList.add("项目名称"); headList.add("项目代码"); headList.add("档次名称"); headList.add("档次代码"); headList.add("缴费金额"); headList.add("有效期起"); headList.add("有效期止"); String fileName = "XX档次导入表(模板)"; list.add(headList); //示例数据: List cList = new ArrayList<>(); cList.add("示例:XX-000001"); cList.add("示例:XX-000002"); cList.add("示例:XX-000003"); cList.add("示例:XX-000004"); cList.add("示例:XX-000005"); cList.add("示例:XX-200"); cList.add("示例:XX-202101"); cList.add("示例:XX-202112"); list.add(cList); try { ExportExcelUtil.exportExcelModel(response, fileName, list); } catch (Exception e) { log.error("download error={},fileName={}", e, fileName); } } public void addAll(MultipartFile addFile) { String filename = addFile.getOriginalFilename(); System.out.println(filename); // BufferedInputStream inputStream = (BufferedInputStream) addFile.getInputStream(); InputStream inputStream = null; try { inputStream = addFile.getInputStream(); Map map = new HashMap<>(); //字段转换 map.put("订单类型", "ddlx"); map.put("项目名称", "xmmc"); map.put("项目代码", "xmdm"); map.put("档次名称", "dcmc"); map.put("档次代码", "dcdm"); map.put("缴费金额", "jfje"); map.put("有效期起", "yxqq"); map.put("有效期止", "yxqz"); List
导出辅助类 :
package com...utils; import lombok.extern.slf4j.Slf4j; import org.apache.poi.hssf.usermodel.*; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.*; import java.util.List; /** * @author lifan * excel 导出-辅助类 */ @Slf4j public class ExportExcelUtil { @SuppressWarnings("deprecation") public static byte[] exportExcelModel(HttpServletResponse response, String fileNameSheet, List> dataList) throws Exception { // 生成Excel文件 HSSFWorkbook hssfWorkbook = new HSSFWorkbook(); // 创建Sheet HSSFSheet sheet = hssfWorkbook.createSheet(fileNameSheet); sheet.setDefaultColumnWidth((short) 20); String fileName = fileNameSheet; HSSFRow row ; int dataIndex = dataList.get(0).size(); // 记录额外创建的sheet数量 int index = 0; for (int r = 0; r < dataList.size(); r++) { //限制Excel 6w --- Excel导出超过字段限制65535 if ( r % 60000 == 0 && r != 0 ) { sheet = hssfWorkbook.createSheet(); index++; } row = sheet.createRow(r - (index * 60000)); for (int j = 0; j < dataIndex; j++) { row.createCell(j,HSSFCell.CELL_TYPE_STRING).setCellValue(dataList.get(r).get(j)); } } if (response != null) { response.reset(); ServletOutputStream outputStream = response.getOutputStream(); try { fileName = new String(fileName.getBytes(), "iso-8859-1") + ".xls"; response.setCharacterEncoding("utf-8"); response.setContentType("application/vnd.ms-excel;charset=utf-8"); // b.Content-Disposition 设置要被下载的文件名 response.setHeader("Content-Disposition", "attachment;filename=" + fileName); hssfWorkbook.write(outputStream); outputStream.flush(); } catch (IOException e) { e.printStackTrace(); } finally { if (outputStream != null) { outputStream.close(); } } }else{ ByteArrayOutputStream bos = new ByteArrayOutputStream(); try { hssfWorkbook.write(bos); } finally { bos.close(); } return bos.toByteArray(); } return null; } public static void getFileByBytes(byte[] bytes, String filePath, String fileName) { BufferedOutputStream bos=null; FileOutputStream fos=null; File file; try{ File dir=new File(filePath); if(!dir.exists() && !dir.isDirectory()){ dir.mkdirs(); } file=new File(filePath + fileName); fos=new FileOutputStream(file); bos=new BufferedOutputStream(fos); bos.write(bytes); } catch(Exception e){ log.error("getFileByBytes 生成文件error={}",e.getMessage()); } finally{ try{ if(bos != null){ bos.close(); } if(fos != null){ fos.close(); } } catch(Exception e){ log.error("getFileByBytes error={}",e.getMessage()); } } } }
导入辅助类 :
package com...utils; 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; import org.apache.poi.hssf.usermodel.HSSFWorkbook; 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.usermodel.WorkbookFactory; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import lombok.extern.slf4j.Slf4j; /** * @author lifan * excel 导入-辅助类 */ @Slf4j public class ImportExcelUtil { private final static String excel2003L = ".xls"; // 2003- 版本的excel private final static String excel2007U = ".xlsx"; // 2007+ 版本的excel /** * 将流中的Excel数据转成List@param in 输入流 * @param fileName 文件名(判断Excel版本) * @param mapping 字段名称映射 * @return * @throws Exception */ public static List
测试结果:
导出:
导入:
package com.lifan.demo.service;
import com.lifan.demo.utils.ExportExcelUtil;
import com.lifan.demo.utils.ImportExcelUtil;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import javax.servlet.http.HttpServletResponse;
import java.io.BufferedInputStream;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
/**
* @author lifan
*/
@Slf4j
@Service
public class ExcelService {
public void dataModelDownload(HttpServletResponse response) {
List> list = new ArrayList<>();
ListheadList = new ArrayList<>();
//标题行
headList.add("订单类型");
headList.add("项目名称");
headList.add("项目代码");
headList.add("档次名称");
headList.add("档次代码");
headList.add("缴费金额");
headList.add("有效期起");
headList.add("有效期止");
String fileName = "XX档次导入表(模板)";
list.add(headList);
//示例数据:
ListcList = new ArrayList<>();
cList.add("示例:XX-000001");
cList.add("示例:XX-000002");
cList.add("示例:XX-000003");
cList.add("示例:XX-000004");
cList.add("示例:XX-000005");
cList.add("示例:XX-200");
cList.add("示例:XX-202101");
cList.add("示例:XX-202112");
list.add(cList);
try {
ExportExcelUtil.exportExcelModel(response, fileName, list);
} catch (Exception e) {
log.error("download error={},fileName={}", e, fileName);
}
}
public void addAll(MultipartFile addFile) {
String filename = addFile.getOriginalFilename();
System.out.println(filename);
// BufferedInputStream inputStream = (BufferedInputStream) addFile.getInputStream();
InputStream inputStream = null;
try {
inputStream = addFile.getInputStream();
Map, String> map = new HashMap<>();
//字段转换
map.put("订单类型", "ddlx");
map.put("项目名称", "xmmc");
map.put("项目代码", "xmdm");
map.put("档次名称", "dcmc");
map.put("档次代码", "dcdm");
map.put("缴费金额", "jfje");
map.put("有效期起", "yxqq");
map.put("有效期止", "yxqz");
List, Object>> mapList = ImportExcelUtil.parseExcel(inputStream, filename, map);
for (Map, Object> m : mapList) {
//时间格式需要整理一下
m.put("yxqq",m.get("yxqq").toString().replace(".00", ""));
m.put("yxqz",m.get("yxqz").toString().replace(".00", ""));
System.out.println(m);
//输出 具体数据,去做下面的处理
}
} catch (Exception e) {
e.printStackTrace();
}
}
}