zoukankan      html  css  js  c++  java
  • Java解析Excel工具类(兼容xls和xlsx)

    依赖jar

            <dependency>
                <groupId>org.apache.poi</groupId>
                <artifactId>poi-ooxml</artifactId>
                <version>4.0.1</version>
            </dependency>

    ExcelUtils.java

    package javax.utils;
    
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.FileOutputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    import java.math.BigDecimal;
    import java.text.DateFormat;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.List;
    
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.DateUtil;
    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;
    
    /**
     * Excel 工具类(兼容xls和xlsx)
     * 
     * @author Logan
     * @version 1.0.0
     * @createDate 2019-03-07
     *
     */
    public class ExcelUtils {
    
        private static final String XLS = "xls";
        private static final String XLSX = "xlsx";
        private static final DateFormat FORMAT = new SimpleDateFormat("yyyy/MM/dd HH:mm:ss");
    
        /**
         * 输出数据到自定义模版的Excel输出流
         * 
         * @param excelTemplate 自定义模版文件
         * @param data 数据
         * @param outputStream Excel输出流
         * @throws IOException 错误时抛出异常,由调用者处理
         */
        public static void writeDataToTemplateOutputStream(File excelTemplate, List<List<Object>> data, OutputStream outputStream) throws IOException {
            Workbook book = ExcelUtils.getWorkbookFromExcel(excelTemplate);
            ExcelUtils.writeDataToWorkbook(null, data, book, 0);
            ExcelUtils.writeWorkbookToOutputStream(book, outputStream);
        }
    
        /**
         * 从Excel文件获取Workbook对象
         * 
         * @param excelFile Excel文件
         * @return Workbook对象
         * @throws IOException 错误时抛出异常,由调用者处理
         */
        public static Workbook getWorkbookFromExcel(File excelFile) throws IOException {
            try (
                    InputStream inputStream = new FileInputStream(excelFile);
            ) {
    
                if (excelFile.getName().endsWith(XLS)) {
                    return new HSSFWorkbook(inputStream);
                }
    
                else if (excelFile.getName().endsWith(XLSX)) {
                    return new XSSFWorkbook(inputStream);
                }
    
                else {
                    throw new IOException("文件类型错误");
                }
            }
        }
    
        /**
         * 把Workbook对象内容输出到Excel文件
         * 
         * @param book Workbook对象
         * @param file Excel文件
         * @throws FileNotFoundException 找不到文件异常,文件已创建,实际不存在该异常
         * @throws IOException 输入输出异常
         */
        public static void writeWorkbookToFile(Workbook book, File file) throws FileNotFoundException, IOException {
            if (!file.exists()) {
                if (!file.getParentFile().exists()) {
                    file.getParentFile().mkdirs();
                }
                file.createNewFile();
            }
            try (
                    OutputStream outputStream = new FileOutputStream(file);
            ) {
                writeWorkbookToOutputStream(book, outputStream);
            }
        }
    
        /**
         * 把Workbook对象输出到Excel输出流
         * 
         * @param book Workbook对象
         * @param outputStream Excel输出流
         * @throws IOException 错误时抛出异常,由调用者处理
         */
        public static void writeWorkbookToOutputStream(Workbook book, OutputStream outputStream) throws IOException {
            book.write(outputStream);
        }
    
        /**
         * 输出数据到Workbook对象中指定页码
         * 
         * @param title 标题,写在第一行,可传null
         * @param data 数据
         * @param book Workbook对象
         * @param page 输出数据到Workbook指定页码的页面数
         */
        public static void writeDataToWorkbook(List<String> title, List<List<Object>> data, Workbook book, int page) {
            Sheet sheet = book.getSheetAt(page);
    
            Row row = null;
            Cell cell = null;
    
            // 设置表头
            if (null != title && !title.isEmpty()) {
                row = sheet.getRow(0);
                if (null == row) {
                    row = sheet.createRow(0);
                }
    
                for (int i = 0; i < title.size(); i++) {
                    cell = row.getCell(i);
                    if (null == cell) {
                        cell = row.createCell(i);
                    }
                    cell.setCellValue(title.get(i));
                }
            }
    
            List<Object> rowData = null;
            for (int i = 0; i < data.size(); i++) {
    
                row = sheet.getRow(i + 1);
                if (null == row) {
                    row = sheet.createRow(i + 1);
                }
    
                rowData = data.get(i);
                if (null == rowData) {
                    continue;
                }
                for (int j = 0; j < rowData.size(); j++) {
                    cell = row.getCell(j);
                    if (null == cell) {
                        cell = row.createCell(j);
                    }
                    setValue(cell, rowData.get(j));
                }
            }
        }
    
        /**
         * 读取Excel文件第一页
         * 
         * @param pathname 文件路径名
         * @return 第一页数据集合
         * @throws IOException 错误时抛出异常,由调用者处理
         */
        public static List<List<Object>> readExcelFirstSheet(String pathname) throws IOException {
            File file = new File(pathname);
            return readExcelFirstSheet(file);
    
        }
    
        /**
         * 读取Excel文件第一页
         * 
         * @param file Excel文件
         * @return 第一页数据集合
         * @throws IOException 错误时抛出异常,由调用者处理
         */
        public static List<List<Object>> readExcelFirstSheet(File file) throws IOException {
            try (
                    InputStream inputStream = new FileInputStream(file);
            ) {
    
                if (file.getName().endsWith(XLS)) {
                    return readXlsFirstSheet(inputStream);
                }
    
                else if (file.getName().endsWith(XLSX)) {
                    return readXlsxFirstSheet(inputStream);
                }
    
                else {
                    throw new IOException("文件类型错误");
                }
            }
    
        }
    
        /**
         * 读取xls格式Excel文件第一页
         * 
         * @param inputStream Excel文件输入流
         * @return 第一页数据集合
         * @throws IOException 错误时抛出异常,由调用者处理
         */
        public static List<List<Object>> readXlsFirstSheet(InputStream inputStream) throws IOException {
            Workbook workbook = new HSSFWorkbook(inputStream);
            return readExcelFirstSheet(workbook);
        }
    
        /**
         * 读取xlsx格式Excel文件第一页
         * 
         * @param inputStream Excel文件输入流
         * @return 第一页数据集合
         * @throws IOException 错误时抛出异常,由调用者处理
         */
        public static List<List<Object>> readXlsxFirstSheet(InputStream inputStream) throws IOException {
            Workbook workbook = new XSSFWorkbook(inputStream);
            return readExcelFirstSheet(workbook);
        }
    
        /**
         * 读取Workbook第一页
         * 
         * @param book Workbook对象
         * @return 第一页数据集合
         */
        public static List<List<Object>> readExcelFirstSheet(Workbook book) {
            return readExcel(book, 0);
        }
    
        /**
         * 读取指定页面的Excel
         * 
         * @param book Workbook对象
         * @param page 页码
         * @return 指定页面数据集合
         */
        public static List<List<Object>> readExcel(Workbook book, int page) {
            List<List<Object>> list = new ArrayList<>();
            Sheet sheet = book.getSheetAt(page);
            for (int i = 0; i <= sheet.getLastRowNum(); i++) {
                Row row = sheet.getRow(i);
    
                // 如果当前行为空,则加入空,保持行号一致
                if (null == row) {
                    list.add(null);
                    continue;
                }
    
                List<Object> columns = new ArrayList<>();
                for (int j = 0; j < row.getLastCellNum(); j++) {
                    Cell cell = row.getCell(j);
                    columns.add(getValue(cell));
                }
    
                list.add(columns);
            }
    
            return list;
        }
    
        /**
         * 解析单元格中的值
         * 
         * @param cell 单元格
         * @return 单元格内的值
         */
        private static Object getValue(Cell cell) {
            if (null == cell) {
                return null;
            }
            Object value = null;
            switch (cell.getCellType()) {
            case BOOLEAN:
                value = cell.getBooleanCellValue();
                break;
    
            case NUMERIC:
    
                // 日期类型,转换为日期
                if (DateUtil.isCellDateFormatted(cell)) {
                    value = cell.getDateCellValue();
                }
    
                // 数值类型
                else {
    
                    // 默认返回double,创建BigDecimal返回准确值
                    value = new BigDecimal(cell.getNumericCellValue());
                }
                break;
    
            default:
                value = cell.toString();
                break;
            }
    
            return value;
        }
    
        /**
         * 设置单元格值
         * 
         * @param cell 单元格
         * @param value 值
         */
        private static void setValue(Cell cell, Object value) {
            if (null == cell) {
                return;
            }
    
            if (null == value) {
                cell.setCellValue((String) null);
            }
    
            else if (value instanceof Boolean) {
                cell.setCellValue((Boolean) value);
            }
    
            else if (value instanceof Date) {
                cell.setCellValue(FORMAT.format((Date) value));
            }
    
            else if (value instanceof Double) {
                cell.setCellValue((Double) value);
            }
    
            else {
                cell.setCellValue(value.toString());
            }
    
        }
    
    }

     

    .

  • 相关阅读:
    mysql通过一张表更新另一张表
    申请微信支付填错对公账号的解决办法
    radio 实现点击两次 第一次点击选中第二次点击取消
    C#修改下拉框选项的高度
    Centos7 用yum命令安装LAMP环境(php+Apache+Mysql)以及php扩展
    php备份数据库
    windows环境下 composer 的安装与使用
    PHP获取多维数据的交集与差集
    JS 图片懒加载
    搭建 window + nginx + php 开发环境
  • 原文地址:https://www.cnblogs.com/jonban/p/10491714.html
Copyright © 2011-2022 走看看