下面简单介绍一下如何使用该框架:
org.apache.poi
poi
${org.poi-version}
org.apache.poi
poi-ooxml
${org.poi-version}
org.apache.poi
poi-examples
${org.poi-version}
org.apache.poi
poi-excelant
${org.poi-version}
com.monitorjbl
xlsx-streamer
2.1.0
org.springframework.boot
spring-boot-starter-test
com.alibaba
easyexcel
3.0.5
org.springframework.boot
spring-boot-configuration-processor
true
junit
junit
test
cn.hutool
hutool-all
${hutool.version}
org.projectlombok
lombok
com.hynnet
jxl
2.6.12.1
com.bulucat
BeautyEye
1.0.0
com.alibaba
druid-spring-boot-starter
1.1.21
javax.annotation
javax.annotation-api
1.3.2
@Autowired
DbToExcelDao dbToExcelDao;
@Override
public List getAllCity(QueryDto dto) {
List cityInfoList = dbToExcelDao.getAllCity(dto);
List result=new ArrayList<>();
for (CityInfo cityInfo : cityInfoList) {
String[] cityInfoArr = new String[7];
//将查询到的结果集转换成字符串存入字符串数组中
cityInfoArr[0] = xxx;
cityInfoArr[1] = xxx;
cityInfoArr[2] = xxx;
cityInfoArr[3] = xxx;
cityInfoArr[4] = xxx;
//将该字符串数组存入list中
result.add(cityInfoArr);
}
return result;
}
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.hssf.util.HSSFColor;
import org.apache.poi.ss.usermodel.*;
import org.apache.poi.xssf.usermodel.XSSFCellStyle;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import org.springframework.web.multipart.MultipartFile;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.text.DecimalFormat;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.UUID;
/**
*
*
* 文件导入导出工具类
*
*
*/
public class ExcelUtils {
/**
* 导出excel文件的方法
*
* @param titles 输出到excel的表头
* @param datas 数据库的表中的数据 集合对象
* @param out excel(File) 输出到指定的路径 (OutPutStream)
*/
public static void export(List titles, List> datas, OutputStream out) {
// 创建工作表
HSSFWorkbook work = new HSSFWorkbook();
for (int k = 0;k 1){
sheetname = "xxx";//sheet名
}else {
sheetname = "xxx";//sheet名
}
}else if(k == 1){
sheetname = "xxx";//sheet名
}else if(k == 2){
sheetname = "xxx";//sheet名
}
HSSFSheet sheet = work.createSheet(sheetname);
// 创建表头【表头数据来源】
Row headRow = sheet.createRow(0);
// 循环输出标题
for (int i = 0; i < titles.get(k).length; i++) {
// 设置字体
HSSFCellStyle redStyle = work.createCellStyle();
// CellStyle redStyle = work.createCellStyle();
HSSFFont redFont = work.createFont();
//字体颜色
redFont.setColor((short) 9);
//设置字体大小
redFont.setFontHeightInPoints((short) 10);
//字体样式
redFont.setFontName("Microsoft YaHei");
//加粗
redFont.setBold(true);
redStyle.setFont(redFont);
//设置居中
redStyle.setAlignment(HorizontalAlignment.CENTER);
redStyle.setVerticalAlignment(VerticalAlignment.CENTER);
//背景色
redStyle.setFillForegroundColor(IndexedColors.BLACK.getIndex());
redStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
// 上薄边框
redStyle.setBorderTop(BorderStyle.THIN);
// 下薄边框
redStyle.setBorderBottom(BorderStyle.THIN);
// 左薄边框
redStyle.setBorderLeft(BorderStyle.THIN);
// 右薄边框
redStyle.setBorderRight(BorderStyle.THIN);
// 下边框:黑色
redStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());
// 右边框:黑色
redStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());
// 左边框:黑色
redStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());
// 上边框:黑色
redStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());
//创建cell,嵌入样式
Cell cell = headRow.createCell(i);
cell.setCellStyle(redStyle);
cell.setCellValue(titles.get(k)[i]); // 设置cell中的内容
}
// 表体内容
// 设置表体内容 嵌套循环
for (int row = 0; row < datas.get(k).size(); row++) {
// 创建行
HSSFRow sheetRow = sheet.createRow(row + 1);
// 循环 创建列
for (int c = 0; c < datas.get(k).get(row).length; c++) {
sheet.autoSizeColumn(c, true);
// 设置字体
HSSFCellStyle redStyle = work.createCellStyle();
// CellStyle redStyle = work.createCellStyle();
HSSFFont redFont = work.createFont();
//字体颜色
redFont.setColor((short) 8);
//设置字体大小
redFont.setFontHeightInPoints((short) 10);
//字体样式
redFont.setFontName("等线");
//加粗
// redFont.setBold(true);
redStyle.setFont(redFont);
//设置居中
redStyle.setAlignment(HorizontalAlignment.CENTER);
redStyle.setVerticalAlignment(VerticalAlignment.CENTER);
//背景色
// redStyle.setFillForegroundColor(IndexedColors.BLACK.getIndex());
// redStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);
// 上薄边框
redStyle.setBorderTop(BorderStyle.THIN);
// 下薄边框
// if(row == datas.size()){
redStyle.setBorderBottom(BorderStyle.THIN);
// }
// 左薄边框
redStyle.setBorderLeft(BorderStyle.THIN);
// 右薄边框
// if(c == datas.get(k).get(row).length-1){
redStyle.setBorderRight(BorderStyle.THIN);
// }
// 下边框:黑色
redStyle.setBottomBorderColor(IndexedColors.BLACK.getIndex());
// 右边框:黑色
redStyle.setRightBorderColor(IndexedColors.BLACK.getIndex());
// 左边框:黑色
redStyle.setLeftBorderColor(IndexedColors.BLACK.getIndex());
// 上边框:黑色
redStyle.setTopBorderColor(IndexedColors.BLACK.getIndex());
HSSFCell sheetCell = sheetRow.createCell(c);
sheetCell.setCellStyle(redStyle);
// 设置内容
sheetCell.setCellValue(datas.get(k).get(row)[c]);
}
}
}
// 创建完成后,内存创建的Excel输出到文件中
try {
work.write(out);
out.flush();
out.close();
} catch (IOException e) {
e.printStackTrace();
}
}
/**
* 导入excel文件的方法
*
* suffix: 传入excel的后缀名
* excel 2003版的后缀为(xls) HSSFWorkbook 2007版的后缀为(xlsx)XSSFWorkbook
* fis : 通过输入流来读取excel的内容
* startRow: 读取内容的起始行
*
* @return 返回导入的数据 List
*
*/
public static List importData(MultipartFile file, int startrow) {
List datas = new ArrayList();
// 创建表格对象
Workbook work = null;
try {
//获取文件流对象
InputStream fis = file.getInputStream();
//获取文件的后缀
String suffix = file.getOriginalFilename().substring(file.getOriginalFilename().lastIndexOf("."));
// 判断后缀名
if (suffix.equals(".xls")) {
work = new HSSFWorkbook(fis); // 2003的工作表对象
} else if (suffix.equals(".xlsx")) { //
work = new XSSFWorkbook(fis); // 2007的工作表对象
} else {
return null;
}
} catch (IOException e) {
e.printStackTrace();
}
// 获取sheet表格
Sheet sheet = work.getSheetAt(0);
if (sheet == null) { // 代表一个sheet表格也没有
return null;
}
// 获取一共多少行
int rownum = sheet.getLastRowNum();
if (rownum == 0 || rownum+1 == startrow) {
return null;
}
for (int i = startrow; i <= rownum; i++) {
// 获取行
Row row = sheet.getRow(i);
// 获取列
short first = row.getFirstCellNum(); //起始列的下标
short num = row.getLastCellNum(); //终止列的下标
String[] cols = new String[num]; //存放当前行所有的列内容
for (int j = first; j < num; j++) {
// 处理列对象
Cell cell = row.getCell(j);
// if(j == 10){
// String[] dates = row.getCell(7).toString().split("-");
// String year = dates[2];
// String month = dates[1].substring(0,dates[1].length()-1);
// //获取年份差
// int yx = Integer.parseInt(row.getCell(1).toString().substring(0,4) )- Integer.parseInt(year);
// //获取月份差
// int mx = Integer.parseInt(row.getCell(1).toString().substring(4,6)) - Integer.parseInt(month);
// cols[j] = yx*12+mx+1 + "";
// continue;
// }
//获取指定列的内容, 都转换为String类型
cols[j] = parseCell(cell);
}
datas.add(cols); //列处理完成以后,把该行所有列添加集合中
}
return datas;
}
// 转换类型
private static String parseCell(Cell cell) {
String cellValue = "";
if(cell == null){
return null;
}
//判断如果是String类型 则去除空格
if (cell.getCellTypeEnum() == CellType.STRING) {
cellValue = cell.getStringCellValue().trim();
} else if (cell.getCellTypeEnum() == CellType.BOOLEAN) { //如果是boolean类型则获取boolean类型的值
cellValue = String.valueOf(cell.getBooleanCellValue());
} else if (cell.getCellTypeEnum() == CellType.NUMERIC) { //如果是数字类型, 则判断是日期类型还是普通数字
if (HSSFDateUtil.isCellDateFormatted(cell)) { // 判断日期类型
double d = cell.getNumericCellValue();
Date date = HSSFDateUtil.getJavaDate(d);
cellValue = new SimpleDateFormat("yyyy-MM-dd").format(date);
} else { // 否
cellValue = new DecimalFormat("#.######").format(cell.getNumericCellValue());
}
} else {
cellValue = "";
}
return cellValue;
}
//图片处理
public static List savePic(InputStream fis) throws Exception {
HSSFWorkbook workbook = (HSSFWorkbook) WorkbookFactory.create(fis);
List pictures = workbook.getAllPictures();
HSSFSheet sheet = workbook.getSheetAt(0);
List picList = new ArrayList<>();
for (HSSFShape shape : sheet.getDrawingPatriarch().getChildren()) {
HSSFClientAnchor anchor = (HSSFClientAnchor) shape.getAnchor();
if (shape instanceof HSSFPicture) {
HSSFPicture pic = (HSSFPicture) shape;
int row = anchor.getRow1();
int pictureIndex = pic.getPictureIndex() - 1;
HSSFPictureData picData = pictures.get(pictureIndex);
//获取文件后缀
String ext = picData.suggestFileExtension();
//获取图片内容
byte[] data = picData.getData();
//通过文件流将图片写入到指定的位置
String filename = UUID.randomUUID().toString().replace("-", "");
FileOutputStream out = new FileOutputStream("D:\\upload\\"+ filename +"."+ext);
out.write(data);
out.close();
picList.add(filename+"."+ext);
}
}
return picList;
}
}
@Autowired
DbToExcelService dbToExcelService;
//导出结果表
@RequestMapping("export")
public void exportFileReconnect(HttpServletResponse res,QueryDto querydto) throws IOException {
//定义添加标题
String[] title1={"xx","xx","xx","xx","xx"};
List title = new ArrayList<>();
title.add(title1);
//定义添加内容,也可以存入多个list,作一个表中的不同sheet
List list1 = dbToExcelService.getAllReconnect(querydto);
List> list = new LinkedList<>();
list.add(list1);
//设置响应头,告知浏览器是下载操作
res.setHeader("Content-Disposition","attachment;filename=futongtongji.xls");
//设置MIME类型
res.setContentType("application/vnd.ms-excel");
//这里要传递的字节流数据,excel为字节流文件
ExcelUtils.export(title,list,res.getOutputStream());
}
@Autowired
ExcelToDbService excelToDbService;
//文件导入数据库
@RequestMapping("import")
@ResponseBody
public ResultData importFile(MultipartFile file) throws Exception {
//获取excel的数据
List list = ExcelUtils.importData(file, 1);
//获取excel中图片的数据
List strings = ExcelUtils.savePic(file.getInputStream());
for (int i = 0; i < list.size(); i++) {
//将图片数据渲染到excel表格中
list.get(i)[1]= strings.get(i);
}
//上传数据就是一个增加的过程
ResultData resultData = excelToDbService.insertAll(list);
return resultData;
}