阿里EasyExcel快速导出demo

打印 上一主题 下一主题

主题 871|帖子 871|积分 2615

引入阿里easyExcel依赖
  1.       
  2.         <dependency>
  3.             <groupId>com.alibaba</groupId>
  4.             <artifactId>easyexcel</artifactId>
  5.             <version>2.2.6</version>
  6.             <exclusions>
  7.                 <exclusion>
  8.                     <groupId>org.ehcache</groupId>
  9.                     <artifactId>ehcache</artifactId>
  10.                 </exclusion>
  11.             </exclusions>
  12.         </dependency>
复制代码
自定义的阿里easyexcel拦截器方法
  1. import com.alibaba.excel.write.handler.SheetWriteHandler;
  2. import com.alibaba.excel.write.metadata.holder.WriteSheetHolder;
  3. import com.alibaba.excel.write.metadata.holder.WriteWorkbookHolder;
  4. import com.jerry.util.ExcelUtils;
  5. import org.apache.commons.lang.StringUtils;
  6. import org.apache.commons.logging.Log;
  7. import org.apache.commons.logging.LogFactory;
  8. import org.apache.poi.hssf.usermodel.HSSFWorkbook;
  9. import org.apache.poi.ss.usermodel.*;
  10. import org.apache.poi.ss.util.CellRangeAddress;
  11. import javax.imageio.ImageIO;
  12. import java.awt.image.BufferedImage;
  13. import java.io.ByteArrayOutputStream;
  14. import java.io.IOException;
  15. import java.net.URL;
  16. public class SheetWriteHandlerUtil implements SheetWriteHandler {
  17.     private String title;
  18.     private String[] header;
  19.     private String imageurl;
  20.     private String sheetName;
  21.     private final Log log = LogFactory.getLog(getClass());
  22.     public SheetWriteHandlerUtil(String title, String[] header, String imageurl, String sheetName) {
  23.         this.title = title;
  24.         this.header = header;
  25.         this.imageurl = imageurl;
  26.         this.sheetName = sheetName;
  27.     }
  28.     public SheetWriteHandlerUtil(String sheetName) {
  29.         this.sheetName = sheetName;
  30.     }
  31.     @Override
  32.     public void beforeSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
  33.     }
  34.     @Override
  35.     public void afterSheetCreate(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder) {
  36.         Workbook workbook = writeWorkbookHolder.getWorkbook();
  37.         Sheet sheet = workbook.getSheetAt(0);
  38.         if (StringUtils.isNotEmpty(sheetName)){
  39.             writeWorkbookHolder.getCachedWorkbook().setSheetName(0, sheetName);
  40.         }
  41.         if (StringUtils.isNotEmpty(title)){
  42.             //设置标题
  43.             Row row1 = sheet.createRow(0);
  44.             row1.setHeight((short) 800);
  45.             Cell cell = row1.createCell(0);
  46.             //设置单元格内容
  47.             cell.setCellValue(title);
  48.             CellStyle cellStyle = workbook.createCellStyle();
  49.             cellStyle.setVerticalAlignment(VerticalAlignment.CENTER);
  50.             cellStyle.setAlignment(HorizontalAlignment.LEFT);
  51.             Font font = workbook.createFont();
  52.             font.setBold(true);
  53.             font.setFontHeight((short) 400);
  54.             cellStyle.setFont(font);
  55.             cell.setCellStyle(cellStyle);
  56.         }
  57.         if (header != null){
  58.             // 第一行大标题占位设置
  59.             sheet.addMergedRegionUnsafe(new CellRangeAddress(0, 0, 0, header.length-1));
  60.         }
  61.         if(StringUtils.isNotEmpty(imageurl)){
  62.             try {
  63.                 imagewrite(writeWorkbookHolder,writeSheetHolder,imageurl);
  64.             } catch (IOException e) {
  65.                 e.printStackTrace();
  66.                 log.error("easyexcel拦截器图片流处理出错"+ e.getMessage());
  67.             }
  68.         }
  69.     }
  70.     public void imagewrite(WriteWorkbookHolder writeWorkbookHolder, WriteSheetHolder writeSheetHolder,String imageurl) throws IOException {
  71.         Workbook workbook = writeWorkbookHolder.getWorkbook();
  72.         Sheet sheet = workbook.getSheetAt(0);
  73.         try (ByteArrayOutputStream picOut = new ByteArrayOutputStream()) {
  74.             //读图片并写入流
  75.             BufferedImage bufferedImage = ImageIO.read(new URL(imageurl));
  76.             ImageIO.write(bufferedImage, "png", picOut);
  77.             ExcelUtils.addPictureToSheet(sheet, 3, 3, 0,0,workbook.addPicture(picOut.toByteArray(), HSSFWorkbook.PICTURE_TYPE_PNG),1.3,6.25);
  78.         } catch (Exception e) {
  79.             log.debug("", e);
  80.         }
  81.     }
  82. }
复制代码
自定义的EasyExcelUtils方法类
  1. import com.alibaba.excel.EasyExcel;
  2. import com.alibaba.excel.write.metadata.style.WriteCellStyle;
  3. import com.alibaba.excel.write.metadata.style.WriteFont;
  4. import com.alibaba.excel.write.style.HorizontalCellStyleStrategy;
  5. import com.alibaba.excel.write.style.column.LongestMatchColumnWidthStyleStrategy;
  6. import org.apache.commons.logging.Log;
  7. import org.apache.commons.logging.LogFactory;
  8. import org.apache.poi.ss.usermodel.*;
  9. import java.io.ByteArrayOutputStream;
  10. import java.util.*;
  11. /**
  12. * @author wangchaofan-n
  13. */
  14. public class EasyExcelUtils {
  15.     private final Log log = LogFactory.getLog(getClass());
  16.     /**
  17.      *
  18.      * @param list  数据
  19.      * @param title 标题
  20.      * @param header 动态列
  21.      */
  22.     public static void exportDetailLeave(List<Map<String,Object>> list, String title, String[] header,ByteArrayOutputStream out,String imageurl) {
  23.         // 标题样式
  24.         WriteCellStyle headWriteCellStyle = getHeadStyle();
  25.         // 这个策略是 头是头的样式 内容是内容的样式 其他的策略可以自己实现
  26.         HorizontalCellStyleStrategy horizontalCellStyleStrategy =
  27.                 new HorizontalCellStyleStrategy(headWriteCellStyle, new WriteCellStyle());
  28.         EasyExcel.write(out)
  29.                 // 第一行大标题样式设置
  30.                 .registerWriteHandler(new SheetWriteHandlerUtil(title,header, imageurl, null))
  31.                 //设置默认样式及写入头信息开始的行数
  32.                 .useDefaultStyle(true).relativeHeadRowIndex(1)
  33.                 // 表头、内容样式设置
  34.                 .registerWriteHandler(horizontalCellStyleStrategy)
  35.                 // 统一列宽,如需设置自动列宽则new LongestMatchColumnWidthStyleStrategy()
  36.                 //.registerWriteHandler(new SimpleColumnWidthStyleStrategy(25))
  37.                 .registerWriteHandler(new LongestMatchColumnWidthStyleStrategy())
  38.                 .sheet(title)
  39.                 // 这里放入动态头
  40.                 .head(head(header))
  41.                 // 当然这里数据也可以用 List<List<String>> 去传入
  42.                 .doWrite(detail(list));
  43.     }
  44.     private static List<List<Object>> detail(List<Map<String, Object>> mapList) {
  45.         List<List<Object>> list = new ArrayList<>();
  46.         for (Map<String, Object> map : mapList) {
  47.             List<Object> objectList = new ArrayList<>();
  48.             Set<Map.Entry<String,Object>> entrySet = map.entrySet();
  49.             for (Map.Entry<String,Object> entry :entrySet){
  50.                 objectList.add(entry.getValue());
  51.             }
  52.             list.add(objectList);
  53.         }
  54.         return list;
  55.     }
  56.     /**动态头传入*/
  57.     public static List<List<String>> head(String[] header) {
  58.         List<String> head0 = null;
  59.         List<List<String>> list = new LinkedList<>();
  60.         for (String h : header) {
  61.             head0 = new LinkedList<>();
  62.             head0.add(h);
  63.             list.add(head0);
  64.         }
  65.         return list;
  66.     }
  67.     public static WriteCellStyle getHeadStyle(){
  68.         // 头的策略
  69.         WriteCellStyle headWriteCellStyle = new WriteCellStyle();
  70.         // 背景颜色
  71.         headWriteCellStyle.setFillForegroundColor(IndexedColors.WHITE.getIndex());
  72.         headWriteCellStyle.setFillPatternType(FillPatternType.SOLID_FOREGROUND);
  73.         // 字体
  74.         WriteFont headWriteFont = new WriteFont();
  75.         headWriteFont.setFontName("黑体");//设置字体名字
  76.         headWriteFont.setFontHeightInPoints((short)15);//设置字体大小
  77.         headWriteFont.setBold(true);//字体加粗
  78.         headWriteCellStyle.setWriteFont(headWriteFont); //在样式用应用设置的字体;
  79.         // 样式
  80.         headWriteCellStyle.setBorderBottom(BorderStyle.THIN);//设置底边框;
  81.         headWriteCellStyle.setBottomBorderColor((short) 0);//设置底边框颜色;
  82.         headWriteCellStyle.setBorderLeft(BorderStyle.THIN);  //设置左边框;
  83.         headWriteCellStyle.setLeftBorderColor((short) 0);//设置左边框颜色;
  84.         headWriteCellStyle.setBorderRight(BorderStyle.THIN);//设置右边框;
  85.         headWriteCellStyle.setRightBorderColor((short) 0);//设置右边框颜色;
  86.         headWriteCellStyle.setBorderTop(BorderStyle.THIN);//设置顶边框;
  87.         headWriteCellStyle.setTopBorderColor((short) 0); //设置顶边框颜色;
  88.         headWriteCellStyle.setWrapped(true);  //设置自动换行;
  89.         headWriteCellStyle.setHorizontalAlignment(HorizontalAlignment.CENTER);//设置水平对齐的样式为居中对齐;
  90.         headWriteCellStyle.setVerticalAlignment(VerticalAlignment.CENTER);  //设置垂直对齐的样式为居中对齐;
  91.         //headWriteCellStyle.setShrinkToFit(true);//设置文本收缩至合适
  92.         return headWriteCellStyle;
  93.     }
  94. }
复制代码
调用示例
  1.             ByteArrayOutputStream out = new ByteArrayOutputStream()
  2.             // 此处填写表的列名
  3.             String[] heads = new String[]{"列名1","学习","题干","选项","答案","解析"};
  4.             // 此处为查询数据库语句
  5.             List<Map<String,Object>> list = nmgtkmanagemapper.querytkinfobystbhs(stbhs);
  6.             // 最后一位传参为电子章地址 若需要可传
  7.             EasyExcelUtils.exportDetailLeave(list,"表格的大标题",heads,out,null);
复制代码
免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

拉不拉稀肚拉稀

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表