1、需要的jar
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.14</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.14</version>
</dependency>
2、代码工具类(直接看main函数)
package com.fuint.common.util;
import lombok.SneakyThrows;
import org.apache.poi.hssf.usermodel.HSSFCellStyle;
import org.apache.poi.ss.util.CellRangeAddress;
import org.apache.poi.xssf.usermodel.*;
import javax.servlet.http.HttpServletResponse;
import java.io.FileOutputStream;
import java.net.URLEncoder;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class ExcelUtils {
/**
* 导出excel工具
*
* @param titleList 标题的集合
* @param widthList 每列的宽度,多少个标题,多少列,可以为空
* @param listS 数据集合 最外层代表多少行,里面的list代表每列的值
* @param name 导出excel的名称
* @param response 请求相应
*/
@SneakyThrows
public static void exportExcelUtils(List<String> titleList, List<Integer> widthList, List<List<Object>> listS, HttpServletResponse response, String name) {
// 如果宽度没上传,默认给定一些宽度
if (widthList == null || widthList.size() == 0) {
widthList = new ArrayList<>();
for (int i = 0; i < titleList.size(); i++) {
widthList.add(3000);
}
}
//创建excel的文件对象,包含一个 sheet(表),有标题,有cell(单元格列),有row(行)
XSSFWorkbook workbook = new XSSFWorkbook();
// 创建excel表格的样式
XSSFCellStyle cellStyle = workbook.createCellStyle();
// 目前设置的是行列居中,可以自行修改
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
//创建一个表
XSSFSheet sheet = workbook.createSheet("Sheet1");
//创建标题栏,第一行也就是表头
XSSFRow titleRow = sheet.createRow(0);
//将标题栏数据写入
for (int i = 0; i < titleList.size(); i++) {
XSSFCell cell = titleRow.createCell(i);
cell.setCellValue(titleList.get(i));
cell.setCellStyle(cellStyle);
}
for (int i = 0; i < widthList.size(); i++) {
// 设置表格的宽度
sheet.setColumnWidth(i, widthList.get(i));
}
// 为每行每列进行设值并且设置样式
for (int i = 0; i < listS.size(); i++) {
XSSFRow rowInfo = sheet.createRow(i + 1);
// 设置序号那一列
rowInfo.createCell(0).setCellValue(i + 1);
// 设置i行其他列的数据
for (int j = 1; j < titleList.size(); j++) {
rowInfo.createCell(j).setCellValue(listS.get(i).get(j - 1) == null ? "" : listS.get(i).get(j - 1) + "");
}
// 设置序号以及其他行的样式
for (int j = 0; j < titleList.size(); j++) {
rowInfo.getCell(j).setCellStyle(cellStyle);
}
}
//保存文件
workbook.write(new FileOutputStream("C:\\Users\\qinjinjin\\Desktop\\cover\\test.xlsx"));
// 如果是输出到浏览器就是下面
// String encoderName = URLEncoder.encode(name + ".xlsx", "UTF-8")
// .replace("+", "%20").replace("%2B", "+");
// response.setHeader("Content-Disposition",
// "attachment;filename=" + encoderName + "");
// response.setHeader("Accept-Ranges", "bytes");
// workbook.write(response.getOutputStream());
// response.flushBuffer();
}
/**
* 导出excel工具(带合并版的)
* 方法就是addMergedRegion,具体需要结合业务,这里不做论述
*/
@SneakyThrows
public static void exportExcelMergeUtils(List<String> titleList, List<String> titleList1, List<Integer> widthList, List<List<Object>> listS, HttpServletResponse response, String name) {
//创建excel的文件对象,包含一个 sheet(表),有标题,有cell(单元格列),有row(行)
XSSFWorkbook workbook = new XSSFWorkbook();
// 创建excel表格的样式
XSSFCellStyle cellStyle = workbook.createCellStyle();
// 目前设置的是行列居中,可以自行修改
cellStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);
cellStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);
//创建一个表
XSSFSheet sheet = workbook.createSheet("Sheet1");
// 先进行合并(下面这个意思就是合并第1行到第二行,第一列到第一列)
sheet.addMergedRegion(new CellRangeAddress(0, 1, 0, 0));
sheet.addMergedRegion(new CellRangeAddress(0, 1, 1, 1));
int h = 1;
for (int i = 0; i < 4; i++) {
sheet.addMergedRegion(new CellRangeAddress(0, 0, h + 1, h + 2));
h += 2;
}
}
public static void main(String[] args) {
// 标题的集合
List<String> titleList = Arrays.asList("序号", "店铺名称", "商品名称", "数量", "类型");
// 数据的集合
// 最外层代表多少行,里面的list代表每列的值
List<List<Object>> listS = new ArrayList<>();
// 测试10行
for (int i = 0; i < 10; i++) {
List<Object> list = new ArrayList<>();
// 除序列 测试4列
for (int i1 = 0; i1 < 4; i1++) {
list.add(i1);
}
listS.add(list);
}
exportExcelUtils(titleList, null, listS, null, null);
}
}