当前位置: 首页 > news >正文

使用Apache POI数据导出及EasyExcel进行十万、百万的数据导出

文章目录

    • Apache POI
      • 使用
    • EasyExcel
      • 工具类easyExcel
      • 工具类poi

Apache POI

Apache POI 是基于 Office Open XML 标准( OOXML )和 Microsoft 的 OLE 2 复合⽂档
格式( OLE2 )处理各种⽂件格式的开源项⽬。 简⽽⾔之,您可以使⽤ Java 读写
MS Excel ⽂件,可以使⽤ Java 读写 MS Word 和 MS PowerPoint ⽂件。

1.HSSF - 提供读写 Microsoft Excel XLS 格式 (Microsoft Excel 97 (-2003)) 档案的功
能。
2. XSSF - 提供读写 Microsoft Excel OOXML XLSX 格式 (Microsoft Excel XML (2007+))
档案的功能。
3.SXSSF - 提供低内存占⽤量读写 Microsoft Excel OOXML XLSX 格式档案的功能。
4.HWPF - 提供读写 Microsoft Word DOC97 格式 (Microsoft Word 97 (-2003)) 档案的
功能。
5.XWPF - 提供读写 Microsoft Word DOC2003 格式 (WordprocessingML (2007+)) 档
案的功能。
6.HSLF/XSLF - 提供读写 Microsoft PowerPoint 格式档案的功能。
7.HDGF/XDGF - 提供读 Microsoft Visio 格式档案的功能。
8.HPBF - 提供读 Microsoft Publisher 格式档案的功能。
9.HSMF - 提供读 Microsoft Outlook 格式档案的功能。

缺点:
java解析,生成Excel比较有名的框架有 POI ,JXL,但他们有一个严重的问题,就是 非常消耗内存, 也就是说数据量比较大的情况下有的时候会出现OOM(全称“Out Of Memory”,翻译成中文就是“内存用完了” )的问题。

使用

导入依赖包:

 <!--EXCEL导入导出 -->
<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>3.17-beta1</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.17-beta1</version>
</dependency>
<dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>3.17-beta1</version>
</dependency>

注意:3.8版本才引入了SXSSF的使用
工具类:ExportExcel.java(放在文章结尾)

使用:

public ResponseResult reportUploadListPage(String structureName, String monitorName, String deviceName, Stringstate, String startTime, String endTime) {//查询数量int count = this.getUploadListCount(structureName, monitorName, deviceName, state, startTime, endTime);String[] showName = null;String[] resourceFild = null;List<UploadRecord> uploadRecordDtos = null;ArrayList<String> strings = new ArrayList<>();try {if (count > 200000) {return ResponseResult.failure("数据量过大!请控制在20万以内");}if (count > 0) {showName = new String[]{"监测项目名称", "监测时间", "水工建筑物", "测点名称(设备名称)","测点编号", "测值1说明", "测值1", "测值2说明", "测值2", "测值3说明", "测值3","状态", "上传时间"};resourceFild = new String[]{"getMonitorName", "getMonitorTime", "getStructureName", "getDeviceName","getDeviceName2", "getMonitorExplain1", "getMonitorValue1", "getMonitorExplain2", "getMonitorValue2", "getMonitorExplain3", "getMonitorValue3","getStateValue", "getUploadTime"};int num = 0;if (count % 10000 == 0) {num = count % 10000;} else {num = count / 10000 + 1;}for (int k = 0; k < num; k++) {Page<UploadRecord> uploadListPage = this.getUploadListPage(k + 1, 10000, structureName, monitorName, deviceName, state, startTime, endTime);uploadRecordDtos = uploadListPage.getRecords();List<UploadRecordDto> collect = uploadRecordDtos.stream().map(uploadRecord -> {UploadRecordDto uploadRecordDto = new UploadRecordDto();BeanUtil.copyProperties(uploadRecord, uploadRecordDto);if (uploadRecord.getState() == 0) {uploadRecordDto.setStateValue("未上传");} else {uploadRecordDto.setStateValue("已上传");}return uploadRecordDto;}).collect(Collectors.toList());Workbook workbook = ExportExcel.getWorkbookXlsx(collect, showName, resourceFild, UploadRecordDto.class,null);ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();workbook.write(byteArrayOutputStream);byte[] bytes = byteArrayOutputStream.toByteArray();MinioUploadDto minioUploadDto = minioService.upload("水利部导出数据" + (k + 1) + ".xlsx", bytes, "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet");byteArrayOutputStream.flush();byteArrayOutputStream.close();strings.add(minioUploadDto.getUrl());}}} catch (Exception e) {e.printStackTrace();throw new BusinessException("数据导出异常");}return ResponseResult.success(strings);}

由于基本的XSSF单次只能导出65535,数据量有限而且极其容易报OOM的异常。测试的时候甚至2万条数据就OOM,当然和jvm的内存是有关的。后来使用SXSSF可以解决这个问题。

EasyExcel

EasyExcel 是⼀个基于 Java 的简单、省内存的读写 Excel 的开源项⽬。在尽可能节约内
存的情况下⽀持读写百 M 的 Excel 。
github 地址: https://github.com/alibaba/easyexcel
官⽅⽹站: https://easyexcel.opensource.alibaba.com/

使用:

<!--EXCEL导入导出 --><dependency><groupId>com.alibaba</groupId><artifactId>easyexcel</artifactId><version>2.0.5</version></dependency>
 Integer count = uploadRecordService.getUploadListCount(structureName, monitorName, deviceName, state, startTime, endTime);int num = 0;List<UploadRecordDto> uploadRecordDtos = new ArrayList<>(); //集合赋值的步骤已省略if (count > 300000) {return ResponseResult.failure("数据量过大,请控制在30万内!");}try {return ResponseResult.success(EasyExcelUtils.exportExcel(response, uploadRecordDtos, UploadRecordDto.class, "sheetName"));} catch (Exception e) {e.printStackTrace();return ResponseResult.failure("导出失败");}

UploadRecordDto.java中需要增加注解

@Data
public class UploadRecordDto implements Serializable {@ExcelIgnoreprivate static final long serialVersionUID = 2545145641431449276L;/*** 监测项目编码*/@ExcelIgnore     //导出时忽视该字段private String monitorCode;/*** 监测项目名称*/@ExcelProperty(value = "监测项目名称", index = 0)  //value 导出的标题    index为顺序索引private String monitorName;/*** 水工建筑物名称*/@ExcelProperty(value = "水工建筑物", index = 2)private String structureName;/*** 测点设备名*/@ExcelProperty(value = "测点名称(设备名称)", index = 3)private String deviceName;/*** 测点设备别名*/@ExcelProperty(value = "测点编号", index = 1)private String deviceName2;
}

EasyExcel的速度要比poi快很多,并且不会出现oom的异常。

工具类easyExcel

EasyExcelUtils.java

package com.youming.shuiku.upload.business.utils;import com.alibaba.excel.EasyExcel;
import com.alibaba.excel.ExcelWriter;
import com.alibaba.excel.write.builder.ExcelWriterSheetBuilder;
import com.alibaba.excel.write.metadata.WriteSheet;
import com.alibaba.excel.write.metadata.style.WriteCellStyle;
import com.alibaba.excel.write.metadata.style.WriteFont;
import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.ss.usermodel.HorizontalAlignment;
import org.apache.poi.ss.usermodel.IndexedColors;
import org.apache.poi.ss.usermodel.VerticalAlignment;import javax.servlet.http.HttpServletResponse;
import java.io.UnsupportedEncodingException;
import java.net.URLEncoder;
import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Random;/***** easyExcel工具类* 可用于文件的上传以及下载*/
@Slf4j
public class EasyExcelUtils {// 时间格式化private static final String DEFAULT_DATE_FORMAT = "yyyyMMddHHmm";static DateTimeFormatter formatter3 = DateTimeFormatter.ofPattern(DEFAULT_DATE_FORMAT);static  DateTimeFormatter formatter2 = DateTimeFormatter.ofPattern("yyyyMM");// 每个sheet的容量,超过100000就会把数据分给其他sheetprivate static final int PAGE_SIZE = 100000;//随机数public static Random random = new Random();/**** 文件的导出(使用之前需要传入生成excel的数据,以及当前数据的类别以及当前数据的实体类----可以使用注解生成表头的标题@ExcelProperty)* @param response* @param data 生成excel的数据* @param excelClass 当前数据的实体类,方便使用注解生成表头* @param <T>* @return* @throws Exception*/public static <T> String exportExcel(HttpServletResponse response, List<?> data,Class<?> excelClass,String sheetName) throws Exception{// 获取当前的时间LocalDateTime localDateTime=LocalDateTime.now();//获取应该随机数,避免文件名称一致int randomCode = random.nextInt(899999) + 100000;//文件名String fileName=String.format("%s%d.xlsx",formatter3.format(localDateTime),randomCode);//文件路径String newName = String.format("data-export/timescard/%s/%s", formatter2.format(localDateTime), fileName);// 把查询到的数据按设置的sheet的容量进行切割List<? extends List<?>> lists = splitList(data, PAGE_SIZE);// 设置响应头setHead(response, fileName);ExcelWriter excelWriter = EasyExcel.write(response.getOutputStream(), excelClass).registerWriteHandler(formatExcel()).registerConverter(new ListConverter()).registerConverter(new LocalDateStringConverter()).registerWriteHandler(formatExcel()).build();ExcelWriterSheetBuilder excelWriterSheetBuilder;WriteSheet writeSheet;for (int i = 1; i <= lists.size(); ++i) {excelWriterSheetBuilder = new ExcelWriterSheetBuilder(excelWriter);excelWriterSheetBuilder.sheetNo(i).sheetName(sheetName+i);writeSheet = excelWriterSheetBuilder.build();excelWriter.write(lists.get(i - 1), writeSheet);}// 必须要finish才会写入,不finish只会创建empty的文件excelWriter.finish();return "导出成功";}/*** 写入数据* @param excelWriter excelWriter*/public static void writeData(ExcelWriter excelWriter,List<? extends List<?>> lists,List<String> excelClass,String summary){WriteSheet writeSheet = new WriteSheet();//设置写到第几个sheet//设置表头List<List<String>> headList = new ArrayList<>();String name = summary;for (String excelCla : excelClass) {headList.add(Arrays.asList(name,excelCla));}writeSheet.setHead(headList);for (int i = 1; i <= lists.size(); ++i) {writeSheet.setSheetNo(i);writeSheet.setSheetName("sheetName"+i);excelWriter.write(lists.get(i - 1), writeSheet);}}/*** 设置响应头* @param response 回应的请求数据* @param fileName 文件名字*/public static void setHead(HttpServletResponse response, String fileName) {response.setContentType("application/json");response.setCharacterEncoding("utf-8");// 这里URLEncoder.encode可以防止中文乱码try {fileName = URLEncoder.encode(fileName, "UTF-8");} catch (UnsupportedEncodingException e) {e.printStackTrace();log.error("编码异常");}response.setHeader("Content-disposition", "attachment;filename=" + fileName);}/*** 设置Excel的格式** @return 格式化后的Excel*/public static HorizontalCellStyleStrategy formatExcel() {WriteCellStyle headWriteCellStyle = new WriteCellStyle();headWriteCellStyle.setFillBackgroundColor(IndexedColors.WHITE.getIndex());WriteFont headWriteFont = new WriteFont();headWriteFont.setFontHeightInPoints((short) 10);headWriteCellStyle.setWriteFont(headWriteFont);// 内容的策略WriteCellStyle contentWriteCellStyle = new WriteCellStyle();WriteFont contentWriteFont = new WriteFont();// 字体大小contentWriteFont.setFontHeightInPoints((short) 10);contentWriteCellStyle.setWriteFont(contentWriteFont);// 设置自动换行contentWriteCellStyle.setWrapped(false);// 设置垂直居中contentWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);// 设置水平居中contentWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);return new HorizontalCellStyleStrategy(headWriteCellStyle, contentWriteCellStyle);}/*** 切割查询的数据* @param list 需要切割的数据* @param len 按照什么长度切割* @param <T>* @return*/public static <T> List<List<T>> splitList(List<T> list, int len) {if (list == null || list.size() == 0 || len < 1) {return null;}List<List<T>> result = new ArrayList<List<T>>();int size = list.size();int count = (size + len - 1) / len;for (int i = 0; i < count; i++) {List<T> subList = list.subList(i * len, (Math.min((i + 1) * len, size)));result.add(subList);}return result;}
}

ListConverter.java

package com.youming.shuiku.upload.business.utils;import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.property.ExcelContentProperty;import java.util.ArrayList;
import java.util.List;public class ListConverter implements Converter<List> {@Overridepublic Class supportJavaTypeKey() {return List.class;}@Overridepublic CellDataTypeEnum supportExcelTypeKey() {return CellDataTypeEnum.STRING;}@Overridepublic List convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {String stringValue = cellData.getStringValue();String[] split = stringValue.split(",");List<String> enterpriseList = new ArrayList<>();for(int i = 0; i < split.length; i++){enterpriseList.add(split[i]);}return enterpriseList;}@Overridepublic CellData convertToExcelData(List list, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {StringBuilder stringBuilder = new StringBuilder();list.forEach(o -> {String s = o.toString();stringBuilder.append(s+",");});return new CellData(stringBuilder.toString());}
}

LocalDateStringConverter.java

package com.youming.shuiku.upload.business.utils;import com.alibaba.excel.converters.Converter;
import com.alibaba.excel.enums.CellDataTypeEnum;
import com.alibaba.excel.metadata.CellData;
import com.alibaba.excel.metadata.GlobalConfiguration;
import com.alibaba.excel.metadata.property.ExcelContentProperty;import java.time.LocalDateTime;
import java.time.format.DateTimeFormatter;public class LocalDateStringConverter implements Converter<LocalDateTime> {@Overridepublic Class supportJavaTypeKey() {return LocalDateTime.class;}@Overridepublic CellDataTypeEnum supportExcelTypeKey() {return CellDataTypeEnum.STRING;}@Overridepublic LocalDateTime convertToJavaData(CellData cellData, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {return LocalDateTime.parse(cellData.getStringValue(), DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"));}@Overridepublic CellData convertToExcelData(LocalDateTime localDateTime, ExcelContentProperty excelContentProperty, GlobalConfiguration globalConfiguration) throws Exception {DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm");String format = formatter.format(localDateTime);return new CellData(format);}
}

工具类poi

ExportExcel.java


//import org.apache.poi.hssf.usermodel.HSSFCellStyle;@SuppressWarnings("all")
public class ExportExcel implements Serializable {public static String getFileName() {return com.youming.shuiku.system.utils.excel.DateUtil.toString(new Date(), "yyyyMMdd-HHmmss");}@SuppressWarnings("deprecation")public static HSSFWorkbook getWorkbookXls(List<?> resultList, String[] showName, String[] resourceField,Class<?> resultObj, Map<String, Map<String, String>> formatMap) throws SecurityException,NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {HSSFWorkbook workbook = new HSSFWorkbook();HSSFSheet sheet = workbook.createSheet("sheet1");sheet.setDefaultColumnWidth((short) 20);HSSFCellStyle centerStyle = workbook.createCellStyle();// 设置为水平居中centerStyle.setAlignment(HorizontalAlignment.CENTER);centerStyle.setVerticalAlignment(VerticalAlignment.CENTER);centerStyle.setBorderBottom(BorderStyle.THIN); // 下边框centerStyle.setBorderLeft(BorderStyle.THIN);// 左边框centerStyle.setBorderTop(BorderStyle.THIN);// 上边框centerStyle.setBorderRight(BorderStyle.THIN);// 右边框Font font = workbook.createFont();font.setBold(true); // 粗体centerStyle.setFont(font);HSSFCellStyle contentStyle = workbook.createCellStyle();// 设置为水平居中contentStyle.setAlignment(HorizontalAlignment.CENTER);contentStyle.setVerticalAlignment(VerticalAlignment.CENTER);contentStyle.setBorderBottom(BorderStyle.THIN); // 下边框contentStyle.setBorderLeft(BorderStyle.THIN);// 左边框contentStyle.setBorderTop(BorderStyle.THIN);// 上边框contentStyle.setBorderRight(BorderStyle.THIN);// 右边框HSSFRow row;HSSFCell cell;createTitleXls(showName, sheet, centerStyle);// 下面是输出各行的数据 下面是输出各行的数据 下面是输出各行的for (int i = 0; i < resultList.size(); i++) {Object result = resultList.get(i);row = sheet.createRow(i + 1);// 创建第 i+1 行for (int j = 0; j < resourceField.length; j++) {cell = row.createCell(j);// 创建第 j 列Method method;method = resultObj.getMethod(resourceField[j]);// 这里用到了反射机制,通 这里用到了反射机制, 这里用到了反射机制 过方法名来取得对应方法返回的结果对象Object obj = method.invoke(result);if (obj != null) {if (formatMap != null && formatMap.containsKey(resourceField)) {cell.setCellValue(formatMap.get(resourceField).get(obj.toString()));cell.setCellStyle(contentStyle);} else {String type = method.getGenericReturnType().toString();if ("class java.util.Date".equals(type)) {cell.setCellValue(com.youming.shuiku.system.utils.excel.DateUtil.toString((Date) obj,com.youming.shuiku.system.utils.excel.DateUtil.DEFAULT_DATETIME_FORMAT_SEC));cell.setCellStyle(contentStyle);} else if ("class java.time.LocalDateTime".equals(type)) {cell.setCellValue(com.youming.shuiku.system.utils.excel.DateUtils.formatLocalDateTime((LocalDateTime) obj,com.youming.shuiku.system.utils.excel.DateUtils.DATETIME_FORMAT));cell.setCellStyle(contentStyle);} else {cell.setCellValue(obj.toString());cell.setCellStyle(contentStyle);}}} else {cell.setCellStyle(contentStyle);}}}return workbook;}@SuppressWarnings("deprecation")public static XSSFWorkbook getWorkbookXlsx(List<?> resultList, String[] showName, String[] resourceField,Class<?> resultObj, Map<String, Map<String, String>> formatMap) throws SecurityException,NoSuchMethodException, IllegalArgumentException, IllegalAccessException, InvocationTargetException {XSSFWorkbook workbook = new XSSFWorkbook();XSSFSheet sheet = workbook.createSheet("sheet1");sheet.setDefaultColumnWidth((short) 20);// 设置宽度XSSFCellStyle centerStyle = workbook.createCellStyle();// 设置为水平居中centerStyle.setAlignment(HorizontalAlignment.CENTER);centerStyle.setVerticalAlignment(VerticalAlignment.CENTER);centerStyle.setBorderBottom(BorderStyle.THIN); // 下边框centerStyle.setBorderLeft(BorderStyle.THIN);// 左边框centerStyle.setBorderTop(BorderStyle.THIN);// 上边框centerStyle.setBorderRight(BorderStyle.THIN);// 右边框Font font = workbook.createFont();font.setBold(true); // 粗体centerStyle.setFont(font);XSSFCellStyle contentStyle = workbook.createCellStyle();// 设置为水平居中contentStyle.setAlignment(HorizontalAlignment.CENTER);contentStyle.setVerticalAlignment(VerticalAlignment.CENTER);contentStyle.setBorderBottom(BorderStyle.THIN); // 下边框contentStyle.setBorderLeft(BorderStyle.THIN);// 左边框contentStyle.setBorderTop(BorderStyle.THIN);// 上边框contentStyle.setBorderRight(BorderStyle.THIN);// 右边框XSSFRow row;XSSFCell cell;createTitleXlsx(showName, sheet, centerStyle);// 下面是输出各行的数据 下面是输出各行的数据 下面是输出各行的for (int i = 0; i < resultList.size(); i++) {Object result = resultList.get(i);row = sheet.createRow(i + 1);// 创建第 i+1 行for (int j = 0; j < resourceField.length; j++) {cell = row.createCell(j);// 创建第 j 列Method method;method = resultObj.getMethod(resourceField[j]);// 这里用到了反射机制,通 这里用到了反射机制, 这里用到了反射机制 过方法名来取得对应方法返回的结果对象Object obj = method.invoke(result);if (obj != null) {if (formatMap != null && formatMap.containsKey(resourceField)) {cell.setCellValue(formatMap.get(resourceField).get(obj.toString()));cell.setCellStyle(contentStyle);} else {String type = method.getGenericReturnType().toString();if ("class java.util.Date".equals(type)) {cell.setCellValue(com.youming.shuiku.system.utils.excel.DateUtil.toString((Date) obj,com.youming.shuiku.system.utils.excel.DateUtil.DEFAULT_DATETIME_FORMAT_SEC));cell.setCellStyle(contentStyle);} else if ("class java.time.LocalDateTime".equals(type)) {cell.setCellValue(com.youming.shuiku.system.utils.excel.DateUtils.formatLocalDateTime((LocalDateTime) obj,com.youming.shuiku.system.utils.excel.DateUtils.DATETIME_FORMAT));cell.setCellStyle(contentStyle);} else {cell.setCellValue(obj.toString());cell.setCellStyle(contentStyle);}}} else {cell.setCellStyle(contentStyle);}}}return workbook;}@SuppressWarnings("deprecation")public static XSSFWorkbook getWorkbookXlsx(String[] showName, Map<String, Map<String, String>> formatMap)throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException,InvocationTargetException {XSSFWorkbook workbook = new XSSFWorkbook();XSSFSheet sheet = workbook.createSheet("sheet1");sheet.setDefaultColumnWidth((short) 20);XSSFCellStyle centerStyle = workbook.createCellStyle();// 设置为水平居中centerStyle.setAlignment(HorizontalAlignment.CENTER);centerStyle.setVerticalAlignment(VerticalAlignment.CENTER);centerStyle.setBorderBottom(BorderStyle.THIN); // 下边框centerStyle.setBorderLeft(BorderStyle.THIN);// 左边框centerStyle.setBorderTop(BorderStyle.THIN);// 上边框centerStyle.setBorderRight(BorderStyle.THIN);// 右边框Font font = workbook.createFont();font.setBold(true); // 粗体centerStyle.setFont(font);XSSFCellStyle contentStyle = workbook.createCellStyle();// 设置为水平居中contentStyle.setAlignment(HorizontalAlignment.CENTER);contentStyle.setVerticalAlignment(VerticalAlignment.CENTER);contentStyle.setBorderBottom(BorderStyle.THIN); // 下边框contentStyle.setBorderLeft(BorderStyle.THIN);// 左边框contentStyle.setBorderTop(BorderStyle.THIN);// 上边框contentStyle.setBorderRight(BorderStyle.THIN);// 右边框XSSFRow row;XSSFCell cell;createTitleXlsx(showName, sheet, centerStyle);return workbook;}@SuppressWarnings("deprecation")public static XSSFWorkbook getWorkbookXlsxContract(String[] showName, Map<String, Map<String, String>> formatMap)throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException,InvocationTargetException {XSSFWorkbook workbook = new XSSFWorkbook();XSSFSheet sheet = workbook.createSheet("sheet1");CellStyle textStyle = workbook.createCellStyle();DataFormat format = workbook.createDataFormat();textStyle.setDataFormat(format.getFormat("@"));for (int i = 0; i < showName.length; i++) {sheet.setDefaultColumnStyle(0, textStyle);}sheet.setDefaultColumnWidth((short) 20);XSSFCellStyle centerStyle = workbook.createCellStyle();// 设置为水平居中centerStyle.setAlignment(HorizontalAlignment.CENTER);centerStyle.setVerticalAlignment(VerticalAlignment.CENTER);centerStyle.setBorderBottom(BorderStyle.THIN); // 下边框centerStyle.setBorderLeft(BorderStyle.THIN);// 左边框centerStyle.setBorderTop(BorderStyle.THIN);// 上边框centerStyle.setBorderRight(BorderStyle.THIN);// 右边框Font font = workbook.createFont();font.setBold(true); // 粗体centerStyle.setFont(font);XSSFCellStyle contentStyle = workbook.createCellStyle();// 设置为水平居中contentStyle.setAlignment(HorizontalAlignment.CENTER);contentStyle.setVerticalAlignment(VerticalAlignment.CENTER);contentStyle.setBorderBottom(BorderStyle.THIN); // 下边框contentStyle.setBorderLeft(BorderStyle.THIN);// 左边框contentStyle.setBorderTop(BorderStyle.THIN);// 上边框contentStyle.setBorderRight(BorderStyle.THIN);// 右边框XSSFRow row;XSSFCell cell;createTitleXlsx(showName, sheet, centerStyle);return workbook;}/*** 设置某些列的值只能输入预制的数据,显示下拉框.** @param sheet    要设置的sheet.* @param textlist 下拉框显示的内容* @param firstRow 开始行* @param endRow   结束行* @param firstCol 开始列* @param endCol   结束列* @return 设置好的sheet.*/public static XSSFSheet setXSSFValidation(XSSFSheet sheet, String[] textlist, int firstRow, int endRow,int firstCol, int endCol) {// 加载下拉列表内容DVConstraint constraint = DVConstraint.createExplicitListConstraint(textlist);// 设置数据有效性加载在哪个单元格上,四个参数分别是:起始行、终止行、起始列、终止列CellRangeAddressList regions = new CellRangeAddressList(firstRow, endRow, firstCol, endCol);// 数据有效性对象HSSFDataValidation data_validation_list = new HSSFDataValidation(regions, constraint);sheet.addValidationData(data_validation_list);return sheet;}private static void createTitleXls(String[] showName, HSSFSheet sheet, HSSFCellStyle cellStyle) {HSSFRow row = sheet.createRow(0); // 创建第 1 行,也就是输出表头 创建第HSSFCell cell;for (int i = 0; i < showName.length; i++) {cell = row.createCell(i);// 创建第 i 列 创建第cell.setCellValue(new HSSFRichTextString(showName[i]));cell.setCellStyle(cellStyle);}}private static void createTitleXlsx(String[] showName, XSSFSheet sheet, XSSFCellStyle cellStyle) {XSSFRow row = sheet.createRow(0); // 创建第 1 行,也就是输出表头 创建第XSSFCell cell;for (int i = 0; i < showName.length; i++) {cell = row.createCell(i);// 创建第 i 列 创建第cell.setCellValue(new XSSFRichTextString(showName[i]));cell.setCellStyle(cellStyle);}}private static void createTitleSXXlsx(String[] showName, SXSSFSheet sheet, CellStyle cellStyle) {SXSSFRow row = sheet.createRow(0);// 创建第 1 行,也就是输出表头 创建第SXSSFCell cell;for (int i = 0; i < showName.length; i++) {cell = row.createCell(i);// 创建第 i 列 创建第cell.setCellValue(new XSSFRichTextString(showName[i]));cell.setCellStyle(cellStyle);}}private static void createTitle2(String[] showName, HSSFSheet sheet, HSSFCellStyle centerStyle,HSSFCellStyle style) {HSSFRow row = sheet.createRow(3); // 创建第 1 行,也就是输出表头 创建第HSSFCell cell;for (int i = 0; i < showName.length; i++) {cell = row.createCell(i);// 创建第 i 列 创建第cell.setCellValue(new HSSFRichTextString(showName[i]));cell.setCellStyle(centerStyle); // 样式,居中cell.setCellStyle(style); // 填充亮橘色}}/*** @param @param  resultList* @param @param  showName* @param @return 设定文件* @return HSSFWorkbook 返回类型* @throws* @Title: createWorkbook* @Description: 创建Workbook*/@SuppressWarnings("deprecation")public static HSSFWorkbook createWorkbook(List<List<Cell>> resultList, String[] showName) {HSSFWorkbook workbook = new HSSFWorkbook();HSSFSheet sheet = workbook.createSheet("sheet1");HSSFCellStyle centerStyle = workbook.createCellStyle();// 设置为水平居中// centerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// centerStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);centerStyle.setAlignment(HorizontalAlignment.CENTER);centerStyle.setVerticalAlignment(VerticalAlignment.CENTER);createTitleXls(showName, sheet, centerStyle);HSSFRow row = null;HSSFCell cell = null;if (resultList.size() > 0) {int[][] arraSort = new int[resultList.get(0).size()][resultList.size()];for (int i = 0; i < resultList.size(); i++) {row = sheet.createRow(i + 1);// sheet.setColumnWidth(i + 1, 15);List<Cell> cellList = resultList.get(i);for (int j = 0; j < cellList.size(); j++) {cell = row.createCell(j);// 创建第 j 列cell.setCellValue(cellList.get(j).getValue());int b = cell.getStringCellValue().getBytes().length;arraSort[j][i] = b;if (cellList.get(j).getStyle() != null) {cell.setCellStyle(cellList.get(j).getStyle());}}}// 列的最大列宽值(不包括标题)int widthInfo[] = TwoMaxInfo(arraSort);// 与标题在比较列宽for (int i = 0; i < showName.length; i++) {// sheet.autoSizeColumn(i);// 算出列(包括标题的最大列宽)int maxWidthInfo = showName[i].getBytes().length > widthInfo[i] ? showName[i].getBytes().length: widthInfo[i];sheet.setColumnWidth(i, maxWidthInfo > 255 ? 255 * 256 : maxWidthInfo * 256);}}return workbook;}public static int[] TwoMaxInfo(int[][] arraSort) {int[] arraySortInfo = null;arraySortInfo = new int[arraSort.length];int count = 0;for (int[] is : arraSort) {int[] arraInfo = is;Arrays.sort(arraInfo);arraySortInfo[count] = arraInfo[arraInfo.length - 1];count++;}return arraySortInfo;}/*** @param @param  resultList* @param @param  showName* @param @return 设定文件* @return HSSFWorkbook 返回类型* @throws* @Title: createWorkbookAll* @Description: 创建Workbook* @author: 张燕* @date 2015-06-23 11:13:23 +0800*/@SuppressWarnings("deprecation")public static HSSFWorkbook createWorkbookAll(Map<String, List<List<Cell>>> vMap, String[] showName) {HSSFWorkbook workbook = new HSSFWorkbook();for (Map.Entry<String, List<List<Cell>>> entry : vMap.entrySet()) {HSSFSheet sheet = workbook.createSheet(entry.getKey());sheet.setDefaultColumnWidth((short) 15);HSSFCellStyle centerStyle = workbook.createCellStyle();// 设置为水平居中// centerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// centerStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);centerStyle.setAlignment(HorizontalAlignment.CENTER);centerStyle.setVerticalAlignment(VerticalAlignment.CENTER);createTitleXls(showName, sheet, centerStyle);HSSFRow row;HSSFCell cell;for (int i = 0; i < entry.getValue().size(); i++) {row = sheet.createRow(i + 1);List<Cell> cellList = entry.getValue().get(i);for (int j = 0; j < cellList.size(); j++) {cell = row.createCell(j);// 创建第 j 列cell.setCellValue(cellList.get(j).getValue());if (cellList.get(j).getStyle() != null) {cell.setCellStyle(cellList.get(j).getStyle());}}}for (int i = 0; i < showName.length; i++) {sheet.autoSizeColumn(i);}}return workbook;}public static InputStream workbook2InputStreamXls(HSSFWorkbook workbook, String fileName) throws Exception {ByteArrayOutputStream baos = new ByteArrayOutputStream();workbook.write(baos);baos.flush();byte[] aa = baos.toByteArray();InputStream excelStream = new ByteArrayInputStream(aa, 0, aa.length);baos.close();return excelStream;}public static InputStream workbook2InputStreamXlsx(XSSFWorkbook workbook, String fileName) throws Exception {ByteArrayOutputStream baos = new ByteArrayOutputStream();workbook.write(baos);baos.flush();byte[] aa = baos.toByteArray();InputStream excelStream = new ByteArrayInputStream(aa, 0, aa.length);baos.close();return excelStream;}/*** @param @param  resultList 导出的数据集合* @param @param  showName 导出的字段名称* @param @param  headerName Excel表头参数* @param @param  resourceField 实例类对象get方法名,通过反射获取值* @param @param  resultObj 实例类* @param @param  formatMap* @param @return 返回workbook* @param @throws SecurityException* @param @throws NoSuchMethodException* @param @throws IllegalArgumentException* @param @throws IllegalAccessException* @param @throws InvocationTargetException 设定文件* @return HSSFWorkbook 返回类型* @throws* @Title: createWorkbookVariety* @Description: 导出Excel报表*/public static HSSFWorkbook createWorkbookVariety(List<?> resultList, String[] showName,ArrayList<String> headerName, String[] resourceField, Class<?> resultObj,Map<String, Map<String, String>> formatMap) throws SecurityException, NoSuchMethodException,IllegalArgumentException, IllegalAccessException, InvocationTargetException {HSSFWorkbook workbook = new HSSFWorkbook();HSSFSheet sheet = workbook.createSheet("sheet1");sheet.setDefaultColumnWidth((short) 15);HSSFCellStyle centerStyle = workbook.createCellStyle();// 设置为水平居中// centerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// centerStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);centerStyle.setAlignment(HorizontalAlignment.CENTER);centerStyle.setVerticalAlignment(VerticalAlignment.CENTER);/*** 设置表头的样式*/HSSFCellStyle titylStyle = workbook.createCellStyle();createTitleVariety(showName, headerName, sheet, titylStyle);HSSFRow row;HSSFCell cell;for (int i = 0; i < resultList.size(); i++) {Object result = resultList.get(i);if (headerName != null && headerName.size() > 0) {row = sheet.createRow(i + 1 + headerName.size());} else {row = sheet.createRow(i + 1);}// 创建第 i+1 行for (int j = 0; j <= resourceField.length; j++) {cell = row.createCell(j);// 创建第 j 列cell.setCellStyle(centerStyle);if (j == 0) {// 为Excel表的第一列添加编号,表头为:序号;eg:1,2,3,4……cell.setCellValue(i + 1);} else {Method method;method = resultObj.getMethod(resourceField[j - 1]);// 这里用到了反射机制,通 这里用到了反射机制, 这里用到了反射机制 过方法名来取得对应方法返回的结果对象Object obj = method.invoke(result);if (obj != null) {if (formatMap != null && formatMap.containsKey(resourceField)) {cell.setCellValue(formatMap.get(resourceField).get(obj.toString()));} else {String type = method.getGenericReturnType().toString();if ("class java.util.Date".equals(type)) {cell.setCellValue(com.youming.shuiku.system.utils.excel.DateUtil.toString((Date) obj,com.youming.shuiku.system.utils.excel.DateUtil.DEFAULT_DATETIME_FORMAT_SEC));} else {cell.setCellValue(obj.toString());}}}}}}return workbook;}/*** @param @param showName* @param @param headerName* @param @param sheet 设定文件* @return void 返回类型* @throws* @Title: createTitleVariety* @Description: 多行表头*/private static void createTitleVariety(String[] showName, ArrayList<String> headerName, HSSFSheet sheet,HSSFCellStyle titylStyle) {HSSFRow row;HSSFCell cell;// titylStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// titylStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);titylStyle.setAlignment(HorizontalAlignment.CENTER);titylStyle.setVerticalAlignment(VerticalAlignment.CENTER);if (headerName != null && headerName.size() > 0) {for (int i = 0; i < headerName.size(); i++) {row = sheet.createRow((short) i);if (i == 0) {cell = row.createCell(i);sheet.addMergedRegion(new CellRangeAddress(i, i, (short) 0, (short) showName.length));cell.setCellStyle(titylStyle);if (headerName.get(i) != null) {cell.setCellValue(new HSSFRichTextString(headerName.get(i).toString()));} else {cell.setCellValue(new HSSFRichTextString(""));}} else {cell = row.createCell(i - 1);sheet.addMergedRegion(new CellRangeAddress(i, i, (short) 0, (short) showName.length));if (headerName.get(i) != null) {cell.setCellValue(new HSSFRichTextString(headerName.get(i).toString()));} else {cell.setCellValue(new HSSFRichTextString(""));}}}}// 设置Excel字段if (headerName != null && headerName.size() > 0) {row = sheet.createRow((short) headerName.size());} else {row = sheet.createRow(0);}for (int n = 0; n <= showName.length; n++) {if (n == 0) {cell = row.createCell(n);cell.setCellStyle(titylStyle);cell.setCellValue(new HSSFRichTextString("序号"));} else {cell = row.createCell(n);cell.setCellStyle(titylStyle);cell.setCellValue(new HSSFRichTextString(showName[n - 1]));}}}public static HSSFWorkbook createWorkbookVarietyParam(ArrayList<ArrayList<String>> resultList, String[] showName,ArrayList<String> headerName) {HSSFWorkbook workbook = new HSSFWorkbook();HSSFSheet sheet = workbook.createSheet("sheet1");sheet.setDefaultColumnWidth((short) 15);HSSFCellStyle centerStyle = workbook.createCellStyle();// 设置为水平居中// centerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// centerStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);centerStyle.setAlignment(HorizontalAlignment.CENTER);centerStyle.setVerticalAlignment(VerticalAlignment.CENTER);/*** 设置表头的样式*/HSSFCellStyle titylStyle = workbook.createCellStyle();createTitleVariety(showName, headerName, sheet, titylStyle);HSSFRow row;HSSFCell cell;if (resultList != null && resultList.size() > 0) {for (int i = 0; i < resultList.size(); i++) {ArrayList<String> rowResultList = resultList.get(i);if (headerName != null && headerName.size() > 0) {row = sheet.createRow((short) (i + 1 + headerName.size()));} else {row = sheet.createRow((short) (i + 1));}if (rowResultList != null && rowResultList.size() > 0) {for (int n = 0; n <= rowResultList.size(); n++) {cell = row.createCell(n);// 创建第 j 列cell.setCellStyle(centerStyle);if (n == 0) {// 为Excel表的第一列添加编号,表头为:序号;eg:1,2,3,4……cell.setCellValue(i + 1);} else if (rowResultList.get(n - 1) != null) {cell.setCellValue(rowResultList.get(n - 1).toString());} else {cell.setCellValue("");}}}}}return workbook;}/*** @param @param  resultList* @param @param  headList* @param @param  sumList* @param @param  showName* @param @param  resourceField* @param @param  resultObj* @param @param  formatMap* @param @return* @param @throws SecurityException* @param @throws NoSuchMethodException* @param @throws IllegalArgumentException* @param @throws IllegalAccessException* @param @throws InvocationTargetException 设定文件* @return HSSFWorkbook 返回类型* @throws* @Title: getWorkbook2*/@SuppressWarnings("deprecation")public static HSSFWorkbook getWorkbook2(List<?> resultList, List<?> headList, List<?> sumList, String[] showName,String[] resourceField, Class<?> resultObj, Map<String, Map<String, String>> formatMap)throws SecurityException, NoSuchMethodException, IllegalArgumentException, IllegalAccessException,InvocationTargetException {HSSFWorkbook workbook = new HSSFWorkbook();HSSFSheet sheet = workbook.createSheet("sheet1");sheet.setDefaultColumnWidth((short) 20);HSSFCellStyle centerStyle = workbook.createCellStyle();// 设置为水平居中// centerStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// centerStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);centerStyle.setAlignment(HorizontalAlignment.CENTER);centerStyle.setVerticalAlignment(VerticalAlignment.CENTER);centerStyle.setBorderBottom(BorderStyle.THIN); // 下边框centerStyle.setBorderLeft(BorderStyle.THIN);// 左边框centerStyle.setBorderTop(BorderStyle.THIN);// 上边框centerStyle.setBorderRight(BorderStyle.THIN);// 右边框HSSFDataFormat format = workbook.createDataFormat();// 这样才能真正的控制单元格格式,@就是指文本型centerStyle.setDataFormat(format.getFormat("@"));HSSFCellStyle style = workbook.createCellStyle();// style.setAlignment(HSSFCellStyle.ALIGN_CENTER);// style.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);style.setAlignment(HorizontalAlignment.CENTER);style.setVerticalAlignment(VerticalAlignment.CENTER);style.setBorderBottom(BorderStyle.THIN); // 下边框style.setBorderLeft(BorderStyle.THIN);// 左边框style.setBorderTop(BorderStyle.THIN);// 上边框style.setBorderRight(BorderStyle.THIN);// 右边框style.setFillPattern(FillPatternType.SOLID_FOREGROUND);// 填充单元格style.setFillForegroundColor(HSSFColor.HSSFColorPredefined.LIGHT_ORANGE.getIndex());// 填亮橘色HSSFCellStyle greenStyle = workbook.createCellStyle();// greenStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// greenStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);greenStyle.setAlignment(HorizontalAlignment.CENTER);greenStyle.setVerticalAlignment(VerticalAlignment.CENTER);greenStyle.setBorderBottom(BorderStyle.THIN); // 下边框greenStyle.setBorderLeft(BorderStyle.THIN);// 左边框greenStyle.setBorderTop(BorderStyle.THIN);// 上边框greenStyle.setBorderRight(BorderStyle.THIN);// 右边框greenStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);// 填充单元格// greenStyle.setFillForegroundColor(HSSFColor.BRIGHT_GREEN.index);//填亮绿色greenStyle.setFillForegroundColor(HSSFColor.HSSFColorPredefined.SEA_GREEN.getIndex());// 填深绿色Font greenfont = workbook.createFont();greenfont.setBold(true); // 粗体greenStyle.setFont(greenfont);HSSFCellStyle overGreenStyle = workbook.createCellStyle();// overGreenStyle.setAlignment(HSSFCellStyle.ALIGN_CENTER);// overGreenStyle.setVerticalAlignment(HSSFCellStyle.VERTICAL_CENTER);overGreenStyle.setAlignment(HorizontalAlignment.CENTER);overGreenStyle.setVerticalAlignment(VerticalAlignment.CENTER);overGreenStyle.setBorderBottom(BorderStyle.THIN); // 下边框overGreenStyle.setBorderLeft(BorderStyle.THIN);// 左边框overGreenStyle.setBorderTop(BorderStyle.THIN);// 上边框overGreenStyle.setBorderRight(BorderStyle.THIN);// 右边框overGreenStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);// 填充单元格overGreenStyle.setFillForegroundColor(HSSFColor.HSSFColorPredefined.SEA_GREEN.getIndex());// 填深绿色HSSFCellStyle fontStyle = workbook.createCellStyle();// 字体样式fontStyle.setAlignment(HorizontalAlignment.CENTER);fontStyle.setVerticalAlignment(VerticalAlignment.CENTER);fontStyle.setBorderBottom(BorderStyle.THIN); // 下边框fontStyle.setBorderLeft(BorderStyle.THIN);// 左边框fontStyle.setBorderTop(BorderStyle.THIN);// 上边框fontStyle.setBorderRight(BorderStyle.THIN);// 右边框fontStyle.setFillPattern(FillPatternType.SOLID_FOREGROUND);// 填充单元格fontStyle.setFillForegroundColor(HSSFColor.HSSFColorPredefined.SEA_GREEN.getIndex());// 填深绿色Font font = workbook.createFont();font.setColor(HSSFColor.HSSFColorPredefined.WHITE.getIndex()); // 白字fontStyle.setFont(font);HSSFRow row;HSSFCell cell;// createTitle2(showName, sheet, centerStyle, style);for (int j = 0; j < 3; j++) {row = sheet.createRow(j);for (int i = 0; i < showName.length; i++) {cell = row.createCell(i);if (j == 0) {if (i == 0) {cell.setCellValue(new HSSFRichTextString("查询时间"));cell.setCellStyle(greenStyle);} else if (i == 1) {// 参数1:行号 参数2:起始列号 参数3:行号 参数4:终止列号CellRangeAddress region1 = new CellRangeAddress(j, j, (short) i, (short) (i + 3));sheet.addMergedRegion(region1);cell.setCellValue(new HSSFRichTextString(headList.get(0).toString()));cell.setCellStyle(fontStyle);}} else if (j == 1) {if (i == 0) {// 参数1:行号 参数2:起始列号 参数3:行号 参数4:终止列号CellRangeAddress region1 = new CellRangeAddress(j, (j + 1), (short) 0, (short) 0);sheet.addMergedRegion(region1);cell.setCellValue(new HSSFRichTextString("车辆信息"));cell.setCellStyle(greenStyle);} else if (i == 1) {cell.setCellValue(new HSSFRichTextString("车牌号"));} else if (i == 2) {cell.setCellValue(new HSSFRichTextString("所属公司"));} else if (i == 3) {cell.setCellValue(new HSSFRichTextString("车辆类型"));} else if (i == 4) {cell.setCellValue(new HSSFRichTextString("入网时间"));} else if (i == 5) {cell.setCellValue(new HSSFRichTextString("车身颜色"));} else if (i == 6) {cell.setCellValue(new HSSFRichTextString("型号"));} else if (i == 7) {cell.setCellValue(new HSSFRichTextString("司机"));} else if (i == 8) {cell.setCellValue(new HSSFRichTextString("手机号"));}if (i > 0 && i < 9) {cell.setCellStyle(overGreenStyle);}} else if (j == 2) {if (i == 1) {cell.setCellValue(new HSSFRichTextString(headList.get(1).toString()));} else if (i == 2) {cell.setCellValue(new HSSFRichTextString(headList.get(2).toString()));} else if (i == 3) {cell.setCellValue(new HSSFRichTextString(headList.get(3).toString()));} else if (i == 4) {cell.setCellValue(new HSSFRichTextString(headList.get(4).toString()));} else if (i == 5) {cell.setCellValue(new HSSFRichTextString(headList.get(5).toString()));} else if (i == 6) {cell.setCellValue(new HSSFRichTextString(headList.get(6).toString()));} else if (i == 7) {cell.setCellValue(new HSSFRichTextString(headList.get(7).toString()));} else if (i == 8) {cell.setCellValue(new HSSFRichTextString(headList.get(8).toString()));}if (i > 0 && i < 9) {cell.setCellStyle(fontStyle);}}}}for (int k = 0; k < 3; k++) {row = sheet.createRow(k + 3);for (int i = 0; i < showName.length; i++) {cell = row.createCell(i);if (k == 0) {if (i == 0) {// 参数1:行号 参数2:起始列号 参数3:行号 参数4:终止列号CellRangeAddress region1 = new CellRangeAddress(k + 3, k + 4, (short) (i), (short) (i + 1));sheet.addMergedRegion(region1);cell.setCellValue(new HSSFRichTextString("时间区间"));} else if (i == 2) {// 参数1:行号 参数2:起始列号 参数3:行号 参数4:终止列号CellRangeAddress region1 = new CellRangeAddress(k + 3, k + 4, (short) (i), (short) (i + 1));sheet.addMergedRegion(region1);cell.setCellValue(new HSSFRichTextString("时长"));} else if (i == 4) {// 参数1:行号 参数2:起始列号 参数3:行号 参数4:终止列号CellRangeAddress region1 = new CellRangeAddress(k + 3, k + 4, (short) (i), (short) (i));sheet.addMergedRegion(region1);cell.setCellValue(new HSSFRichTextString("位置信息"));} else if (i == 5) {// 参数1:行号 参数2:起始列号 参数3:行号 参数4:终止列号CellRangeAddress region1 = new CellRangeAddress(k + 3, k + 4, (short) (i), (short) (i));sheet.addMergedRegion(region1);cell.setCellValue(new HSSFRichTextString("车辆状态"));} else if (i == 6) {// 参数1:行号 参数2:起始列号 参数3:行号 参数4:终止列号CellRangeAddress region1 = new CellRangeAddress(k + 3, k + 5, (short) (i), (short) (i));sheet.addMergedRegion(region1);cell.setCellValue(new HSSFRichTextString("行驶里程(km)"));} else if (i == 7) {// 参数1:行号 参数2:起始列号 参数3:行号 参数4:终止列号CellRangeAddress region1 = new CellRangeAddress(k + 3, k + 5, (short) (i), (short) (i));sheet.addMergedRegion(region1);cell.setCellValue(new HSSFRichTextString("超速(次数)"));} else if (i == 8) {// 参数1:行号 参数2:起始列号 参数3:行号 参数4:终止列号CellRangeAddress region1 = new CellRangeAddress(k + 3, k + 3, (short) (i), (short) (i + 3));sheet.addMergedRegion(region1);cell.setCellValue(new HSSFRichTextString("疲劳驾驶"));} else if (i == 12) {// 参数1:行号 参数2:起始列号 参数3:行号 参数4:终止列号CellRangeAddress region1 = new CellRangeAddress(k + 3, k + 5, (short) (i), (short) (i));sheet.addMergedRegion(region1);cell.setCellValue(new HSSFRichTextString("急加速(次数)"));} else if (i == 13) {// 参数1:行号 参数2:起始列号 参数3:行号 参数4:终止列号CellRangeAddress region1 = new CellRangeAddress(k + 3, k + 5, (short) (i), (short) (i));sheet.addMergedRegion(region1);cell.setCellValue(new HSSFRichTextString("急减速(次数)"));} else if (i == 14) {// 参数1:行号 参数2:起始列号 参数3:行号 参数4:终止列号CellRangeAddress region1 = new CellRangeAddress(k + 3, k + 5, (short) (i), (short) (i));sheet.addMergedRegion(region1);cell.setCellValue(new HSSFRichTextString("急转弯(次数)"));} else if (i == 15) {// 参数1:行号 参数2:起始列号 参数3:行号 参数4:终止列号CellRangeAddress region1 = new CellRangeAddress(k + 3, k + 5, (short) (i), (short) (i));sheet.addMergedRegion(region1);cell.setCellValue(new HSSFRichTextString("平均速度(km/h)"));} else if (i == 16) {// 参数1:行号 参数2:起始列号 参数3:行号 参数4:终止列号CellRangeAddress region1 = new CellRangeAddress(k + 3, k + 5, (short) (i), (short) (i));sheet.addMergedRegion(region1);cell.setCellValue(new HSSFRichTextString("最高速度(km/h)"));}} else if (k == 1) {if (i == 8) {// 参数1:行号 参数2:起始列号 参数3:行号 参数4:终止列号CellRangeAddress region1 = new CellRangeAddress(k + 3, k + 4, (short) (i), (short) (i));sheet.addMergedRegion(region1);cell.setCellValue(new HSSFRichTextString("次数"));} else if (i == 9) {// 参数1:行号 参数2:起始列号 参数3:行号 参数4:终止列号CellRangeAddress region1 = new CellRangeAddress(k + 3, k + 3, (short) (i), (short) (i + 1));sheet.addMergedRegion(region1);cell.setCellValue(new HSSFRichTextString("时长"));} else if (i == 11) {// 参数1:行号 参数2:起始列号 参数3:行号 参数4:终止列号CellRangeAddress region1 = new CellRangeAddress(k + 3, k + 4, (short) (i), (short) (i));sheet.addMergedRegion(region1);cell.setCellValue(new HSSFRichTextString("里程(km)"));}} else if (k == 2) {if (i == 0) {cell.setCellValue(new HSSFRichTextString("开始时间"));} else if (i == 1) {cell.setCellValue(new HSSFRichTextString("结束时间"));} else if (i == 2) {cell.setCellValue(new HSSFRichTextString("小时"));} else if (i == 3) {cell.setCellValue(new HSSFRichTextString("分钟"));} else if (i == 4) {cell.setCellValue(new HSSFRichTextString("详细地址"));} else if (i == 5) {cell.setCellValue(new HSSFRichTextString("状态"));} else if (i == 9) {cell.setCellValue(new HSSFRichTextString("小时"));} else if (i == 10) {cell.setCellValue(new HSSFRichTextString("分钟"));}}cell.setCellStyle(style); // 填充亮橘色}}// 下面是输出各行的数据 下面是输出各行的数据 下面是输出各行的for (int i = 0; i < resultList.size(); i++) {Object result = resultList.get(i);row = sheet.createRow(i + 6);// 创建第 i+1 行for (int j = 0; j < resourceField.length; j++) {cell = row.createCell(j);// 创建第 j 列Method method;method = resultObj.getMethod(resourceField[j]);// 这里用到了反射机制,通 这里用到了反射机制, 这里用到了反射机制 过方法名来取得对应方法返回的结果对象Object obj = method.invoke(result);if (obj != null) {if (formatMap != null && formatMap.containsKey(resourceField)) {cell.setCellValue(formatMap.get(resourceField).get(obj.toString()));cell.setCellStyle(centerStyle); // 样式,居中} else {String type = method.getGenericReturnType().toString();if ("class java.util.Date".equals(type)) {cell.setCellValue(com.youming.shuiku.system.utils.excel.DateUtil.toString((Date) obj,com.youming.shuiku.system.utils.excel.DateUtil.DEFAULT_DATETIME_FORMAT_SEC));} else {cell.setCellValue(obj.toString());}cell.setCellStyle(centerStyle); // 样式,居中}} else {cell.setCellStyle(centerStyle); // 样式,居中}}}// 参数1:起始行 参数2:终止行 参数3:起始列 参数4:终止列// CellRangeAddress region1 = new CellRangeAddress(showName.length,// showName.length, (short) 0, (short) 11);row = sheet.createRow(resultList.size() + 6);for (int i = 0; i < showName.length; i++) {cell = row.createCell(i);if (i == 0) {// 参数1:行号 参数2:起始列号 参数3:行号 参数4:终止列号CellRangeAddress region1 = new CellRangeAddress(resultList.size() + 6, resultList.size() + 6,(short) (i), (short) (i + 1));sheet.addMergedRegion(region1);cell.setCellValue(new HSSFRichTextString("总计"));cell.setCellStyle(greenStyle);} else if (i == 2) {cell.setCellValue(new HSSFRichTextString(sumList.get(0).toString()));cell.setCellStyle(fontStyle);} else if (i == 3) {cell.setCellValue(new HSSFRichTextString(sumList.get(1).toString()));cell.setCellStyle(fontStyle);} else if (i == 4) {// 折合时间(min)cell.setCellValue(new HSSFRichTextString("折合时间(min)"));cell.setCellStyle(greenStyle);} else if (i == 5) {cell.setCellValue(new HSSFRichTextString(sumList.get(2).toString()));cell.setCellStyle(fontStyle);} else if (i == 6) {cell.setCellValue(new HSSFRichTextString(sumList.get(3).toString()));cell.setCellStyle(fontStyle);} else if (i == 7) {cell.setCellValue(new HSSFRichTextString(sumList.get(4).toString()));cell.setCellStyle(fontStyle);} else if (i == 8) {cell.setCellValue(new HSSFRichTextString(sumList.get(5).toString()));cell.setCellStyle(fontStyle);} else if (i == 9) {cell.setCellValue(new HSSFRichTextString(sumList.get(6).toString()));cell.setCellStyle(fontStyle);} else if (i == 10) {cell.setCellValue(new HSSFRichTextString(sumList.get(7).toString()));cell.setCellStyle(fontStyle);} else if (i == 11) {cell.setCellValue(new HSSFRichTextString(sumList.get(8).toString()));cell.setCellStyle(fontStyle);} else if (i == 12) {cell.setCellValue(new HSSFRichTextString(sumList.get(9).toString()));cell.setCellStyle(fontStyle);} else if (i == 13) {cell.setCellValue(new HSSFRichTextString(sumList.get(10).toString()));cell.setCellStyle(fontStyle);} else if (i == 14) {cell.setCellValue(new HSSFRichTextString(sumList.get(11).toString()));cell.setCellStyle(fontStyle);} else if (i == 15) {cell.setCellValue(new HSSFRichTextString(sumList.get(12).toString()));cell.setCellStyle(fontStyle);} else if (i == 16) {cell.setCellValue(new HSSFRichTextString(sumList.get(13).toString()));cell.setCellStyle(fontStyle);}}return workbook;}}

相关文章:

使用Apache POI数据导出及EasyExcel进行十万、百万的数据导出

文章目录 Apache POI使用 EasyExcel工具类easyExcel工具类poi Apache POI Apache POI 是基于 Office Open XML 标准&#xff08; OOXML &#xff09;和 Microsoft 的 OLE 2 复合⽂档 格式&#xff08; OLE2 &#xff09;处理各种⽂件格式的开源项⽬。 简⽽⾔之&#xff0c;您可…...

八种故障排障思路

目录 生产故障有哪些 1、网络故障 如何发现网络故障 如何排查网络故障 如何解决网络故障 2、服务器故障如何处理 如何发现服务器故障 如何排查服务器故障 如何解决服务器故障 3、数据库故障如何处理 如何发现数据库故障 如何排查数据库故障 如何解决数据库故障 4…...

JavaScript全解析——this指向

本系列内容为JS全解析&#xff0c;为千锋教育资深前端老师独家创作 致力于为大家讲解清晰JavaScript相关知识点&#xff0c;含有丰富的代码案例及讲解。如果感觉对大家有帮助的话&#xff0c;可以【点个关注】持续追更~ this指向&#xff08;掌握&#xff09; this 是一个关…...

MySQL中ON DUPLICATE KEY UPDATE和REPLACE INTO区别

MySQL中的ON DUPLICATE KEY UPDATE和REPLACE INTO区别 在MySQL中&#xff0c;当我们需要插入新的数据到一个已存在的表中时&#xff0c;有两个常见的选项&#xff1a;ON DUPLICATE KEY UPDATE和REPLACE INTO。这两个选项可以解决类似的问题&#xff0c;但在处理重复键&#xf…...

37本国产SCI期刊推荐!涵盖9大领域,建议收藏!②

三、地学类 1. Acta Oceanologica Sinica | 国产之光&#xff01;影响因子1分&#xff0c;中科院2区&#xff0c;国人占比81%&#xff01; 评语&#xff1a;Acta Oceanologica Sinica在海洋学领域处于中等水平&#xff0c;影响因子逐年上升。近年来我国倡导发表国内期刊的论文…...

掌握无缝云迁移方法的数据集成

随着越来越多的组织过渡到基于云的基础架构&#xff0c;数据集成已成为云迁移过程的关键组成部分。数据集成包括将来自不同来源的数据集成到一个整合的视角中。云迁移的上下文涉及将数据从本地系统传输到基于云的平台&#xff0c;同时确保数据的一致性、准确性和可用性。 本文…...

unity 3种办法实现血条效果并实现3d世界血条一直看向摄像机

普通血条栏: 渐变色血条栏: 缓冲血条栏: 3D场景血条栏跟随玩家移动: 普通血条栏: 在Canvas下创建一个空物体HP bar,在空物体下方创建3个Image,分别为血条框bar 黑色,最大HP maxHP 白色,和当前HP currentHP 红色。(PS:注意先后顺序以调整显示的图层) 效果: …...

Jenkins流水线整合k8s实现代码自动集成和部署

一、前置条件 1、安装好k8s集群 这里先要搭建好一个K8s集群&#xff0c;笔者这边就采用使用了一个一主一丛的k8s集群&#xff0c;k8s集群的版本使用1.19.5版本&#xff0c;服务器的配置&#xff1a;2核4G&#xff0c;操作系统: CentOS Linux release 7.9.2009 (Core) 主机名…...

@PulsarConsumer注解2

PulsarConsumer注解是 Apache Pulsar 的客户端 API 中的注解之一&#xff0c;它是用于自动消费 Pulsar 消息的。通过使用PulsarConsumer注解&#xff0c;您可以将 Pulsar 消息的消费逻辑与自身的 bean 结合起来&#xff0c;并且不必编写繁琐的消费者代码。当消息到达 topic 时&…...

AIGC 综述 2023:A History of Generative AI from GAN to ChatGPT

GAI&#xff1a;发展历史&#xff0c;核心技术&#xff0c;应用领域以及未来发展 摘要1、引言1.1、主要贡献1.2、组织结构 2、生成式AI的发展历史2.1、NLP领域的发展2.2、CV领域的发展2.3、CV与NLP的融合 3、AIGC的核心技术基础3.1、经典基础模型3.1.1、Transformer3.1.2、Pre-…...

【JOSEF约瑟 JDZS-1202B 可调断电延时中间继电器 精度高、延时宽、】

品牌&#xff1a;JOSEF约瑟名称&#xff1a;可调断电延时中间继电器型号&#xff1a;JDZS-1202B系列额定电压&#xff1a;110、220VDC/AC触点容量&#xff1a;250V/5A功率消耗&#xff1a;2W返回系数&#xff1a;≥5%特点&#xff1a;高精度、延时宽、功耗低。 用途及特点 基本…...

UNeXt:基于MLP的快速医学图像分割网络

文章目录 UNeXt: MLP-Based Rapid Medical Image Segmentation Network摘要本文方法Shifted MLPTokenized MLP Stage 实验结果 UNeXt: MLP-Based Rapid Medical Image Segmentation Network 摘要 UNeXt&#xff1a;一种基于卷积多层感知器&#xff08;MLP&#xff09;的图像分…...

软路由简述

软路由是一种基于软件实现的路由器&#xff0c;它可以在普通的计算机上运行&#xff0c;通过软件实现路由器的各种功能。相比传统的硬件路由器&#xff0c;软路由具有灵活性高、可定制性强、成本低等优点&#xff0c;因此在近年来得到了越来越广泛的应用。 软路由的实现方式有…...

python 生成设施农用地各类材料,并调用python2进行出图

python 生成设施农用地各类材料&#xff0c;并调用python2进行出图 -- coding: utf-8 -- import win32com.client from win32com.client import Dispatch import os, sys, glob #import traceback, shapefile from openpyxl import load_workbook, Workbook import openpyxl,…...

html - 多媒体标签(video)、音频标签(audio)

video 语法&#xff1a; <video src"文件地址" controls"controls" </video> 常见的属性 属性 值 描 述 autoplay autoplay 视频就绪自动播放&#xff08;谷歌浏览器需要添加muted来解决自动放的问题 controls controls …...

希望计算机专业同学都知道这些博主

湖科大教书匠——计算机网络 “宝藏老师”、“干货满满”、“羡慕湖科大”…这些都是网友对这门网课的评价&#xff0c;可见网课质量之高&#xff01;最全面的面试网站 湖南科技大学《计算机网络》微课堂是该校高军老师精心制作的视频课程&#xff0c;用简单的语言描述复杂的…...

LeetCode 416 分割等和子集

题目&#xff1a; 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使得两个子集的元素和相等。 示例 1&#xff1a; 输入&#xff1a;nums [1,5,11,5] 输出&#xff1a;true 解释&#xff1a;数组可以分割成 [1, 5, 5] 和 …...

韦东山Linux驱动入门实验班(2)hello驱动---驱动层与应用层通讯,以及自动产生设备节点

前言 &#xff08;1&#xff09;学习韦东山老师的Linux&#xff0c;因为他讲的很精简&#xff0c;以至于很多人听不懂。接下来我讲介绍韦东山老师的驱动实验班的第二个Hello程序。 &#xff08;2&#xff09;注意&#xff0c;请先学习完视频再来看这个教程&#xff01;本文仅供…...

小程序技术,打开跨端管理的思路,提高客户满意度和忠诚度

小程序容器作为跨端管理的有效工具&#xff0c;已经成为越来越多企业的选择。通过小程序容器&#xff0c;企业可以实现跨平台部署&#xff0c;提供一致的用户体验&#xff0c;整合多种渠道实现全渠道协同&#xff0c;进行个性化营销&#xff0c;以及通过数据分析和监控等手段优…...

Jmeter的Content-Type设置方式

今天调Jmeter脚本遇到一个问题&#xff1a;接口的请求体为Body Data时&#xff0c;没有在HTTP信息头管理加Content-Type参数&#xff0c;Content-Type: application/json&#xff0c;导致脚本一直跑不通&#xff0c;报错&#xff0c;一顿排查&#xff0c;才发现是请求头的原因。…...

在软件开发中正确使用MySQL日期时间类型的深度解析

在日常软件开发场景中&#xff0c;时间信息的存储是底层且核心的需求。从金融交易的精确记账时间、用户操作的行为日志&#xff0c;到供应链系统的物流节点时间戳&#xff0c;时间数据的准确性直接决定业务逻辑的可靠性。MySQL作为主流关系型数据库&#xff0c;其日期时间类型的…...

golang循环变量捕获问题​​

在 Go 语言中&#xff0c;当在循环中启动协程&#xff08;goroutine&#xff09;时&#xff0c;如果在协程闭包中直接引用循环变量&#xff0c;可能会遇到一个常见的陷阱 - ​​循环变量捕获问题​​。让我详细解释一下&#xff1a; 问题背景 看这个代码片段&#xff1a; fo…...

React Native 导航系统实战(React Navigation)

导航系统实战&#xff08;React Navigation&#xff09; React Navigation 是 React Native 应用中最常用的导航库之一&#xff0c;它提供了多种导航模式&#xff0c;如堆栈导航&#xff08;Stack Navigator&#xff09;、标签导航&#xff08;Tab Navigator&#xff09;和抽屉…...

【人工智能】神经网络的优化器optimizer(二):Adagrad自适应学习率优化器

一.自适应梯度算法Adagrad概述 Adagrad&#xff08;Adaptive Gradient Algorithm&#xff09;是一种自适应学习率的优化算法&#xff0c;由Duchi等人在2011年提出。其核心思想是针对不同参数自动调整学习率&#xff0c;适合处理稀疏数据和不同参数梯度差异较大的场景。Adagrad通…...

逻辑回归:给不确定性划界的分类大师

想象你是一名医生。面对患者的检查报告&#xff08;肿瘤大小、血液指标&#xff09;&#xff0c;你需要做出一个**决定性判断**&#xff1a;恶性还是良性&#xff1f;这种“非黑即白”的抉择&#xff0c;正是**逻辑回归&#xff08;Logistic Regression&#xff09;** 的战场&a…...

day52 ResNet18 CBAM

在深度学习的旅程中&#xff0c;我们不断探索如何提升模型的性能。今天&#xff0c;我将分享我在 ResNet18 模型中插入 CBAM&#xff08;Convolutional Block Attention Module&#xff09;模块&#xff0c;并采用分阶段微调策略的实践过程。通过这个过程&#xff0c;我不仅提升…...

可靠性+灵活性:电力载波技术在楼宇自控中的核心价值

可靠性灵活性&#xff1a;电力载波技术在楼宇自控中的核心价值 在智能楼宇的自动化控制中&#xff0c;电力载波技术&#xff08;PLC&#xff09;凭借其独特的优势&#xff0c;正成为构建高效、稳定、灵活系统的核心解决方案。它利用现有电力线路传输数据&#xff0c;无需额外布…...

dedecms 织梦自定义表单留言增加ajax验证码功能

增加ajax功能模块&#xff0c;用户不点击提交按钮&#xff0c;只要输入框失去焦点&#xff0c;就会提前提示验证码是否正确。 一&#xff0c;模板上增加验证码 <input name"vdcode"id"vdcode" placeholder"请输入验证码" type"text&quo…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者

抖音增长新引擎&#xff1a;品融电商&#xff0c;一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中&#xff0c;品牌如何破浪前行&#xff1f;自建团队成本高、效果难控&#xff1b;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

家政维修平台实战20:权限设计

目录 1 获取工人信息2 搭建工人入口3 权限判断总结 目前我们已经搭建好了基础的用户体系&#xff0c;主要是分成几个表&#xff0c;用户表我们是记录用户的基础信息&#xff0c;包括手机、昵称、头像。而工人和员工各有各的表。那么就有一个问题&#xff0c;不同的角色&#xf…...