java解析xls和xlsx

工具类:

package com.zhxd.guaranteeStation.util;

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.poi.hssf.usermodel.HSSFDataFormat;
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;
public class ParseExcel {
    /**
     * 解析文件的方法
     *@param inputStream文件输入流 ,要解析的Excel文件输入流
     *@param suffix 后缀名,xls或xlsx,代码决定使用什么方式解析Excel
     *@param startRow 从第几行开始读取数据
     *@return List<String[]> 集合中的一个元素对应一行解析的数据
     *        元素为字符串数组类型,数组中的每一个元素对应一列数据
     * @throws IOException
     */

    public List<String[]> parseExcel(InputStream inputStream,String suffix,int startRow) throws IOException{
        //定义Excel对象变量
        Workbook workbook=null;
        //判断后缀 决定使用的解析方式,决定如何创建具体的对象
        if("xls".equals(suffix)) {
            //2003版的解析方式
            workbook=new HSSFWorkbook(inputStream);
        }else if("xlsx".equals(suffix)) {
            //2007
            workbook=new XSSFWorkbook(inputStream);
        }else {
            //未知内容
            return null;
        }
        //获取工作表,Excel分为若干个表,sheet
        //得到第一个表格sheet
        Sheet sheet = workbook.getSheetAt(0);
        if(sheet==null) {
            return null;
        }
        //获取表格中最后一行的行号
        int lastRowNum = sheet.getLastRowNum();
        //最后一行的行号大于startRow
        if(lastRowNum<startRow) {
            return null;
        }
        List<String[]> result=new ArrayList<String[]>();

        //定义行变量和单元格变量
        Row row=null;
        Cell cell=null;
        //循环读取
        for (int rowNum = startRow; rowNum <= lastRowNum; rowNum++) {
            row=sheet.getRow(rowNum);
            //获取当前行的第一列和最后一列的标记
            short firstCellNum = row.getFirstCellNum();
            short lastCellNum = row.getLastCellNum();
            if(lastCellNum!=0) {
                String[] rowArray=new String[lastCellNum];
                for(int cellNum=firstCellNum;cellNum<lastCellNum;cellNum++) {
                    //拿到单元格的值
                    cell=row.getCell(cellNum);
                    //判断单元格是否有数据
                    if(cell==null) {
                        rowArray[cellNum]=null;
                    }else {
                        rowArray[cellNum]=parseCell(cell);
                    }
                }
                result.add(rowArray);
            }
        }



        return result;
    }
    /**
     * 解析单元格数据(返回字符串)
     */

    private String parseCell(Cell cell) {
        String cellStr=null;
        //判断单元格的类型
        switch (cell.getCellType()) {
            case STRING :
                //字符串类型单元格
                cellStr=cell.getRichStringCellValue().toString();
                break;
            case BLANK :
                //空数据
                cellStr="";
                break;
            case NUMERIC :
                //数字类型  包含日期、时间、数字
                //判断日期【年月日2016-12-20  | 时分10:20】类型
                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");
                    }
                    Date temp = cell.getDateCellValue();
                    cellStr=sdf.format(temp);
                }else {
                    //数字
                    double temp=cell.getNumericCellValue();
                    //数字格式化工具
                    DecimalFormat format=new DecimalFormat();
                    //查看单元格中的具体样式类型
                    String formatStr=cell.getCellStyle().getDataFormatString();
                    if(formatStr.equals("General")) {
                        /**这个判断是四舍五入的,根据自己业务决定是否去掉
                         * 定义格式化正则
                         * 保留一位小数 #.#
                         * 保留两位小数#.##
                         */
                        format.applyPattern("#");
                    }
                    //保留小数点后三位
                    cellStr=format.format(temp);
                }
                break;
            default:
                cellStr="";

        }
        return cellStr;
    }
}

controller:

public Response uploadLineExcel(@RequestParam(value = "file") MultipartFile file, String taskId) throws Exception {
    List<BaozhangTaskGeneratrixLine> baozhangTaskGeneratrixLineList = new ArrayList<>();
    ParseExcel parser=new ParseExcel();
    InputStream inputStream = file.getInputStream();
    String suffix="xlsx";
    int startRow=1;
    List<String[]> result = parser.parseExcel(inputStream, suffix, startRow);

循环数组自己写

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
你可以使用Apache POI库来解析Excel文件。下面是一个使用Java解析Excel文件的示例代码: ```java import java.io.File; import java.io.FileInputStream; import java.io.IOException; import org.apache.poi.ss.usermodel.*; import org.apache.poi.xssf.usermodel.XSSFWorkbook; import org.apache.poi.hssf.usermodel.HSSFWorkbook; public class ExcelParser { public static void main(String[] args) { String filePath = "path/to/your/excel/file.xlsx"; // 替换为你的Excel文件路径 try { FileInputStream fis = new FileInputStream(new File(filePath)); Workbook workbook; if (filePath.endsWith(".xlsx")) { workbook = new XSSFWorkbook(fis); // 处理.xlsx文件 } else if (filePath.endsWith(".xls")) { workbook = new HSSFWorkbook(fis); // 处理.xls文件 } else { throw new IllegalArgumentException("The specified file is not Excel file"); } Sheet sheet = workbook.getSheetAt(0); // 获取第一个工作表 for (Row row : sheet) { for (Cell cell : row) { CellType cellType = cell.getCellType(); if (cellType == CellType.STRING) { System.out.print(cell.getStringCellValue() + " "); } else if (cellType == CellType.NUMERIC) { System.out.print(cell.getNumericCellValue() + " "); } else if (cellType == CellType.BOOLEAN) { System.out.print(cell.getBooleanCellValue() + " "); } } System.out.println(); } workbook.close(); fis.close(); } catch (IOException e) { e.printStackTrace(); } } } ``` 请将代码中的`"path/to/your/excel/file.xlsx"`替换为你实际的Excel文件路径。该代码会打开Excel文件并输出每个单元格的值。你可以根据需要对解析的内容进行进一步处理。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值