|
@@ -0,0 +1,143 @@
|
|
|
+package com.huaxu.util;
|
|
|
+
|
|
|
+import com.alibaba.excel.EasyExcel;
|
|
|
+import com.alibaba.excel.enums.CellDataTypeEnum;
|
|
|
+import com.alibaba.excel.metadata.CellData;
|
|
|
+import com.alibaba.excel.metadata.Head;
|
|
|
+import com.alibaba.excel.util.CollectionUtils;
|
|
|
+import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
|
|
|
+import com.alibaba.excel.write.metadata.holder.WriteTableHolder;
|
|
|
+import com.alibaba.excel.write.metadata.style.WriteCellStyle;
|
|
|
+import com.alibaba.excel.write.metadata.style.WriteFont;
|
|
|
+import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
|
|
|
+import com.alibaba.excel.write.style.column.AbstractColumnWidthStyleStrategy;
|
|
|
+import com.huaxu.common.ToolUtil;
|
|
|
+import org.apache.commons.lang.time.DateFormatUtils;
|
|
|
+import org.apache.poi.ss.usermodel.*;
|
|
|
+
|
|
|
+import java.io.File;
|
|
|
+import java.io.IOException;
|
|
|
+import java.util.Date;
|
|
|
+import java.util.HashMap;
|
|
|
+import java.util.List;
|
|
|
+import java.util.Map;
|
|
|
+
|
|
|
+/**
|
|
|
+ * @ClassName ExcelUtil
|
|
|
+ * @Description: Excel导出通用工具类
|
|
|
+ * @Author :lihui
|
|
|
+ * @Date 2021/5/17
|
|
|
+ * @Version V1.0
|
|
|
+ **/
|
|
|
+public class ExcelUtil {
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 仅仅输出明细数据到excel文件, 增加自定义的头部
|
|
|
+ */
|
|
|
+ public static String writeSimpleExcelWithHeader(String path, String excelName, List<List<String>> head, List list) {
|
|
|
+ String filePath = "";
|
|
|
+ String fileName = DateFormatUtils.format(new Date(), "yyyy/MM/dd") + File.separator;
|
|
|
+ fileName = fileName + excelName + System.currentTimeMillis() + ".xlsx";
|
|
|
+ try {
|
|
|
+ getAbsoluteFile(path, fileName);
|
|
|
+ // 这里 需要指定写用哪个class去写,指定模板名称及数据
|
|
|
+ EasyExcel.write(path + fileName).head(head).registerWriteHandler(new CustomizeColumnWidth())
|
|
|
+ .registerWriteHandler(getStyleStrategy()).sheet("sheet").doWrite(list);
|
|
|
+ filePath = getPathFileName(path, fileName);
|
|
|
+ } catch (IOException e) {
|
|
|
+ e.printStackTrace();
|
|
|
+ }
|
|
|
+ return filePath;
|
|
|
+ }
|
|
|
+
|
|
|
+
|
|
|
+ private static final String getPathFileName(String uploadDir, String fileName) throws IOException {
|
|
|
+ String pathFileName = uploadDir + "/" + fileName;
|
|
|
+ return ToolUtil.path(pathFileName);
|
|
|
+ }
|
|
|
+ private static final File getAbsoluteFile(String uploadDir, String fileName) throws IOException {
|
|
|
+ File desc = new File(uploadDir + File.separator + fileName);
|
|
|
+ if (!desc.getParentFile().exists()) {
|
|
|
+ desc.getParentFile().mkdirs();
|
|
|
+ }
|
|
|
+ return desc;
|
|
|
+ }
|
|
|
+
|
|
|
+ private static HorizontalCellStyleStrategy getStyleStrategy() {
|
|
|
+ // 头的策略
|
|
|
+ WriteCellStyle headWriteCellStyle = new WriteCellStyle();
|
|
|
+ // 设置对齐
|
|
|
+ headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);
|
|
|
+ // 背景色, 设置为白色,也是默认颜色
|
|
|
+ headWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
|
|
|
+ // 字体
|
|
|
+ WriteFont headWriteFont = new WriteFont();
|
|
|
+ headWriteFont.setFontHeightInPoints((short) 11);
|
|
|
+ headWriteCellStyle.setWriteFont(headWriteFont);
|
|
|
+ return new HorizontalCellStyleStrategy(headWriteCellStyle, new WriteCellStyle());
|
|
|
+ }
|
|
|
+
|
|
|
+ /**
|
|
|
+ * 自定义头部的 列的宽度设置 策略. .
|
|
|
+ */
|
|
|
+ static class CustomizeColumnWidth extends AbstractColumnWidthStyleStrategy {
|
|
|
+
|
|
|
+ private Map<Integer, Map<Integer, Integer>> CACHE = new HashMap(8);
|
|
|
+
|
|
|
+ @Override
|
|
|
+ protected void setColumnWidth(WriteSheetHolder writeSheetHolder, List<CellData> list, Cell cell, Head head, Integer integer, Boolean isHead) {
|
|
|
+ boolean needSetWidth = isHead || !CollectionUtils.isEmpty(list);
|
|
|
+ if (needSetWidth) {
|
|
|
+ Map<Integer, Integer> maxColumnWidthMap = CACHE.get(writeSheetHolder.getSheetNo());
|
|
|
+ if (maxColumnWidthMap == null) {
|
|
|
+ maxColumnWidthMap = new HashMap(16);
|
|
|
+ CACHE.put(writeSheetHolder.getSheetNo(), maxColumnWidthMap);
|
|
|
+ }
|
|
|
+
|
|
|
+ Integer columnWidth = this.dataLength(list, cell, isHead);
|
|
|
+ if (columnWidth >= 0) {
|
|
|
+ if (columnWidth > 255) {
|
|
|
+ columnWidth = 255;
|
|
|
+ }
|
|
|
+
|
|
|
+ Integer maxColumnWidth = (Integer)((Map)maxColumnWidthMap).get(cell.getColumnIndex());
|
|
|
+ if (maxColumnWidth == null || columnWidth > maxColumnWidth) {
|
|
|
+ ((Map)maxColumnWidthMap).put(cell.getColumnIndex(), columnWidth);
|
|
|
+ writeSheetHolder.getSheet().setColumnWidth(cell.getColumnIndex(), columnWidth * 256);
|
|
|
+ }
|
|
|
+
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ private Integer dataLength(List<CellData> cellDataList, Cell cell, Boolean isHead) {
|
|
|
+ if (isHead) {
|
|
|
+ return cell.getStringCellValue().getBytes().length;
|
|
|
+ } else {
|
|
|
+ CellData cellData = (CellData)cellDataList.get(0);
|
|
|
+ CellDataTypeEnum type = cellData.getType();
|
|
|
+ if (type == null) {
|
|
|
+ return -1;
|
|
|
+ } else {
|
|
|
+ switch(type) {
|
|
|
+ case STRING:
|
|
|
+ return cellData.getStringValue().getBytes().length;
|
|
|
+ case BOOLEAN:
|
|
|
+ return cellData.getBooleanValue().toString().getBytes().length;
|
|
|
+ case NUMBER:
|
|
|
+ return cellData.getNumberValue().toString().getBytes().length;
|
|
|
+ default:
|
|
|
+ return -1;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ @Override
|
|
|
+ public void beforeCellCreate(WriteSheetHolder writeSheetHolder, WriteTableHolder writeTableHolder, Row row, Head head, Integer columnIndex, Integer relativeRowIndex, Boolean isHead) {
|
|
|
+ // 设置行高测试
|
|
|
+ short height = 600;
|
|
|
+ row.setHeight(height);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+}
|