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

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;     } }
  本文仅供个人记录,大家可以借鉴,每行代码都是自己手打,亲测可直接粘贴执行,如有任何问题可在评论区提问,欢迎大家交流。
  编辑人:程序幻境
  码字不易,不喜勿踩
  写代码使我快乐

金牌颁奖推迟?俄奥队少女卡米拉药检没过关孙杨曾因此药禁赛过北京时间2月10日,冬奥会继续进行激烈的比赛,不过2月7日举行的花样滑冰女子团体赛决赛至今,夺冠的俄奥队还未进行颁奖仪式,按正常的情况下应该是在2月8日晚举行的呀,但是这一颁奖仪式近两千个!被禁言讽刺攻击运动员等近两千个微博账号被禁言冬奥赛场,荣誉和挫折交织,喜悦与遗憾同在。正如滑雪运动员谷爱凌在记者会中所说,失误和压力从来都是运动的一部分,我们都希望运动员能够拿到最好的成如愿以偿!英如镝终于登上冬奥赛场,英达实现多年夙愿美国队对阵中国队的男子冰球揭幕战备受关注,而在参赛队员中,身披98号球衣的他显得颇为抢眼。他是北京人,家门口作战的他为这一刻等待了很多年。虽然出场的时间不多,但作为东道主的他,能出春天的时候去爬山上山的路重新被修了一遍。从以前的泥巴田埂,变成了可以过车子的一条路。宽度是够了,路面不够平整。一路走到半山腰,脚底下的泥巴成了重重的鞋底子。在半山腰用枯草揩完鞋底的泥巴,后面都是干我和春天有个约会周末,久违的太阳洒在脸上,暖洋洋的,舒适极了,让人心情愉悦的同时又有些迷醉,这种美好的景色在平静而又美丽的江南省,让人心生向往,这也是为什么那么多人喜爱江南的原因之一。在江南省,有最近火了一种显高穿法,叫厚外套包脚踝,小个子都适合在如今这个季节,大家的穿搭越来越多样化,而且每个人都有着自己独特的审美,虽然时尚圈的趋势是变化莫测的,但大家依然能够找到适合自己的服饰,不过在这其中也有一些女孩一直都很迷茫,他们的邓紫棋好适合嘻哈风,一头脏辫好有个性,穿短西装还挺显高的随着时代的进步,越来越多的女性在穿衣打扮的时候会注重时尚感的表达,那么想要让自己的造型更加时尚的话,就可以尝试一些比较别致的服装搭配。比如说能够展现出嘻哈感的服装造型,就非常值得大戴维德春天即将到来,甲状腺疾病却是高发时期,如何提前预防?伴随着气温的逐渐升高,明显地感觉到春天的脚步愈来愈近了。初春时节,万物复苏,气温乍暖还寒,造成人体中枢神经兴奋性和紧张度较高,且春季感冒发烧患者较多,容易与甲状腺疾病发生混淆,从而春季是感冒高发期,推荐一款食疗汤膳初春几场连绵不绝的细雨,让空气变得寒冷又潮湿,这几天气温有所回升,不少人都脱下了厚重的冬装。宝安纯中医治疗医院内科马超英教授表示,春季气温虽有回升,但伴有多风,风为百病之长,切勿掉春季养肝养命,送你一份最全养护说明书求助春季养肝多吃一些猪肝对肝脏好还可以提高机体的免疫力这种说法是不是真的呢?张兰凤中国中医科学院西苑医院治未病中心主任医师猪肝真的补肝养肝吗猪肝在中医经典千金方中就记载,它具有主明干货!抓住智力发展关键期,36岁儿童的益智玩具怎么选?要论近年卖得最火的益智玩具,那些早教机器人绝对站C位!图文无关然而,这种毫无实际交互能力一问问题就装傻充愣的说唱机器人玩具,到底哪里好?(反正我家那个机器人已经吃灰很久了)给孩子挑
4岁宝宝被退学3次,老师这样溺爱下去,换哪个幼儿园都教不了退园这种现象是少见的,对于一般的不听指令的孩子,幼儿园是不会进行劝退的,但总有一些意外,让老师无奈。4岁宝宝被退学3次,老师直言我不是私人保姆,溺爱很可怕我一个老乡的孩子小明是家中前台小妹不理解为啥酒店钟点房那么受欢迎?4个小时够干啥很多酒店前台的工作者都不太明白,为什么酒店的钟点房这么受欢迎呢?(此处已添加小程序,请到今日头条客户端查看)接下来我们就来了解一下四个小时的钟点房都能做什么?其实钟点房的出现也是为冬藏正当时,做好这三藏中医调病讲究顺应四时,由于五脏在不同季节的盛衰不同,因此在养生上也要有侧重点,即春生夏长秋收冬藏。黄帝内经曾明确指出冬不藏精,春必病温。冬三月草木凋零,自然界万物闭藏,人体的阳气也脱发十级妹子生发秘籍发量翻倍秘密分享身为一个成功发量翻倍的人儿,我不得不讲两句哈!!掉头发多的那段时间,洗头的时候真的是一抓一大把都不敢梳头的那种每次看到掉落在地板上和床上的头发,心情就特别难过曾经心情一直就很抑郁想北京首例比特币挖矿案宣判投资者955万美元收益被认定无效一个比特币目前市价3万余美元,投资1000万一年就能挖到近300个因巨大的利益诱惑,网络虚拟货币比特币吸引了不少逐利者蜂拥而上,开启了通过专用矿机计算生产虚拟货币的挖矿活动。然而,科普乒乓球不同胶皮的分类乒乓球运动是一项依赖器材的竞技性体育活动。网传技术好,铲子也能打过你的说法,近十几年看来确实荒谬。作者的底板及配置五六十年代,乒乓球运动尚处于发展早期,对器材要求不高,但随着弧圈球黄晓明一把将关晓彤搂入怀中,谁注意她的手放哪?素质装不出来一说到黄晓明和关晓彤,大家应该都很熟悉,两人都凭综艺圈粉无数,像黄晓明还是有着无数经典语录的男明星,而关晓彤则是综艺里行走的衣架子,这样的两位明星同台又会碰撞出什么样的火花呢?大家给生活来点减法做精致女人从学会断舍离开始年轻的时候一直在给生活做加法,认识不同的人,接触新鲜的事物,扩展自己的兴趣爱好,学习不同的技能,买自己喜欢的小物件。方方面面都在积累,人也一直在成长。随着年龄的增加,很多东西积累的颠覆认知高盐饮食能抗癌防癌,抑制肿瘤细胞?到底是真是假?说到如今让人们闻之丧胆的疾病是什么,大家首先提到的就是癌症。各种各样的癌症越来越频发,而且也越来越趋向于年轻化,最关键的是很多癌症在发现的时候就已经到了中晚期治愈率非常低。即便是可产检的时候,你被医生吓到过吗?不太正常啊,你这个偏小两周。医生一脸严肃的说。小点没事吧,我胃口不好,不太能吃。我试探着解释道。怎么没事,有可能胎儿发育迟缓。医生一点也不顾及我的感受。我同事也检查偏小两周,医生说三观不正但很舒服的文案你要像我一样痛苦,才算道歉凉水怎么冲茶,你要是不热乎他能冲上来吗我瞧不上的人和事太多了,虽然我自己也狗屁不是,但这两者并不冲突永远年轻,永远骂人难听,永远干饭拿命拼我给你道歉,你跪