继上一篇导出pdf,这篇导出excel。

1、导入依赖

<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi</artifactId>
<version>3.9</version>
</dependency>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>3.9</version>
</dependency>

2、代码

import java.io.OutputStream;
import java.net.URLEncoder;

import javax.servlet.http.HttpServletResponse;
import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFRow;
import org.apache.poi.hssf.usermodel.HSSFSheet;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.util.CellRangeAddress;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

/**
* @Title: ExcelController.java
* @Description: TODO
* @author zhangjunhong
* @date 2018年11月9日
*/
@RestController
public class ExcelController {
@RequestMapping("/test/excel")
public String createExcel(HttpServletResponse response ) throws Exception{
//创建文档
HSSFWorkbook wb=new HSSFWorkbook();
//创建sheet
HSSFSheet sheet=wb.createSheet("用户表");
//创建行在sheet里创建第一行,参数为行索引(excel的行),可以是0~65535之间的任何一个
HSSFRow row1=sheet.createRow(0);
//创建单元格(excel的单元格,参数为列索引,可以是0~255之间的任何一个
HSSFCell cell=row1.createCell(0);
cell.setCellValue("呵呵呵呵呵呵,闲闲闲,水群水群");
//合并单元格CellRangeAddress构造参数依次表示起始行,截至行,起始列, 截至列
sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, 3));

HSSFRow row2=sheet.createRow(1);
row2.createCell(0).setCellValue("姓名");
row2.createCell(1).setCellValue("班级");

HSSFRow row3=sheet.createRow(2);
row3.createCell(0).setCellValue("张三");
row3.createCell(1).setCellValue("1121");
OutputStream out=response.getOutputStream();
response.reset();
String filename="用户表.xls";
response.setHeader("Content-disposition", "attachment; filename="+URLEncoder.encode(filename, "UTF-8"));
response.setContentType("application/msexcel");
wb.write(out);

out.close();
return null;
}}

3、结果

关于导出excel的工具类:网上有很多,但是我都没找到适合自己业务需要的,我的需要在一个excel文档里放多个sheet,

然后就自己参看网上的整理了一个,但其实也不是很好用。。。。

1、工具类,这个工具类是生成一个sheet,利用的是泛型和反射实现。

public class ExportExcel<T> {
/**
* @Title: createSheet
* @Description: 生成一个sheet
* @param sheet
* @param headersName :excel要显示的表头
* @param headersId : 对应表头,要显示对象的属性(利用反射做得)
* @param list 数据
* @return: void
*/
public void createSheet(HSSFSheet sheet, List<String> headersName, List<String> headersId, List<T> list) {
// 表头——---------------------------
Map<Integer, String> headersNameMap = new HashMap<>();
int key = 0;
for (int i = 0; i < headersName.size(); i++) {
if (!headersName.get(i).equals(null)) {
headersNameMap.put(key, headersName.get(i));
key++;
}
}
// 显示的字段-----------------------------------
Map<Integer, String> titleFieldMap = new HashMap<>();
int value = 0;
for (int i = 0; i < headersId.size(); i++) {
if (!headersId.get(i).equals(null)) {
titleFieldMap.put(value, headersId.get(i));
value++;
}
}

HSSFRow row = sheet.createRow(0);
HSSFCell cell;

Collection c = headersNameMap.values();
Iterator<String> iterator = c.iterator();
// 生成表头---------------------------------------------
int size = 0;
while (iterator.hasNext()) {
cell = row.createCell(size);
cell.setCellValue(iterator.next().toString());
size++;
}
// 记录---------------------------------------------
Collection c1 = titleFieldMap.values();
Iterator<T> labIt = list.iterator(); // 记录数据
int i = 1;
while (labIt.hasNext()) {
T l = labIt.next();
row = sheet.createRow(i);
i++;
// 根据反射,获得实体所有的属性
Field[] fields = l.getClass().getDeclaredFields();
int j = 0;
for (Field field : fields) {
String fieldName = field.getName();// 属性名
Iterator<String> column = c1.iterator();// 属性,对应一条记录的字段
while (column.hasNext()) {
if (column.next().equals(fieldName)) {
String getMethodName = "get" + fieldName.substring(0, 1).toUpperCase() + fieldName.substring(1);// 取得属性的get方法
Class tClass = l.getClass();
try {
// 通过JavaBean对象拿到该属性的get方法,从而进行操控
Method getMethod = tClass.getDeclaredMethod(getMethodName, new Class[] {});
// 操控该对象属性的get方法,从而拿到属性值
Object val = getMethod.invoke(l, new Object[] {});
if (val != null) {
if(val instanceof Date){
SimpleDateFormat format=new SimpleDateFormat(DateUtil.DEFAULT_DATETIME_FORMAT);
row.createCell(j).setCellValue(format.format(val));
} else if(val instanceof Integer){
row.createCell(j).setCellValue(Integer.parseInt(String.valueOf(val)));
} else if(val instanceof Long){
row.createCell(j).setCellValue(Long.parseLong(String.valueOf(val)));
} else {
row.createCell(j).setCellValue(String.valueOf(val));
}
}else{
row.createCell(j).setCellValue("");
}
j++;
} catch (Exception e) {
e.printStackTrace();
}
}
}

}
}
// 设置自动调整列宽,必须在填值之后
for (int j = 0; j < headersName.size(); j++) {
sheet.autoSizeColumn(j);
}
// 中文自动调整列宽
this.setSizeColumn(sheet, headersName.size());
}

2、导出excel工具类,使用JSONObject,

/**
* @Title: createSheet1
* @Description: 生成一个sheet
* @param sheet
* @param headersName excel要显示的表头
* @param headersId : 对应表头,要显示对象的属性
* @param list 数据
* @return: void
*/
public void createSheet1(HSSFSheet sheet, List<String> headersName, List<String> headersId, List<JSONObject> list){
HSSFRow row1=sheet.createRow(0);
//表头-----------------------------------------------------------------------
for(int i=0;i<headersName.size();i++){
row1.createCell(i).setCellValue(headersName.get(i));
}
//记录-----------------------------------------------------------------------
for(int i=0;i<list.size();i++){
HSSFRow row=sheet.createRow(i+1);
//取出一条记录的JSONObject
JSONObject jsonObj=list.get(i);
for(int j=0;j<headersId.size();j++){
//根据要显示的字段属性在json对象取得对应的值
Object val=jsonObj.get(headersId.get(j));
if (val != null) {
//格式处理
if(val instanceof Date){
SimpleDateFormat format=new SimpleDateFormat(DateUtil.DEFAULT_DATETIME_FORMAT);
row.createCell(j).setCellValue(format.format(val));
} else if(val instanceof Integer){
row.createCell(j).setCellValue(Integer.parseInt(String.valueOf(val)));
} else if(val instanceof Long){
//判断是否是时间戳(因将对象装换为json对象 会将时间格式装换为时间戳,这里判断是否是13位来判断,如果是做时间格式处理),这样处理室友问题的但是暂时还没找到更好的//办法,好希望有人能指点啊
if(getCount(Long.parseLong(String.valueOf(val))) ==13){
SimpleDateFormat format=new SimpleDateFormat(DateUtil.DEFAULT_DATETIME_FORMAT);
row.createCell(j).setCellValue(format.format(val));
}else{
row.createCell(j).setCellValue(Long.parseLong(String.valueOf(val)));
}
} else {
row.createCell(j).setCellValue(String.valueOf(val));
}
}else{
row.createCell(j).setCellValue("");
}
}
}
}

//用到的方法----------------------------------------------------------------------------------------------------------------------

//取num的位数
public static int getCount(Long num){
if(num <= 0){
return 0;
}
int count=0;
while(num > 0){
num=num/10;
count++;
}
return count;
}

// 自适应宽度(中文支持)
private void setSizeColumn(HSSFSheet sheet, int size) {
for (int columnNum = 0; columnNum < size; columnNum++) {
int columnWidth = sheet.getColumnWidth(columnNum) / 256;
for (int rowNum = 0; rowNum < sheet.getLastRowNum(); rowNum++) {
HSSFRow currentRow;
// 当前行未被使用过
if (sheet.getRow(rowNum) == null) {
currentRow = sheet.createRow(rowNum);
} else {
currentRow = sheet.getRow(rowNum);
}

if (currentRow.getCell(columnNum) != null) {
HSSFCell currentCell = currentRow.getCell(columnNum);
if (currentCell.getCellType() == HSSFCell.CELL_TYPE_STRING) {
int length = currentCell.getStringCellValue().getBytes().length;
if (columnWidth < length) {
columnWidth = length;
}
}
}
}
sheet.setColumnWidth(columnNum, columnWidth * 256);
}
}

2.1、使用第一种工具类,

// 导出excel
public void createExcel(OutputStream os, Map<String, Object> data) throws Exception {
// 数据准备
List<WidespreadDelay> wdDelays = (List<WidespreadDelay>) data.get("wdDelays");

// 创建文档
HSSFWorkbook wb = new HSSFWorkbook();
// 创建sheet
HSSFSheet sheet1 = wb.createSheet("大面积延误信息");
List<String> headersName1 = Arrays.asList("ID", "开始时间", "结束时间", "状态", "创建时间", "用户ID");
List<String> headersId1 = Arrays.asList("id", "beginTime", "endTime", "status", "createTime", "userId");

//调用工具类生成sheet
ExportExcel<WidespreadDelay> e = new ExportExcel<>();
e.createSheet(sheet1, headersName1, headersId1, wdDelays);

wb.write(os);
}

2.2 使用第二种工具类

// 导出excel
public void createExcel(OutputStream os, Map<String, Object> data) throws Exception {
// 数据准备
List<WidespreadDelay> wdDelays = (List<WidespreadDelay>) data.get("wdDelays");

// 创建文档
HSSFWorkbook wb = new HSSFWorkbook();

// 创建sheet
HSSFSheet sheet1 = wb.createSheet("大面积延误信息");
List<String> headersName1 = Arrays.asList("ID", "开始时间", "结束时间", "状态", "创建时间", "用户ID");
List<String> headersId1 = Arrays.asList("id", "beginTime", "endTime", "status", "createTime", "userId");

//需要将对象装换为JSONObject
List<JSONObject> jsonList=new ArrayList<>(wdDelays.size());
for(WidespreadDelay d:wdDelays){
JSONObject o=JSONObject.parseObject(JSON.toJSONString(d));
jsonList.add(o);
}

ExportExcel e = new ExportExcel();
e.createSheet1(sheet1, headersName1, headersId1, jsonList);

wb.write(os);
}

--------------------------------------------------------------

ps:这个方法是昨天下午下班时一位同事告诉我的思路,

-----------------------------------------------------------------------------------一条成熟的分割线----------------------------------------------------------------------------------------------------

贴我的导出excel和pdf的代码:

/** 导出接口 ,ids:id。 type:导出类型,默认导出pdf */
@RequestMapping("/Flight/delay/export")
public ResponseMessage exportWD(HttpServletResponse response, String[] ids, String type) throws Exception {
if (CollectionUtil.isEmpty(ids)) {
return toReturnException();
}
OutputStream os = null;
try {
//根据id查询需要导出的数据,如果为空,返回异常
Map<String, Object> data = flightWDHistoricRecordService.findAll(ids);
List<WidespreadDelay> wdDelays = (List<WidespreadDelay>) data.get("wdDelays");
if (CollectionUtil.isEmpty(wdDelays)) {
return toReturnException();
}
//导出类型,xls表示导出excel,否则导出pdf
if (StringUtil.isNotEmpty(type) && "xls".equals(type)) {
String filename = "大面积延误历史记录详情.xls";
// 指定解析器
response.setHeader("Content-disposition",
"attachment; filename=" + URLEncoder.encode(filename, "UTF-8"));
response.setContentType("application/msexcel");
os = new BufferedOutputStream(response.getOutputStream());
createExcel(os, data);
} else {
// 指定解析器
System.setProperty("javax.xml.parsers.DocumentBuilderFactory",
"com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderFactoryImpl");
String filename = "大面积延误历史记录详情.pdf";
response.setContentType("application/pdf");
response.setHeader("Content-Disposition",
"attachment;fileName=" + URLEncoder.encode(filename, "UTF-8"));
os = new BufferedOutputStream(response.getOutputStream());
createPdf(os, data);
}
os.flush();
} catch (Exception e) {
e.printStackTrace();
} finally {
os.close();
}
return null;
}

// 导出pdf
public void createPdf(OutputStream os, Map<String, Object> data) throws Exception {
// 数据准备
List<WidespreadDelay> wdDelays = (List<WidespreadDelay>) data.get("wdDelays");
Map<String, List<WdBoard>> wdBoardMap = (Map<String, List<WdBoard>>) data.get("wdBoardMap");
Map<String, List<WdReducebatch>> reduceMap = (Map<String, List<WdReducebatch>>) data.get("reduceMap");
Map<String, List<WdReducebatchAirline>> airlinesMap = (Map<String, List<WdReducebatchAirline>>) data
.get("airlinesMap");
Map<String, List<WdReducebatchAirlineFlight>> flightsMap = (Map<String, List<WdReducebatchAirlineFlight>>) data
.get("flightsMap");
Document document = new Document();
PdfWriter writer = PdfWriter.getInstance(document, os);
// 页面大小
Rectangle rectangle = new Rectangle(PageSize.A4);
// 页面背景颜色
rectangle.setBackgroundColor(BaseColor.WHITE);
document.setPageSize(rectangle);
// 页边距 左,右,上,下
document.setMargins(20, 20, 20, 20);
document.open();
// 显示中文
// BaseFont bf = BaseFont.createFont("STSong-Light",
// "UniGB-UCS2-H",BaseFont.NOT_EMBEDDED);
// 微软雅黑 --资源文件中
BaseFont bf = BaseFont.createFont("/MSYH.TTF", BaseFont.IDENTITY_H, BaseFont.NOT_EMBEDDED);
// 标题----------------------------------------------------------------
Font font = new Font(bf, 14, Font.BOLD, BaseColor.BLACK);
Paragraph title = new Paragraph("大面积延误历史记录详情", font);
// 居中
title.setAlignment(Element.ALIGN_CENTER);
document.add(title);
// 副标题----------------------------------------------------------------
Font font2 = new Font(bf, 6, Font.NORMAL, BaseColor.BLACK);
List<String> list = new ArrayList<>();
for (WidespreadDelay w : wdDelays) {
list.add(w.getId());
}
int num = 1;
for (WidespreadDelay wdealy : wdDelays) {
if (num > 1) {
document.newPage();
}
num++;
String start = "开始:" + DateUtil.format(wdealy.getBeginTime(), DateUtil.DEFAULT_DATETIME_FORMAT) + " | ";
String end = "结束:" + DateUtil.format(wdealy.getEndTime(), DateUtil.DEFAULT_DATETIME_FORMAT) + " | ";
//计算两个时间相差的时间
Integer diff = FilghtRuleTools.getDiffDateSeoncds(wdealy.getBeginTime(), wdealy.getEndTime());
int hour = 0;
int minutes = 0;
int seconds = 0;
if (diff != null) {
hour = (diff / 60) / 60;
minutes = (diff / 60) % 60;
seconds = ((diff / 60) / 60) % 60;
}
String chang = "时长:" + hour + "小时" + minutes + "分钟" + seconds + "秒";
Paragraph title2 = new Paragraph(start + end + chang, font2);
title2.setSpacingAfter(15);
title2.setSpacingBefore(15);
title2.setAlignment(Element.ALIGN_CENTER);
document.add(title2);

// 表格1----------------------------------------------------------------------------------------------------------------
float[] tableNums = { 0.04f, 0.1f, 0.12f, 0.12f, 0.12f, 0.12f, 0.12f, 0.12f, 0.14f };
// 表头----------------------------
String[] table1Headers = { "序号", "动态时段", "关舱门(实际/计划)", "登机(实际/计划)", "未登机(实际/计划)", "预计流量(开始/结束)", "本小时计划起飞",
"本小时实际起飞", "航班积压量(开始/结束)" };
PdfPTable table1 = getPdfTableHeader(tableNums,table1Headers,bf,14);
// 根据查大面积延误看板的记录-----------------------------------
List<WdHistoricWdBoardVo> wds = getWdBoardPer(wdBoardMap.get(wdealy.getId()));
String dateformat = "HH:mm";
// 表格字体
Font font4 = new Font(bf, 6, Font.NORMAL, BaseColor.BLACK);
if (CollectionUtil.isNotEmpty(wds)) {
for (int i = 1; i <= wds.size(); i++) {
WdHistoricWdBoardVo wd = wds.get(i - 1);
// 序号
Paragraph p1 = new Paragraph(i + "", font4);
// p1.setAlignment(Element.ALIGN_CENTER);
table1.addCell(p1);
// 动态时段
p1 = new Paragraph(wd.getSomeTime(), font4);
table1.addCell(p1);
// 关舱门
p1 = new Paragraph(
wd.getCloseDoorPer() + "% 【" + wd.getCloseDoorUsed() + "/" + wd.getCloseDoorTotal() + "】",
font4);
table1.addCell(p1);
// 登机
p1 = new Paragraph(
wd.getBoardingUsedPer() + "% 【" + wd.getBoardingUsed() + "/" + wd.getBoardingTotal() + "】",
font4);
table1.addCell(p1);
// 未登机
p1 = new Paragraph(wd.getUnboardingUsedPer() + "% 【" + wd.getUnboardingUsed() + "/"
+ wd.getBoardingTotal() + "】", font4);
table1.addCell(p1);
// 预计流量
p1 = new Paragraph(wd.getEstimateFloat() + "", font4);
table1.addCell(p1);
// 本小时计划起飞
p1 = new Paragraph(wd.getDeparturePlan() + "", font4);
table1.addCell(p1);
// 本小时实际起飞
p1 = new Paragraph(wd.getDepartureActual() + "", font4);
table1.addCell(p1);
// 航班积压量
p1 = new Paragraph(wd.getBackFlight() + "", font4);
table1.addCell(p1);
}
document.add(table1);
}
// 表格2---------------------------------------------------------------------------------
float[] tableNums2 = { 0.04f, 0.08f, 0.11f, 0.11f, 0.11f, 0.11f, 0.11f, 0.11f, 0.11f, 0.11f };
// 表头----------------------------
String[] table2Headers = { "轮次", "总调减", "中国航空(CA)", "四川航空(3U)", "东方航空(MU)", "南方航空(CZ)", "成都航空(EU)",
"西藏航空(TV)", "深圳航空(ZH)", "祥鹏航空(8L)" };
PdfPTable table2 = getPdfTableHeader(tableNums2,table2Headers,bf,16);
table2.setSpacingBefore(15);
// 1\根据大面积延误id查询调减轮次--
List<WdReducebatch> reducebatchs = reduceMap.get(wdealy.getId());
if (CollectionUtil.isNotEmpty(reducebatchs)) {
reducebatchs.sort((o1, o2) -> o1.getReduceplanNo().compareTo(o2.getReduceplanNo()));
for (int i = 0; i < reducebatchs.size(); i++) {
// 一轮,根据轮次id查找航空公司的调减数据
List<WdReducebatchAirline> airline = null;
if (airlinesMap.containsKey(reducebatchs.get(i).getId())) {
airline = airlinesMap.get(reducebatchs.get(i).getId());
}
if (CollectionUtil.isNotEmpty(airline)) {
// 排序-航空公司
List<WdReducebatchAirline> airlines = sortByAirline(airline);
Integer max = getMaxReduceFlight(airline);
// 轮次
Paragraph p = new Paragraph(reducebatchs.get(i).getReduceplanNo() + "", font4);
PdfPCell cell1 = new PdfPCell(p);
cell1.setHorizontalAlignment(Element.ALIGN_CENTER);
cell1.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell1.setRowspan(max);
table2.addCell(cell1);
// 总调减
p = new Paragraph(
reducebatchs.get(i).getAntualReduce() + "/" + reducebatchs.get(i).getPlanReduce(),
font4);
cell1 = new PdfPCell(p);
cell1.setHorizontalAlignment(Element.ALIGN_CENTER);
cell1.setUseAscender(true);
cell1.setVerticalAlignment(Element.ALIGN_MIDDLE);
cell1.setRowspan(max);
table2.addCell(cell1);

List<String> searchFlights = new ArrayList<>();
Map<String, String> airlineCode = new HashMap<>();
// 调减信息
for (WdReducebatchAirline line : airlines) {
// 用于查询
searchFlights.add(line.getId());
airlineCode.put(line.getId(), line.getAirlineIcao());

p = new Paragraph(line.getReduceActure() + "/" + line.getReducePlan(), font4);
table2.addCell(p);
}
// 批量查询 航空公司的调减航班,根据航空公司的的id查询,并分组
if (max > 1 && CollectionUtil.isNotEmpty(flightsMap)) {
List<List<WdReducebatchAirlineFlight>> flightsList = sortByAirline(flightsMap, airlineCode);
// 调减的航班信息
for (int j = 0; j < max - 1; j++) {
for (int k = 0; k < flightsList.size(); k++) {
List<WdReducebatchAirlineFlight> flist = flightsList.get(k);
if (CollectionUtil.isNotEmpty(flist) && flist.size() > j && flist.get(j) != null) {
Paragraph p2 = new Paragraph(
flist.get(j).getFlightNo() + "/"
+ DateUtil.format(flist.get(j).getCreateTime(), dateformat),
font4);
table2.addCell(p2);
} else {
table2.addCell("");
}
}
}
}
}
}
document.add(table2);
}
}
document.close();
}

// 导出excel
public void createExcel(OutputStream os, Map<String, Object> data) throws Exception {
// 数据准备
List<WidespreadDelay> wdDelays = (List<WidespreadDelay>) data.get("wdDelays");
Map<String, List<WdBoard>> wdBoardMap = (Map<String, List<WdBoard>>) data.get("wdBoardMap");
Map<String, List<WdReducebatch>> reduceMap = (Map<String, List<WdReducebatch>>) data.get("reduceMap");
Map<String, List<WdReducebatchAirline>> airlinesMap = (Map<String, List<WdReducebatchAirline>>) data
.get("airlinesMap");
Map<String, List<WdReducebatchAirlineFlight>> flightsMap = (Map<String, List<WdReducebatchAirlineFlight>>) data
.get("flightsMap");

// 创建文档
HSSFWorkbook wb = new HSSFWorkbook();
// 创建sheet
HSSFSheet sheet1 = wb.createSheet("大面积延误信息");
List<String> headersName1 = Arrays.asList("ID", "开始时间", "结束时间", "状态", "创建时间", "用户ID");
List<String> headersId1 = Arrays.asList("id", "beginTime", "endTime", "status", "createTime", "userId");
ExportExcel<WidespreadDelay> e = new ExportExcel<>();
e.createSheet(sheet1, headersName1, headersId1, wdDelays);

// ------------大面积延误看板--------------
HSSFSheet sheet2 = wb.createSheet("大面积看板");
List<String> headersName2 = Arrays.asList("ID", "延误信息ID", "开始时间", "结束时间", "计划起飞", "实际起飞", "预计流量", "航班积压量",
"旅客积压量", "关舱门总数", "已关舱门", "登机总数", "已登机", "未登机");
List<String> headersId2 = Arrays.asList("id", "widespreadDelayId", "beginTime", "endTime", "departurePlan",
"departureActual", "estimateFloat", "backFlight", "passager", "closeDoorTotal", "closeDoorUsed",
"boardingTotal", "boardingUsed", "unboardingUsed");
List<WdBoard> listWD = new ArrayList<>();
for (Map.Entry<String, List<WdBoard>> item : wdBoardMap.entrySet()) {
listWD.addAll(item.getValue());
}
ExportExcel<WdBoard> e2 = new ExportExcel<>();
e2.createSheet(sheet2, headersName2, headersId2, listWD);

// ------------调减信息--------------
HSSFSheet sheet3 = wb.createSheet("调减轮次");
List<String> headersName3 = Arrays.asList("ID", "延误信息ID", "开始时间", "结束时间", "创建时间", "轮次编号", "本轮总实际调减", "本轮总计划调减");
List<String> headersId3 = Arrays.asList("id", "widespreadDelayId", "beginTime", "endTime", "createTime",
"reduceplanNo", "antualReduce", "planReduce");
List<WdReducebatch> listReduce = new ArrayList<>();
for (Map.Entry<String, List<WdReducebatch>> item : reduceMap.entrySet()) {
listReduce.addAll(item.getValue());
}
ExportExcel<WdReducebatch> e3 = new ExportExcel<>();
e3.createSheet(sheet3, headersName3, headersId3, listReduce);

// ------------航空公司调减信息--------------
HSSFSheet sheet4 = wb.createSheet("航空公司调减信息");
List<String> headersName4 = Arrays.asList("ID", "调减轮次ID", "航空公司", "计划调减", "实际调减", "创建时间");
List<String> headersId4 = Arrays.asList("id", "wdReducebatchId", "airlineIcao", "reducePlan", "reduceActure",
"createTime");
List<WdReducebatchAirline> airlineReduce = new ArrayList<>();
for (Map.Entry<String, List<WdReducebatchAirline>> item : airlinesMap.entrySet()) {
airlineReduce.addAll(item.getValue());
}
ExportExcel<WdReducebatchAirline> e4 = new ExportExcel<>();
e4.createSheet(sheet4, headersName4, headersId4, airlineReduce);

// ------------航空公司调减信息--------------
HSSFSheet sheet5 = wb.createSheet("调减航班信息");
List<String> headersName5 = Arrays.asList("ID", "航空公司调减信息ID", "flightId", "航班号", "创建时间");
List<String> headersId5 = Arrays.asList("id", "wdReducebatchAirlineId", "flightId", "flightNo", "createTime");
List<WdReducebatchAirlineFlight> flightsReduce = new ArrayList<>();
for (Map.Entry<String, List<WdReducebatchAirlineFlight>> item : flightsMap.entrySet()) {
flightsReduce.addAll(item.getValue());
}
ExportExcel<WdReducebatchAirlineFlight> e5 = new ExportExcel<>();
e5.createSheet(sheet5, headersName5, headersId5, flightsReduce);
wb.write(os);
}

/** 导出pdf 时生成表格header */
public PdfPTable getPdfTableHeader(float[] tableNums, String[] table1Headers, BaseFont bf,float height) {
// 生成表格
PdfPTable table1 = new PdfPTable(tableNums);
// 设置表格宽度
table1.setWidthPercentage(100);
// 设置表格样式
table1.setHorizontalAlignment(Element.ALIGN_CENTER);
table1.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER);
// 设置表头内容
for (int i = 0; i < table1Headers.length; i++) {
Font font3 = new Font(bf, 6, Font.NORMAL, BaseColor.WHITE);
Paragraph p1 = new Paragraph(table1Headers[i], font3);
PdfPCell cell = new PdfPCell(p1);
// 设置表头单元格样式
cell.setBackgroundColor(BaseColor.BLACK);
cell.setHorizontalAlignment(Element.ALIGN_CENTER);
cell.setFixedHeight(height);
table1.addCell(cell);
}
return table1;
}

。。。。。。。。。

然后我同事说,pdf提成工具类,我在想这特么整么弄,,,

java使用poi导出excel的更多相关文章

  1. Java之POI导出Excel(一):单sheet

    相信在大部分的web项目中都会有导出导入Excel的需求,今天我们就来看看如何用Java代码去实现 用POI导出Excel表格. 一.pom引用 pom文件中,添加以下依赖 查看代码  <!-- ...

  2. java解决poi导出excel文字水印,导出excel不可操作问题

    首先需求是用户提出导出excel数据需使用水印备注其用途: 其实就是在导出excel的同时带有自定义文字水印的导出. 那么我们首先想到的肯定是以一个什么样的思路去解决该问题,首先查找poi导出exce ...

  3. Java使用POI导出excel(下)——实例与小技巧

    [更新]:thinkgem的导出工具类: /** * Copyright © 2012-2016 <a href="https://github.com/thinkgem/jeesit ...

  4. java springmvc poi 导出Excel,先简单记录,后期会详细描写

    POI jar包下载 : http://poi.apache.org/download.html jsp代码 <%@ page language="java" content ...

  5. Java之POI导出Excel(二):多个sheet

    相信在大部分的web项目中都会有导出导入Excel的需求,之前我也写过一篇导出单个sheet工作表的文章,没看过的小伙伴可以去看哈,链接也给大家放出来了:导出单个sheet 但是在我们日常的工作中,需 ...

  6. Java使用POI导出excel(上)——基本操作

    相关的介绍参考自:http://zc985552943.iteye.com/blog/1491546 一.概述 1.概念 受上文博文博主的启发,有必要先对excel的各个概念先做了解! //上述基本都 ...

  7. Java之Poi导出Excel文档

    一.Poi简介 在后台管理系统中,我们经常要做的导出操作,通常导出为Excel文档的形式,而Poi则提供了这种需要的支持. 二.Workbook/HSSFWorkbook/XSSFWorkbook 1 ...

  8. java用POI导出Excel

    架构SSM + Maven 一.添加依赖: <dependency> <groupId>org.apache.poi</groupId> <artifactI ...

  9. java 使用poi导出Excel,设置单元格保护不可编辑

    //sheet表加密:等效excel的审阅菜单下的保护工作表 sheet.protectSheet(new String("333"));//333是密码 更多设置请参考:http ...

随机推荐

  1. 8.1 GOF 设计模式:关于设计模式

    关于设计模式…Design Pattern  追求永恒的美1.1 “模式”一词的起源 “每个模式描述了: 一个在我们周围反复出现的问题, 然后是针对这个问题的解决方案. 这样,其他人可以无数次地反复 ...

  2. Vue的父子组件间通信及借助$emit和$on解除父子级通信的耦合度高的问题

    1.父子级间通信,父类找子类非常容易,直接在子组件上加一个ref,父组件直接通过this.$refs操作子组件的数据和方法    父 这边子组件中 就完成了父 => 子组件通信 2. 子 =&g ...

  3. 小程序批量获取input的输入值,监听输入框,数据同步

    在使用小程序时,跟vue的数据绑定不一样,没有v-model这个属性了,官网也只是给了一些事件监听. 但是我们如果有多个表单时,需要写多个事件来同步数据.这样做很麻烦.下面的方法可以解决,只需要一个方 ...

  4. subline 建立服务器

    http://blog.csdn.net/csdn_chenli/article/details/53173953

  5. <a> 标签详解

    一.<a> 标签的样式 在所有浏览器中,链接的默认外观是: 未被访问的链接带有下划线而且是蓝色的 已被访问的链接带有下划线而且是紫色的 活动链接带有下划线而且是红色的 我们可以使用CSS伪 ...

  6. python_vlc 播放http流

    由于工作需要,项目功能测试用到python调用vlc,用于播放一些直播流,各种尝试后终于可以了,其实蛮简单的,就是由于没有参考自己折腾挺浪费时间的,所以把结果贴出来给需要用到的人. 准备工作: 1.首 ...

  7. mongodb数据库操作方法

    // Schema.Model.Entity或者Documents的关系请牢记,Schema生成Model,Model创造Entity,Model和Entity都可对数据库操作造成影响,但Model比 ...

  8. 【Monkey】Monkey基础概念

    1.什么是Monkey? 发送伪随机用户事件的命令 2.Monkey在哪? 在手机系统里 3.什么是ADB? 4.MonkeyScript 一组可以被Monkey识别的命令集合,可以完成重复固定的操作 ...

  9. mysql排序之ORDER BY IF、ORDER BY配合IN、TIMESTAMPDIFF、TIMESTAMPADD、FIELD

    1.order by if 排序 SELECT * FROM pet ORDER BY if (species='snake',0,1),species;--species为snake的行数放置到了查 ...

  10. Property Exercise

    要求一:自定义用户信息数据结构,写入文件,然后读出内容,利用eval重新获取数据结构 3 with open('user.db','w') as write_file:#创建并以写入的方式打开一个文件 ...