使用POI读取Execl内容

本文详细介绍了一种使用Apache POI库读取和处理Excel文件的方法,包括如何解析不同版本的Excel文件(.xls和.xlsx),并将其转换为List<List<Object>>对象,以便进一步的数据处理和分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Maven 地址

      <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.15</version>
      </dependency>
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-scratchpad</artifactId>
      <version>3.15</version>
    </dependency>
    <!--start-->
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi</artifactId>
      <version>3.15</version>
    </dependency>
    <dependency>
      <groupId>fr.opensagres.xdocreport</groupId>
      <artifactId>xdocreport</artifactId>
      <version>1.0.6</version>
    </dependency>
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>poi-ooxml-schemas</artifactId>
      <version>3.15</version>
    </dependency>
    <dependency>
      <groupId>org.apache.poi</groupId>
      <artifactId>ooxml-schemas</artifactId>
      <version>1.3</version>
    </dependency>

2.源码

package com.ys.gassys.jbean;


import com.alibaba.fastjson.JSON;
import com.ys.gassys.bean.BeanUtil;
import org.apache.poi.hssf.usermodel.HSSFDateUtil;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.math.BigDecimal;

import java.text.SimpleDateFormat;
import java.util.*;
import com.ys.*;

/**
 * Created with IntelliJ IDEA.
 * Description:
 *
 * @author 王飞焱
 * Date: 12:01
 * Time: 2018/8/2
 */
public class ExcelUtils {
    private final static String excel2003L =".xls";    //2003- 版本的excel
    private final static String excel2007U =".xlsx";   //2007+ 版本的excel

    /**
     * 描述:获取IO流中的数据,组装成List<List<Object>>对象
     * @param in,fileName
     * @return
     * @throws IOException
     */
    public static  List<List<Object>> getBankListByExcel(InputStream in,String fileName) throws Exception{
        List<List<Object>> list = null;
        //创建Excel工作薄
        Workbook work = getWorkbook(in,fileName);
        if(null == work){
            throw new Exception("Excel工作薄为空!");
        }
        Sheet sheet = null;  //页数
        Row row = null;  //行数
        Cell cell = null;  //列数

        list = new ArrayList<List<Object>>();
        //遍历Excel中所有的sheet
        for (int i = 0; i < work.getNumberOfSheets(); i++) {
            sheet = work.getSheetAt(i);
            if(sheet==null){continue;}
            //遍历当前sheet中的所有行
            for (int j = sheet.getFirstRowNum(); j <= sheet.getLastRowNum(); j++) {
                row = sheet.getRow(j);
                //遍历所有的列
                List<Object> li = new ArrayList<Object>();
                for (int y = 0; y < 30; y++) {
                    cell = row.getCell(y);
                    System.out.println("我是cell"+cell);
                    li.add(getValue(cell));
                }
                list.add(li);
            }
        }

        return list;

    }

    /**
     * 描述:根据文件后缀,自适应上传文件的版本
     * @param inStr,fileName
     * @return
     * @throws Exception
     */
    public static Workbook getWorkbook(InputStream inStr,String fileName) throws Exception{
        Workbook wb = null;
        String fileType = fileName.substring(fileName.lastIndexOf("."));
        if(excel2003L.equals(fileType)){
            wb = new HSSFWorkbook(inStr);  //2003-
        }else if(excel2007U.equals(fileType)){
            wb = new XSSFWorkbook(inStr);  //2007+
        }else{
            throw new Exception("解析的文件格式有误!");
        }
        return wb;
    }

    /**
     * 描述:对表格中数值进行格式化
     * @param cell
     * @return
     */
    //解决excel类型问题,获得数值
    public static String getValue(Cell cell) {
        String value = "";
        if(null==cell){
            return value;
        }
        switch (cell.getCellType()) {
            //数值型
            case Cell.CELL_TYPE_NUMERIC:
                if (HSSFDateUtil.isCellDateFormatted(cell)) {
                    //如果是date类型则 ,获取该cell的date值
                    Date date = HSSFDateUtil.getJavaDate(cell.getNumericCellValue());
                    SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd");
                    value = format.format(date);;
                }else {// 纯数字
                    BigDecimal big=new BigDecimal(cell.getNumericCellValue());
                    value = big.toString();
                    //解决1234.0  去掉后面的.0
                    if(null!=value&&!"".equals(value.trim())){
                        String[] item = value.split("[.]");
                        if(1<item.length&&"0".equals(item[1])){
                            value=item[0];
                        }
                    }
                }
                break;
            //字符串类型
            case Cell.CELL_TYPE_STRING:
                value = cell.getStringCellValue().toString();
                break;
            // 公式类型
            case Cell.CELL_TYPE_FORMULA:
                //读公式计算值
                value = String.valueOf(cell.getNumericCellValue());
                if (value.equals("NaN")) {// 如果获取的数据值为非法值,则转换为获取字符串
                    value = cell.getStringCellValue().toString();
                }
                break;
            // 布尔类型
            case Cell.CELL_TYPE_BOOLEAN:
                value = " "+ cell.getBooleanCellValue();
                break;
            default:
                value = cell.getStringCellValue().toString();
        }
        if("null".endsWith(value.trim())){
            value="";
        }
        return value;
    }

    public static  List<BeanUtil> getBankListByExcel1(InputStream in, String fileName) throws Exception{
        List<BeanUtil> list = null;
        //创建Excel工作薄
        Workbook work = getWorkbook(in,fileName);
        if(null == work){
            throw new Exception("Excel工作薄为空!");
        }
        Sheet sheet = null;  //页数
        Row row = null;  //行数
        Cell cell = null;  //列数

        list = new ArrayList<>();
        //遍历Excel中所有的sheet
        for (int i = 0; i < work.getNumberOfSheets(); i++) {
            sheet = work.getSheetAt(i);
            if(sheet==null){continue;}
            //遍历当前sheet中的所有行
            BeanUtil beanUtil = null;
            for (int j = sheet.getFirstRowNum(); j <= sheet.getLastRowNum(); j++) {
                row = sheet.getRow(j);
                beanUtil = new BeanUtil();
                for (int y = 0; y < 4; y++) {
                    cell = row.getCell(y);
                    if(y == 0){
                        beanUtil.setProjectName(cell.toString());
                    }
                    if (y == 1) {
                        beanUtil.setSpecimen(cell.toString());
                    }
                    if (y == 2) {
                        beanUtil.setReferenceValue(cell.toString());
                    }
                    if (y == 3) {
                        beanUtil.setClinicalSignificance(cell.toString());
                    }
                }
                list.add(beanUtil);
            }
        }
        return list;
    }

    public static void main(String[] args) {

        Scanner scanner = new Scanner(System.in);


        String line = scanner.nextLine();

        char firstLetter = getFirstLetter(line);

        if(firstLetter != Character.MIN_VALUE) {
            System.out.println("首字母是:" + firstLetter);
        } else {
            System.out.println("字符串中不含有字母。");
        }
    }

    static char getFirstLetter(String line) {

        for(int i = 0; i < line.length(); i++) {

            if(Character.isLetter(line.charAt(i))) {
                return Character.toUpperCase(line.charAt(i));
            }
        }

        return Character.MIN_VALUE;
    }
}

 

下载excel表格工具类。controller:@RequestMapping(value = "/form", method = RequestMethod.GET) public ModelAndView downloadForm(HttpServletRequest request) { try {List<Map<String,Object>> listLog = maintainlogService.selectListByDownload(memberId,date,keyword);//查询数据库中的数据 //excel数据 List<Object> listData = new ArrayList<Object>(); if (null != listLog && listLog.size()>0){ BigDecimal totalPrice = new BigDecimal("0.0");//总金额 int count = 0;//总笔数 for(Map<String,Object> map : listLog){ totalPrice = totalPrice.add(new BigDecimal(map.get("maintainPrice").toString())); count ++; List<Object> data = new ArrayList<Object>(); data.add(map.get("addDate")); data.add(map.get("carUserName")); data.add(map.get("telPhone")); data.add(map.get("licence")); data.add(map.get("carBrand")); data.add(map.get("carQuestion")); data.add(map.get("maintainConten")); data.add(map.get("maintainPrice")); data.add(map.get("maintainDate")); if (StringUtils.isEmpty(memberId)){ data.add(map.get("mainName")); data.add(map.get("mainPhone")); } listData.add(data); } //excel表格最后一行 List<Object> footer = new ArrayList<Object>(); footer.add("总计:"); footer.add(count+"笔"); footer.add(totalPrice.doubleValue()+"元"); listData.add(footer); } //excel 头部 Map<String,Integer> mapRow = new LinkedHashMap<String,Integer>(); mapRow.put("日期",20 * 256); mapRow.put("车主",20 * 256); mapRow.put("车主电话",20 * 256); mapRow.put("车牌",20 * 256); mapRow.put("汽车品牌",20 * 256); mapRow.put("车辆问题",20 * 256); mapRow.put("维修内容",40 * 256); mapRow.put("维修金额",20 * 256); mapRow.put("维修日期",20 * 256); if (StringUtils.isEmpty(memberId)){ mapRow.put("维修商",30 * 256); mapRow.put("维修商电话",30 * 256); } //设置excel Map<String, Object> result = new HashMap<String, Object>(); result.put("excelTitle", date+"月信息明细"); result.put("excelName", date+"月信息明细数据"); result.put("titleMap", mapRow); result.put("dataList", listData); ExcelView excelView = new ExcelView(); return new ModelAndView(excelView, result); } catch (Exception e) { e.printStackTrace(); } return new ModelAndView(); js:function download(){ var date = $("#stime").val(); var keyword = $("#keyword").val(); [removed].href="<%=basePath%>/admin/mainInfo/form?date="+date+"&keyword;="+encodeURI(keyword); }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值