import lombok.Builder;
import lombok.Data;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.VerticalAlignment;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.ss.util.CellRangeAddress;
import javax.servlet.http.HttpServletResponse;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
/**
* @description: java–poi生成excel动态合并内容相同的行+水平垂直居中+大标题 浏览器直接下载
* @author: Dai Yuanchuan
* @create: 2019-03-24 14:38
**/
public class ExcelUtil {
/**
* 工具类主入口
*
* @param title excel 头
* @param maps Map>>
* @param mergeIndex 需要合并的列的下标组成的int数组
* @param fileName 文件名
* @param response 响应头
* @return
*/
public static void createExcel(String[] title, Map>> maps,
int[] mergeIndex, String fileName, HttpServletResponse response) {
// 初始化excel模板
HSSFWorkbook workbook = new HSSFWorkbook();
HSSFSheet sheet = null;
int n = 0;
/**
* 循环sheet页
* List>>
*/
for (Map.Entry>> entry : maps.entrySet()) {
// 实例化sheet对象并且设置sheet名称,book对象
try {
sheet = workbook.createSheet();
workbook.setSelectedTab(0);
} catch (Exception e) {
e.printStackTrace();
}
// 初始化头部
HSSFCellStyle cellStyle1 = initExcelHead(sheet, workbook, n, entry, fileName, title);
// 得到当前sheet下的数据集合 List>
List> list = entry.getValue();
// 遍历该数据集合
List poiModels = new ArrayList<>();
if (null != workbook) {
Iterator iterator = list.iterator();
// 这里1是从excel的第三行开始,第一二行已经塞入标题了
int index = 2;
while (iterator.hasNext()) {
HSSFRow row = sheet.createRow(index);
// 设置单元格的高
row.setHeightInPoints(43);
// 取得当前这行的map,该map中以key,value的形式存着这一行值
Map map = (Map) iterator.next();
// 循环列数,给当前行塞值
currentRowAssignment(title, index, poiModels, mergeIndex, map, sheet, cellStyle1, row, list);
index++;