范文健康探索娱乐情感热点
投稿投诉
热点动态
科技财经
情感日志
励志美文
娱乐时尚
游戏搞笑
探索旅游
历史星座
健康养生
美丽育儿
范文作文
教案论文
国学影视

100个Java工具类之5多种方式解析和通过List生成Excel

  该系列为java工具类系列,主要展示100个常用的java工具类。
  此文重点讲述:多种方式解析Excel。
  本文目录:通过List生成Excel文件解析Excel文件(入参是MultipartFile)解析Excel文件(入参是Excel本地路径)
  一、通过List生成Excel文件import org.apache.poi.ss.usermodel.HorizontalAlignment; import org.apache.poi.ss.util.CellRangeAddress; import org.apache.poi.xssf.usermodel.*; import java.io.File; import java.io.FileOutputStream; import java.io.IOException; import java.text.SimpleDateFormat; import java.util.*;  /**  * @Author 程序幻境  * @Date 2022/11/19  * @Version 1.0  */ class ExcelUtils {      private static ExcelUtils instance = new ExcelUtils();      private ExcelUtils(){}      public static ExcelUtils getInstance(){         return instance;     }      /**      * 将 List> 类型的数据导出为 Excel      * 默认 Excel 文件的输出路径为 项目根目录下      * 文件名为 filename + 时间戳 + .xlsx      *      * @param mapList 数据源(通常为数据库查询数据)      * @param filename   文件名前缀, 实际文件名后会加上日期      * @param title   表格首行标题      * @return  文件输出路径      */     public String  createExcel(List> mapList, String filename, String title) {         //获取数据源的 key, 用于获取列数及设置标题         Map map = mapList.get(0);         Set stringSet = map.keySet();         ArrayList headList = new ArrayList<>(stringSet);          //定义一个新的工作簿         XSSFWorkbook wb = new XSSFWorkbook();         //创建一个Sheet页         XSSFSheet sheet = wb.createSheet(title);         //设置行高         sheet.setDefaultRowHeight((short) (2 * 256));         //为有数据的每列设置列宽         for (int i = 0; i < headList.size(); i++) {             sheet.setColumnWidth(i, 8000);         }         //设置单元格字体样式         XSSFFont font = wb.createFont();         font.setFontName("等线");         font.setFontHeightInPoints((short) 16);          //在sheet里创建第一行,并设置单元格内容为 title (标题)         XSSFRow titleRow = sheet.createRow(0);         XSSFCell titleCell = titleRow.createCell(0);         titleCell.setCellValue(title);         //合并单元格CellRangeAddress构造参数依次表示起始行,截至行,起始列, 截至列         sheet.addMergedRegion(new CellRangeAddress(0, 0, 0, headList.size() - 1));         // 创建单元格文字居中样式并设置标题单元格居中         XSSFCellStyle cellStyle = wb.createCellStyle();         cellStyle.setAlignment(HorizontalAlignment.CENTER);         titleCell.setCellStyle(cellStyle);          //获得表格第二行         XSSFRow row = sheet.createRow(1);         //根据数据源信息给第二行每一列设置标题         for (int i = 0; i < headList.size(); i++) {             XSSFCell cell = row.createCell(i);             cell.setCellValue(headList.get(i));         }          XSSFRow rows;         XSSFCell cells;         //循环拿到的数据给所有行每一列设置对应的值         for (int i = 0; i < mapList.size(); i++) {             //在这个sheet页里创建一行             rows = sheet.createRow(i + 2);             //给该行数据赋值             for (int j = 0; j < headList.size(); j++) {                 String value = mapList.get(i).get(headList.get(j)).toString();                 cells = rows.createCell(j);                 cells.setCellValue(value);             }         }          Date date = new Date();         SimpleDateFormat dateFormat = new SimpleDateFormat("yyyyMMdd");         // 使用项目根目录, 文件名加上时间戳         String path = System.getProperty("user.dir") + "" + filename + dateFormat.format(date) + ".xlsx";         try {             File file = new File(path);             FileOutputStream fileOutputStream = new FileOutputStream(file);             wb.write(fileOutputStream);             fileOutputStream.close();         } catch (IOException e) {             e.printStackTrace();         }         return path;     }      public static void main(String[] args) {         List> list = new ArrayList<>();         for (int i = 0; i < 3; i++) {             Map map = new HashMap<>();             map.put("测试1", i);             map.put("测试2", i);             map.put("测试3", i);             list.add(map);         }         ExcelUtils.getInstance().createExcel(list,"data","测试数据");     } }
  二、解析Excel文件(入参是Excel本地路径)/**  * @Author 程序幻境  * @Date 2022/11/19  * @Version 1.0  */ import java.io.IOException; import java.io.InputStream; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List; import org.apache.log4j.Logger; import org.apache.poi.hssf.usermodel.HSSFDataFormat; import org.apache.poi.hssf.usermodel.HSSFDateUtil; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.web.multipart.MultipartFile; /**  * 解析excel 上传数据  */ public class ExcelUtil {      private static final Logger log = Logger.getLogger(ExcelUtil.class);      /**      * 解析excel      * @param file      * @return      * @throws IOException      */     public static List getExcelData(MultipartFile file) throws IOException{         checkFile(file);         //获得Workbook工作薄对象         Workbook workbook = getWorkBook(file);         //创建返回对象,把每行中的值作为一个数组,所有行作为一个集合返回         List list = new ArrayList();         if(workbook != null){             for(int sheetNum = 0;sheetNum < workbook.getNumberOfSheets();sheetNum++){                 //获得当前sheet工作表                 Sheet sheet = workbook.getSheetAt(sheetNum);                 if(sheet == null){                     continue;                 }                 //获得当前sheet的开始行                 int firstRowNum  = sheet.getFirstRowNum();                 //获得当前sheet的结束行                 int lastRowNum = sheet.getLastRowNum();                 //循环除了所有行,如果要循环除第一行以外的就firstRowNum+1                 for(int rowNum = firstRowNum;rowNum <= lastRowNum;rowNum++){                     //获得当前行                     Row row = sheet.getRow(rowNum);                     if(row == null){                         continue;                     }                     //获得当前行的开始列                     int firstCellNum = row.getFirstCellNum();                     //获得当前行的列数                     int lastCellNum = row.getLastCellNum();                     String[] cells = new String[row.getLastCellNum()];                     //循环当前行                     for(int cellNum = firstCellNum; cellNum < lastCellNum;cellNum++){                         Cell cell = row.getCell(cellNum);                         cells[cellNum] = getCellValue(cell);                     }                     list.add(cells);                 }             }         }         return list;     }       /**      * 检查文件      * @param file      * @throws IOException      */     public static  void checkFile(MultipartFile file) throws IOException{         //判断文件是否存在         if(null == file){             log.error("文件不存在!");         }         //获得文件名         String fileName = file.getOriginalFilename();         //判断文件是否是excel文件         if(!fileName.endsWith("xls") && !fileName.endsWith("xlsx")){             log.error(fileName + "不是excel文件");         }     }     public static  Workbook getWorkBook(MultipartFile file) {         //获得文件名         String fileName = file.getOriginalFilename();         //创建Workbook工作薄对象,表示整个excel         Workbook workbook = null;         try {             //获取excel文件的io流             InputStream is = file.getInputStream();             //根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象             if(fileName.endsWith("xls")){                 //2003                 workbook = new HSSFWorkbook(is);             }else if(fileName.endsWith("xlsx")){                 //2007 及2007以上                 workbook = new XSSFWorkbook(is);             }         } catch (IOException e) {             log.error(e.getMessage());         }         return workbook;     }      public static String getCellValue(Cell cell){         String cellValue = "";         if(cell == null){             return cellValue;         }         //判断数据的类型         switch (cell.getCellType()){             case Cell.CELL_TYPE_NUMERIC: //数字                 cellValue = stringDateProcess(cell);                 break;             case Cell.CELL_TYPE_STRING: //字符串                 cellValue = String.valueOf(cell.getStringCellValue());                 break;             case Cell.CELL_TYPE_BOOLEAN: //Boolean                 cellValue = String.valueOf(cell.getBooleanCellValue());                 break;             case Cell.CELL_TYPE_FORMULA: //公式                 cellValue = String.valueOf(cell.getCellFormula());                 break;             case Cell.CELL_TYPE_BLANK: //空值                 cellValue = "";                 break;             case Cell.CELL_TYPE_ERROR: //故障                 cellValue = "非法字符";                 break;             default:                 cellValue = "未知类型";                 break;         }         return cellValue;     }      public static String stringDateProcess(Cell cell){         String result = new String();         if (HSSFDateUtil.isCellDateFormatted(cell)) {// 处理日期格式、时间格式             SimpleDateFormat sdf = null;             if (cell.getCellStyle().getDataFormat() == HSSFDataFormat.getBuiltinFormat("h:mm")) {                 sdf = new SimpleDateFormat("HH:mm");             } else {// 日期                 sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");             }             Date date = cell.getDateCellValue();             result = sdf.format(date);         } else if (cell.getCellStyle().getDataFormat() == 58) {             // 处理自定义日期格式:m月d日(通过判断单元格的格式id解决,id的值是58)             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");             double value = cell.getNumericCellValue();             Date date = org.apache.poi.ss.usermodel.DateUtil                     .getJavaDate(value);             result = sdf.format(date);         } else {             double value = cell.getNumericCellValue();             CellStyle style = cell.getCellStyle();             DecimalFormat format = new DecimalFormat();             String temp = style.getDataFormatString();             // 单元格设置成常规             if (temp.equals("General")) {                 format.applyPattern("#");             }             result = format.format(value);         }         return result;     } }
  三、解析Excel文件(入参是MultipartFile )
  MultipartFile是一种可以接收使用 多种请求方式 来进行上传文件的代表形式。
  MultipartFile是一个接口,继承自InputStreamSource,封装了getInputStream方法,因此MultipartFile文件可以转换为输入流。  /**  * @Author 程序幻境  * @Date 2022/11/19  * @Version 1.0  */  import java.io.FileInputStream; import java.io.IOException; import java.io.InputStream; import java.text.DecimalFormat; import java.text.SimpleDateFormat; import java.util.ArrayList; import java.util.Date; import java.util.List;  import org.apache.log4j.Logger; import org.apache.poi.hssf.usermodel.HSSFDataFormat; import org.apache.poi.hssf.usermodel.HSSFDateUtil; import org.apache.poi.hssf.usermodel.HSSFWorkbook; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.springframework.web.multipart.MultipartFile;  /**  * 解析excel 上传数据  */ public class ExcelUtil {      private static final Logger log = Logger.getLogger(ExcelUtil.class);      public static void main(String[] args) {         try {             getExcelData("C:UsersZXCDesktop1.xlsx");         } catch (IOException e) {             e.printStackTrace();         }     }     /**      * 解析excel      * @param file      * @return      * @throws IOException      */     public static List getExcelData(String filePath) throws IOException{          //通过输入流,读取excel文件         FileInputStream input = new FileInputStream(filePath);          //将输入流传入Workbook         Workbook workbook = new XSSFWorkbook(input);          //创建返回对象,把每行中的值作为一个数组,所有行作为一个集合返回         List list = new ArrayList();         if(workbook != null){             for(int sheetNum = 0;sheetNum < workbook.getNumberOfSheets();sheetNum++){                 //获得当前sheet工作表                 Sheet sheet = workbook.getSheetAt(sheetNum);                 if(sheet == null){                     continue;                 }                 //获得当前sheet的开始行                 int firstRowNum  = sheet.getFirstRowNum();                 //获得当前sheet的结束行                 int lastRowNum = sheet.getLastRowNum();                 //循环除了所有行,如果要循环除第一行以外的就firstRowNum+1                 for(int rowNum = firstRowNum;rowNum <= lastRowNum;rowNum++){                     //获得当前行                     Row row = sheet.getRow(rowNum);                     if(row == null){                         continue;                     }                     //获得当前行的开始列                     int firstCellNum = row.getFirstCellNum();                     //获得当前行的列数                     int lastCellNum = row.getLastCellNum();                     String[] cells = new String[row.getLastCellNum()];                     //循环当前行                     for(int cellNum = firstCellNum; cellNum < lastCellNum;cellNum++){                         Cell cell = row.getCell(cellNum);                         cells[cellNum] = getCellValue(cell);                     }                     list.add(cells);                 }             }         }         return list;     }     /**      * 检查文件      * @param file      * @throws IOException      */     public static  void checkFile(MultipartFile file) throws IOException{         //判断文件是否存在         if(null == file){             log.error("文件不存在!");         }         //获得文件名         String fileName = file.getOriginalFilename();         //判断文件是否是excel文件         if(!fileName.endsWith("xls") && !fileName.endsWith("xlsx")){             log.error(fileName + "不是excel文件");         }     }     public static  Workbook getWorkBook(MultipartFile file) {         //获得文件名         String fileName = file.getOriginalFilename();         //创建Workbook工作薄对象,表示整个excel         Workbook workbook = null;         try {             //获取excel文件的io流             InputStream is = file.getInputStream();             //根据文件后缀名不同(xls和xlsx)获得不同的Workbook实现类对象             if(fileName.endsWith("xls")){                 //2003                 workbook = new HSSFWorkbook(is);             }else if(fileName.endsWith("xlsx")){                 //2007 及2007以上                 workbook = new XSSFWorkbook(is);             }         } catch (IOException e) {             log.error(e.getMessage());         }         return workbook;     }     public static String getCellValue(Cell cell){         String cellValue = "";         if(cell == null){             return cellValue;         }         //判断数据的类型         switch (cell.getCellType()){             case Cell.CELL_TYPE_NUMERIC: //数字                 cellValue = stringDateProcess(cell);                 break;             case Cell.CELL_TYPE_STRING: //字符串                 cellValue = String.valueOf(cell.getStringCellValue());                 break;             case Cell.CELL_TYPE_BOOLEAN: //Boolean                 cellValue = String.valueOf(cell.getBooleanCellValue());                 break;             case Cell.CELL_TYPE_FORMULA: //公式                 cellValue = String.valueOf(cell.getCellFormula());                 break;             case Cell.CELL_TYPE_BLANK: //空值                 cellValue = "";                 break;             case Cell.CELL_TYPE_ERROR: //故障                 cellValue = "非法字符";                 break;             default:                 cellValue = "未知类型";                 break;         }         return cellValue;     }     public static String stringDateProcess(Cell cell){         String result = new String();         if (HSSFDateUtil.isCellDateFormatted(cell)) {// 处理日期格式、时间格式             SimpleDateFormat sdf = null;             if (cell.getCellStyle().getDataFormat() == HSSFDataFormat.getBuiltinFormat("h:mm")) {                 sdf = new SimpleDateFormat("HH:mm");             } else {// 日期                 sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");             }             Date date = cell.getDateCellValue();             result = sdf.format(date);         } else if (cell.getCellStyle().getDataFormat() == 58) {             // 处理自定义日期格式:m月d日(通过判断单元格的格式id解决,id的值是58)             SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");             double value = cell.getNumericCellValue();             Date date = org.apache.poi.ss.usermodel.DateUtil                     .getJavaDate(value);             result = sdf.format(date);         } else {             double value = cell.getNumericCellValue();             CellStyle style = cell.getCellStyle();             DecimalFormat format = new DecimalFormat();             String temp = style.getDataFormatString();             // 单元格设置成常规             if (temp.equals("General")) {                 format.applyPattern("#");             }             result = format.format(value);         }         return result;     } }
  本文仅供个人记录,大家可以借鉴,每行代码都是自己手打,亲测可直接粘贴执行,如有任何问题可在评论区提问,欢迎大家交流。
  编辑人:程序幻境
  码字不易,不喜勿踩
  写代码使我快乐

戴笠坠机的真相如何?台湾一老妇临终前道破天机,却始终无人敢信在阅读此文之前,麻烦您点击一下关注,既方便您进行讨论与分享,又给您带来不一样的参与感,感谢您的支持!前言1946年3月,一架国民党飞机撞毁在了岱山半山腰上,戴笠因而丧生。表面上看这工业革命为什么首先出现在英国?良好的政治制度是前提英国是人类文明史上必须要提到的国家,它开创了一个崭新的近现代文明,彻底改变了人类的命运。可以说,不了解英国,你就无法理解现在的世界为什么会是这个样子的。谁能想到这样一个落后偏远的岛凤翅镏金镋与擂鼓瓮金锤的三场恶战,励志高手始终斗不过传奇英雄齐名方天画戟和三尖两刃刀的凤翅镏金镋,在演义故事中并不是太多出现,这种神兵利器展露之时总会有励志高手的显现,毕竟这也是融汇多种兵器之长而锻造而成,力量与巧妙的招法交替之下有着变幻莫探析殷墟都城人口与经济的增长变化殷都人口数量估算的方法,应该是都城的面积乘以古代都城人口分布的密度。虽然不大准确,但我们认为,这是目前唯一可以运用的有效方法,因为在一般情况下,都城规模的大小,毕竟还是与其人口的多曾经帮助秦国攻下楚国国都,却最后被秦人抛弃,祖祖辈辈是穷人历史开讲序在中国历史上出现过很多神秘而又短暂的文明,比如大家熟悉的三星堆文明,契丹文明,红山文明等等。因为文献极其缺少,这些文明一直是中国历史上的黑洞,大家对于他们为什么会出现又如对朱可夫元帅进行搜查时,是什么令肃反工作人员感到惊讶1948年1月对朱可夫元帅位于莫斯科郊区鲁勃廖夫村的别墅进行了搜查,显然,这一搜查行动是经过约瑟夫斯大林本人批准的。为什么斯大林要搜查朱可夫的别墅?肃反人员找到了什么?卫国战争结束湖北荆门市近代名人简介(下)吴奚如(1906年1985年),湖北京山城关人。1925年入黄埔军校第二期学习,同年加入中国共产党。曾先后参加北伐战争八一南昌起义,历经西安事变皖南事变延安整风等重大历史事件。曾任古代穷人娶不起老婆,该如何传宗接代?他们想出了一个畸形办法在阅读此文前,诚邀您点击一下关注,既方便您进行讨论与分享,又给您带来不一样的参与感,感谢您的支持。引言现代社会中在生育问题上依旧存在着重男轻女一系列的错误观点,甚至在这些错误思想的部队多兵种协同作战宽带无线自组网应急通信解决方案概述为加快适应部队信息化建设发展需求,达到总部提出的指挥实时化监控可视化的要求,提高作战勤务值班员对一线哨兵的指挥水平和指挥手段,高标准实现两个确保,急需建设一套部队战场协同作战宽成化难兴(七章)项忠平定固原盗乱,为何引发彭时和兵部尚书冲突明宪宗朱见深时代是明朝内忧外患不断的时代,那时明朝外有蒙古女真部族频繁寇边,內有各地少数民族和地方势力起兵叛乱,使得国家长期处于战争的状态之中。朱见深不得不派出大量的军队四方征讨,宝山落实北转型战略部署,2023年新开工政府投资项目110项新民晚报讯(记者郭剑烽)聚焦北转型战略,锚定主阵地主城区样板区发展定位,充分发挥政府投资对助力巩固经济回升向好的关键作用。2023年宝山区政府投资计划新开工项目110个,其中重大工
刚刚,离岸人民币一度跌破6。99!普京俄罗斯正在放弃使用这两种货币!郑州重磅宣布大干30天中国基金报泰勒大家好,昨天上证涨,今天创业板涨,深市两大巨头比亚迪宁德时代在中报后跌跌不休,今天迎来大反弹。相信这两天大家或多或少都吃肉喝汤了吧大盘低开后震荡反弹,创业板指全天领涨近日金龟子离开北京去青岛婆家定居在海边捞鱼虾开心逗趣场面欢乐近日金龟子离开北京去青岛婆家定居穿高档皮鞋在海边捞鱼虾开心逗趣场面欢乐近日,儿童节目知名主持人金龟子刘纯燕离开北京去青岛婆家定居,打扮仔细穿高档皮鞋在海边捞鱼虾开心逗趣场面真的很欢S12小组赛时间疑似泄露!北京时间凌晨3点开始,淘汰赛5点S12世界赛即将开赛,JDGTESEDGRNG将代表LPL出征。这次世界赛是在北美举办,比赛的时间令国内的网友十分关注。就在近日,外网售票网站开始售票,并泄露了比赛时间。据外网售票不要再用我是为你好来把别人的价值观强加给我了我们听过太多次这些话了。你太年轻了没经验,这么想不对。以后你就知道了,你得后悔。你看,还是小孩儿。我是为你好。一个人去评判另一个人生活得好不好,是否成功,依据的都是自己心里认同的价北京市十四五时期住房保障规划发布昨天,市住建委发布北京市十四五时期住房保障规划。十四五时期,本市力争建设筹集保障性租赁住房40万套(间)。与此同时,新增保障性租赁住房公租房共有产权住房供地,占住房用地比重分别不低LOL国外售票网站曝光S12赛程时间,或将在北京时间早上5点开始2022全球总决赛将在北京时间9月29日落地北美,JDGTESEDGRNG四队代表LPL赛区出战S12。近日国外售票网站Ticketmaster上显示出了S12世界赛从小组赛到半决钱学森分到一辆蓝色轿车当专车,全北京就两辆,聂荣臻赶紧换掉钱学森力排万难,终于回到国内,成为了中国人民的追捧对象,然而在国家为他分配专车后,却被聂荣臻要求立马换掉。那么这辆车到底是谁安排的?聂荣臻又为何要求换车?一圈三连,点个关注钱学森历大家只知道吃果实,其实它的叶子价值更高,能祛暑热,健脾胃导语大家只知道吃果实,其实它的叶子价值更高,能祛暑热,健脾胃,还能去脂减肥说起水果大家都喜欢吃,大部分的水果含有丰富的维生素和氨基酸等,这些营养物质有美容养颜延缓衰老预防疾病的作用2022全球首发节启动!北京三里屯王府井等商圈齐参与9月6日上午,由北京市商务局朝阳区政府朝阳区商务局中国服装设计师协会联合举办的2022全球首发节2023春夏中国国际时装周在751DPARK开幕。2022全球首发节将按照一主多辅,欢乐颂3,我不能理解的三观今天刚刚刷完了欢乐颂3,一共33集的电视剧,这里仅就本季的内容发表一些看法。电视剧中何悯鸿,好像是电视剧中专门挑出的一个处处出错,让人讨厌的人物。在单位里,同事不喜欢,领导想赶走在顶着小张柏芝名号出道的她,现状怎么样了?被誉为娱乐圈颜值天花板的张柏芝,即使年逾四十,依旧皮肤紧致,美艳逼人。这些人顶着小张柏芝名号的人不在少数,今年就盘点一下这些人中曾出名过的贡米。贡米,江苏南京人。2009年因参加快