精华内容
下载资源
问答
  • 主要介绍了Java通过反射将 Excel 解析成对象集合实例,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
  • java后台对Excel解析

    2019-04-15 12:27:34
    java后台对Excel解析
  • js实现excel文件上传解析,返回json并显示到页面 支持两种格式
  • Java读取Excel解析为JavaBean。 本类使用apache下的poi,解决Java读取大数据量Excel时内存溢出问题。 轻松读取10W数据量,未测试上限。
  • 基于EasyExcel框架的excel解析工具类。EasyExcel是阿里的excel解析工具,使用快捷方便,轻量。封装了常用的方法。使用前需要了解easyExcel的基本用法。
  • Excel解析工具POI.jar

    2017-08-27 15:56:05
    Excel解析工具POI.jar
  • python Excel解析源码

    2018-06-10 19:10:09
    本工具是生成一份Excel记录模板,使用xlsxwriter模块生成Excel结果,输出结果在output目录,可自行下载打开参考。
  • java版excel解析封装

    2016-09-29 13:55:33
    一行代码搞定excel表格导入,请用myeclipse测试
  • java版excel解析,并上传至mysql数据库。已包含jar包,数据库sql语句等,eclipse直接运行client.java
  • excel解析成json数据或二维数组 excel文件解析过程的规则校验, 如限制行,列数, 限制模版头部, 校验规则可扩展 excel解析支持异步配置 json数组数据, 转excel文件下载 使用示例 Excel类实例 构造函数参数说明 options...
  • 主要介绍了springboot实现上传并解析Excel过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
  • Excel解析的几种实现方式

    千次阅读 2020-08-31 00:44:56
    文章目录Java读写Excel的方法POIJXLFastExcel读写PDFJXL的使用写Excel文档读取ExcelPOI使用写入Excel读取Excel创建高版本的Excel Java读写Excel的方法 有三种方式: POI JXL FASTEXCEL POI 是Apache软件基金会的...

    Java读写Excel的方法

    有三种方式:

    1. POI
    2. JXL
    3. FASTEXCEL

    POI

    是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office 格式档案读和写的功能。
    HSSF 是Horrible SpreedSheet Format的缩写,也即“讨厌的电子表格格式”。通过HSSF,你可以用纯Java代码来读取、写入、修改Excel文件。

    需要注意的是HSSF只能读写Microsoft Excel格式的档案,即2003~2007的Excel版本;要想读取2007以上版本的档案,就需要使用XSSF了。

    当然POI还可以对不同的word文档进行操作,还有ppt、visio也可以读写。

    API类目标类型
    HSSFMicrosoft Excel格式的档案
    XSSFMicrosoft Excel OOXML格式的档案
    HWPFMicrosoft Word格式的档案
    HSLFMicrosoft PowerPoint格式的档案
    HDGFMicrosoft Visio格式的档案

    JXL

    Java Excel是一个开源的源码项目,可以读、写、修改Excel文件。包括常见的格式的设置:字体、颜色、背景、合并单元格等等。

    POIJXL
    效率高效率低
    操作相对复杂操作简单
    支持公式、宏、图像图表,一些企业应用上会非常实用部分支持
    能够修饰单元格属性能,格式支持不如POI强大
    支持字体、数字、日期操作支持字体、数字、日期操作

    FastExcel

    FastExcel是一个采用纯Java开发的excel文件读写组件,支持Excel97~2003文件格式。
    FastExcel只能读写单元格的字符信息,而其它的属性如颜色、字体等就不支持了,因此FastExcel只需很小的内存。

    读写PDF

    通过iText不仅可以生成PDF或rtf文档,而且还可以将XML、Html文件转化为PDF。

    下载iText.jar文件后,只需要在系统的classpath中加入iText.jar的路径,在程序中就可以使用iText类库了。

    JXL的使用

    写Excel文档

    import jxl.Workbook;
    import jxl.write.Label;
    import jxl.write.WritableSheet;
    import jxl.write.WritableWorkbook;
    
    import java.io.File;
    
    public class JXLDemo {
        public static void main(String[] args) {
            //创建Excel文件
            File file=new File("e:/excel/jxl_test.xls");
            try {
                System.out.println(file.exists());
                file.getParentFile().mkdirs();
                file.createNewFile();
                //创建工作薄
                WritableWorkbook workbook= Workbook.createWorkbook(file);
                //创建Sheet
                WritableSheet sheet=workbook.createSheet("sheet1",0);
                Label label=null;
                //第一行设置表头
                String [] title={"id","name","sex"};
                for(int i=0;i<title.length;i++){
                    label=new Label(i,0,title[i]);//列,行,列值
                    sheet.addCell(label);
                }
                //第二行开始追加数据
                for(int i=1;i<10;i++){
                    label=new Label(0,i,"a"+i);
                    sheet.addCell(label);
                    label=new Label(1,i,"user"+i);
                    sheet.addCell(label);
                    label=new Label(2,i,"男");
                    sheet.addCell(label);
                }
                //写入文件
                workbook.write();
                workbook.close();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
    

    运行效果
    在这里插入图片描述

    读取Excel

    import jxl.Cell;
    import jxl.Sheet;
    import jxl.Workbook;
    
    import java.io.File;
    
    public class JXLReadDemo {
        public static void main(String[] args) {
            try {
                //创建workbook
                Workbook workbook = Workbook.getWorkbook(new File("e:/excel/jxl_test.xls"));
                //获取工作表sheet
                Sheet sheet =workbook.getSheet(0);
                //获取数据
                for(int i=0;i<sheet.getRows();i++){
                    for(int j=0;j<sheet.getColumns();j++){
                        Cell cell=sheet.getCell(j,i);
                        System.out.print(cell.getContents()+" ");
                    }
                    System.out.println();
                }
                workbook.close();
            }catch (Exception e){
                e.printStackTrace();
            }
        }
    }
    

    运行效果

    id name sex 
    a1 user1 男 
    a2 user2 男 
    a3 user3 男 
    a4 user4 男 
    a5 user5 男 
    a6 user6 男 
    a7 user7 男 
    a8 user8 男 
    a9 user9 男 
    

    POI使用

    写入Excel

    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.10.1</version>
    </dependency>
    <dependency>
       <groupId>commons-io</groupId>
       <artifactId>commons-io</artifactId>
       <version>2.2</version>
    </dependency>
    
    import org.apache.commons.io.FileUtils;
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class POIDemo {
        public static void main(String[] args) {
            //创建Excel工作薄
            HSSFWorkbook workbook=new HSSFWorkbook();
            //创建一个工作表sheet
            HSSFSheet sheet=workbook.createSheet();
            //创建第一行表头
            HSSFRow row=sheet.createRow(0);
            //定义表头
            String [] title={"id","name","sex"};
            HSSFCell cell=null;
            for(int i=0;i<title.length;i++){
                cell=row.createCell(i);
                cell.setCellValue(title[i]);
            }
            //追加数据
            for(int i=1;i<10;i++){
                HSSFRow nextRow=sheet.createRow(i);
                HSSFCell cell2=nextRow.createCell(0);
                cell2.setCellValue("a"+i);
                cell2=nextRow.createCell(1);
                cell2.setCellValue("user"+i);
                cell2=nextRow.createCell(2);
                cell2.setCellValue("男");
            }
            //创建文件
            File file=new File("e:/excel/poi_test.xls");
            file.getParentFile().mkdirs();
            try {
                file.createNewFile();
                //数据存盘
                FileOutputStream stream= FileUtils.openOutputStream(file);
                workbook.write(stream);
                stream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    运行效果
    在这里插入图片描述

    读取Excel

    import org.apache.commons.io.FileUtils;
    import org.apache.poi.hssf.usermodel.HSSFCell;
    import org.apache.poi.hssf.usermodel.HSSFRow;
    import org.apache.poi.hssf.usermodel.HSSFSheet;
    import org.apache.poi.hssf.usermodel.HSSFWorkbook;
    
    import java.io.File;
    import java.io.FileOutputStream;
    import java.io.IOException;
    
    public class POIReadExcel {
        public static void main(String[] args) {
            //需要解析的Excel文件
            File file=new File("e:/excel/poi_test.xls");
            try {
                //创建Excel,读取文件内容
                HSSFWorkbook workbook=new HSSFWorkbook(FileUtils.openInputStream(file));
                //获取Sheet方式一
                HSSFSheet sheet=workbook.getSheet("Sheet0");
                //获取sheet方式二 下标
                sheet=workbook.getSheetAt(0);
                //读取第一行
                int firstRowNum=0;
                int lastRowNum=sheet.getLastRowNum();
                for(int i=0;i<=lastRowNum;i++){
                    HSSFRow row=sheet.getRow(i);
                    int lastCellNum=row.getLastCellNum();
                    for(int j=0;j<lastCellNum;j++){
                        HSSFCell cell=row.getCell(j);
                        String value=cell.getStringCellValue();
                        System.out.print(value+" ");
                    }
                    System.out.println();
                }
    
            } catch (IOException e) {
                e.printStackTrace();
            }
    
        }
    }
    

    运行效果

    id name sex 
    a1 user1 男 
    a2 user2 男 
    a3 user3 男 
    a4 user4 男 
    a5 user5 男 
    a6 user6 男 
    a7 user7 男 
    a8 user8 男 
    a9 user9 男 
    

    创建高版本的Excel

    我们还需要导入
    只需要再在创建低版本的Excel文档的代码上做下改动,将HSSF改为XSSF就可以,最后再修改下文件名的后缀为.xlsx。

    public class POICreateXlsx {
        public static void main(String[] args) {
            //创建Excel工作薄
            XSSFWorkbook workbook=new XSSFWorkbook();
            //创建一个工作表sheet
            XSSFSheet sheet=workbook.createSheet();
            //创建第一行表头
            XSSFRow row=sheet.createRow(0);
            //定义表头
            String [] title={"id","name","sex"};
            XSSFCell cell=null;
            for(int i=0;i<title.length;i++){
                cell=row.createCell(i);
                cell.setCellValue(title[i]);
            }
            //追加数据
            for(int i=1;i<10;i++){
                XSSFRow nextRow=sheet.createRow(i);
                XSSFCell cell2=nextRow.createCell(0);
                cell2.setCellValue("a"+i);
                cell2=nextRow.createCell(1);
                cell2.setCellValue("user"+i);
                cell2=nextRow.createCell(2);
                cell2.setCellValue("男");
            }
            //创建文件
            File file=new File("e:/excel/poi_test.xlsx");
            file.getParentFile().mkdirs();
            try {
                file.createNewFile();
                //数据存盘
                FileOutputStream stream= FileUtils.openOutputStream(file);
                workbook.write(stream);
                stream.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
    }
    

    在实际使用中,我们并不知道用户机器装的是高版本Excel,还是低版本Excel,为了兼容性,我们通常使用XSSF* 来创建Excel文档,最后写入文件时候,文件的名称起低版本的后缀“xls”,这样客户不论是2007(包括)以前还是2007以后(不包括),都可以打开文档了。

    展开全文
  • 百万级Excel解析工具类1
  • 本资源对应我的一片文章《基于Java语言SpringMVC框架的Excel上传解析以及下载教程》提供的jar依据,其中内容仅供参考,建议阅读那篇文章
  • 这个项目是为想要将 xml 解析excel 文件的人设计的。
  • Excel解析器 Excel Parser提供了一个功能,可以轻松地从Spring引导应用程序中提取Excel数据。 使用Apache POI库对API进行了抽象,并且通过使用Excel Parser,用户可以专注于编写业务逻辑。 同时支持DOM类型...
  • excel 解析

    2011-04-14 13:28:50
    C++解析excel ExcelFeedSources.zip ExcelFeedDemo.zip
  • python对excel解析

    千次阅读 2018-05-30 18:00:12
    下面展示了2种方法读取excel的数据.第一种方法通过索引,控制第几行第几列开始读取excel数据.第二种方法通过读取sheet表名,毕竟一个excel文件可能会含有多个sheet.具体使用还是视情况而定#coding=utf-8 __author__ = ...
    下面展示了2种方法读取excel的数据.第一种方法通过索引,控制第几行第几列开始读取excel数据.
    第二种方法通过读取sheet表名,毕竟一个excel文件可能会含有多个sheet.具体使用还是视情况而定
    #coding=utf-8
    __author__ = "***"
    __date__ = "2018/5/30 16:50"
    
    # 读写excel工作表
    import  xdrlib ,sys
    import xlrd
    filename='E:/PycharmProjects/PycharmProjects/test_1/Directory/***.xlsx'
    def open_excel(file=filename):
        try:
            data = xlrd.open_workbook(file)
            return data
        except Exception as e:
            print("文件打开失败,str(e)是",str(e))
    
    #根据索引获取Excel表格中的数据   参数:file:Excel文件路径     colnameindex:表头列名所在行的所以  ,by_index:表的索引
    def excel_table_byindex(file=filename,colnameindex=0,by_index=0):
        data = open_excel(file)
        table = data.sheets()[by_index]
        nrows = table.nrows #行数
        ncols = table.ncols #列数
        colnames =  table.row_values(colnameindex) #某一行数据
        list =[]
        for rownum in range(1,nrows):
             row = table.row_values(rownum)
             if row:
                 app = {}
                 for i in range(len(colnames)):
                    app[colnames[i]] = row[i]
                 list.append(app)
        return list
    
    #根据名称获取Excel表格中的数据   参数:file:Excel文件路径     colnameindex:表头列名所在行的所以  ,by_name:Sheet1名称
    def excel_table_byname(file= filename,colnameindex=0,by_name=u'***'):
        data = open_excel(file)
        table = data.sheet_by_name(by_name)
        nrows = table.nrows #行数
        colnames =  table.row_values(colnameindex) #某一行数据
        list =[]
        for rownum in range(1,nrows):
             row = table.row_values(rownum)
             if row:
                 app = {}
                 for i in range(len(colnames)):
                    app[colnames[i]] = row[i]
                 list.append(app)
        return list
    
    def main():
       tables = excel_table_byindex()
       for row in tables:
           print(row)
    
       # tables = excel_table_byname()  #可以试试这一种
       # for row in tables:
       #     print(row)
    
    if __name__=="__main__":
        main()
    展开全文
  • Excel 解析,一般来说是在服务端进行的,但是如果移动端要实现解析Excel的功能,那也是有实现的方法的。 不过由于Android 原生用Java/Kotlin实现,所以也可以参考服务端解析Excel的方法。 首先说,jxl,过去比较流行...

    Excel 解析,一般来说是在服务端进行的,但是如果移动端要实现解析Excel的功能,那也是有实现的方法的。

    不过由于Android 原生用Java/Kotlin实现,所以也可以参考服务端解析Excel的方法。

    首先说,jxl,过去比较流行的解析office文档的框架,但目前官方的版本,在移动端上是不能解析xlsx。

    然后是POI,是如今比较主流的处理office文档的框架,可以导入也可以生成,缺点是:官方的依赖包的体积较大,官方最新版本在android项目所需sdk需要minSDK 24及以上。

    最后找到的一个比较轻便简单的方案是,通过一个国外的开发者对POI包进行简化后的库android5xlsx,保留了在Android5以上解析xls和xlsx的功能(开发者本人吐槽在android5以下解析Excel真有点绕)

    android5xlsx的github地址

    下面是我的项目中简单使用这个库的一些步骤(非源码分析讲解,请谅解):(Android 10 环境实测有效)

    使用步骤

    一、解除 65 K 方法的限制

    android {
        compileSdkVersion 29
        buildToolsVersion "29.0.2"
        defaultConfig {
    		.....
            versionName "1.0"
            multiDexEnabled true  //true 开启多dex,解除65k限制
            testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner"
        }
    
    }
    

    二、将android5xlsx的核心的两个jar包导入项目lib文件夹

    将简单解析Excel文件内容的操作,封装在一个工具类ExcelUtils内:

    Excel解析工具类代码

    import android.util.Log;
    import com.blankj.utilcode.util.LogUtils;
    import org.apache.poi.hssf.usermodel.HSSFDateUtil;
    import org.apache.poi.ss.usermodel.Cell;
    import org.apache.poi.ss.usermodel.CellValue;
    import org.apache.poi.ss.usermodel.FormulaEvaluator;
    import org.apache.poi.ss.usermodel.Row;
    import org.apache.poi.xssf.usermodel.XSSFSheet;
    import org.apache.poi.xssf.usermodel.XSSFWorkbook;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.InputStream;
    import java.text.SimpleDateFormat;
    
    /**
     * @description: Excel 工具类
     * @author: ODM
     * @date: 2020/4/11
     */
    public class ExcelUtils {
    
        /**
         * 读取Excel文件
         * @param file
         * @throws FileNotFoundException
         */
        public static void readExcel(File file) throws FileNotFoundException {
            if(file == null) {
                Log.e("NullFile","读取Excel出错,文件为空文件");
                return;
            }
            InputStream stream = new FileInputStream(file);
            try {
                XSSFWorkbook workbook = new XSSFWorkbook(stream);
                XSSFSheet sheet = workbook.getSheetAt(0);
                int rowsCount = sheet.getPhysicalNumberOfRows();
                FormulaEvaluator formulaEvaluator = workbook.getCreationHelper().createFormulaEvaluator();
                for (int r = 0; r<rowsCount; r++) {
                    Row row = sheet.getRow(r);
                    int cellsCount = row.getPhysicalNumberOfCells();
                    //每次读取一行的内容
                    for (int c = 0; c<cellsCount; c++) {
                        //将每一格子的内容转换为字符串形式
                        String value = getCellAsString(row, c, formulaEvaluator);
                        String cellInfo = "r:"+r+"; c:"+c+"; v:"+value;
                        LogUtils.d(cellInfo);
                    }
                }
            } catch (Exception e) {
                /* proper exception handling to be here */
                LogUtils.e(e.toString());
            }
    
        }
    
        /**
         * 读取excel文件中每一行的内容
         * @param row
         * @param c
         * @param formulaEvaluator
         * @return
         */
        private static String getCellAsString(Row row, int c, FormulaEvaluator formulaEvaluator) {
            String value = "";
            try {
                Cell cell = row.getCell(c);
                CellValue cellValue = formulaEvaluator.evaluate(cell);
                switch (cellValue.getCellType()) {
                    case Cell.CELL_TYPE_BOOLEAN:
                        value = ""+cellValue.getBooleanValue();
                        break;
                    case Cell.CELL_TYPE_NUMERIC:
                        double numericValue = cellValue.getNumberValue();
                        if(HSSFDateUtil.isCellDateFormatted(cell)) {
                            double date = cellValue.getNumberValue();
                            SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yy");
                            value = formatter.format(HSSFDateUtil.getJavaDate(date));
                        } else {
                            value = ""+numericValue;
                        }
                        break;
                    case Cell.CELL_TYPE_STRING:
                        value = ""+cellValue.getStringValue();
                        break;
                    default:
                        break;
                }
            } catch (NullPointerException e) {
                /* proper error handling should be here */
                LogUtils.e(e.toString());
            }
            return value;
        }
    
        /**
         * 根据类型后缀名简单判断是否Excel文件
         * @param file 文件
         * @return 是否Excel文件
         */
        public static boolean checkIfExcelFile(File file){
            if(file == null) {
                return false;
            }
            String name = file.getName();
            //”.“ 需要转义字符
            String[] list = name.split("\\.");
            //划分后的小于2个元素说明不可获取类型名
            if(list.length < 2) {
                return false;
            }
            String  typeName = list[list.length - 1];
            //满足xls或者xlsx才可以
            return "xls".equals(typeName) || "xlsx".equals(typeName);
        }
    }
    
    

    三、简单解析一个Excel文件 演示

    在页面打开文件管理器,选取手机本地的excel文件,然后利用ExcelUtils打印出excel文件的内容:

    顺带一提,读取Excel也是需要对应读写文件的权限的哦~

    class MemberFragment : BaseMVVMFragment() {
    
        // 打开系统自带的文件选择器
        private fun openFileSelector() {
            val intent = Intent(Intent.ACTION_GET_CONTENT)
            intent.addCategory(Intent.CATEGORY_OPENABLE)
            intent.type = "*/*"
    //        intent.type = "application/vnd.ms-excel application/x-excel" 未知无效原因
            this.startActivityForResult(intent, 1)
        }
    
        override fun onActivityResult(
            requestCode: Int,
            resultCode: Int,  data: Intent?
        ) {
            super.onActivityResult(requestCode, resultCode, data)
            if (data == null) {
                // 用户未选择任何文件,直接返回
                return
            }
            val uri: Uri? = data.data // 获取用户选择文件的URI
            uri?.let {
                val file = UriUtils.uri2File(it)
                if(ExcelUtils.checkIfExcelFile(file)){
                    ExcelUtils.readExcel(file) //读取Excel file 内容
                }
            }
        }
    
    }
    

    在本地文件管理器中,任意选择一个excel文件,这里是选择了读取 test2.xlsx 文件,以下是excel文件内的内容

    解析结果:以log打印结果展示

    可以看到可以按照从左到右读取每一行内容,一直向下读取。

    有需要的同学可以根据需求,改造一下解析工具类,可以将解析结果转为所需要的实体类对象,也可以写入Excel,更更更具体多样的操作请参考开发者给出的demo吧。

    总结

    我认为这是在Android端解析Excel 的xls xlsx内容的方案中,使用起来比较简单且轻便挺不错的方案。

    我的文章中的代码比较简陋,仅为各位同学提供一个实现这个功能的思路~

    十分谢谢阅读的同学,欢迎交流和讨论~

    展开全文
  • 使用POI技术将excel文档导入mysql,将excel中的输入导入到数据库中
  • 上传本地文件到服务器进行解析,通过poi继续操作数据,易懂简单。
  • importExcel ref="import_excel" :import-methods="handleYcExcelImport" :max="100" :fields="fields" 注: fields : 解析数组的key import-methods:点击上传按钮时执行的函数 max:最大上传数量
  • 百万Excel解析工具类2

    2021-03-11 15:24:46
    百万Excel解析工具类2
  • poi excel解析

    2018-04-07 21:11:40
    poi Excel 下载支持2003及2007格式的下载 。。。。。。。。。。。。。。。。。。。。。。。。。。。。
  • } /** * 获取excel解析器 * * @param styles Table of styles * @param strings Table of shared strings * @return * @throws SAXException SAX异常,用户需自行处理 */ private XMLReader getSheetParser(Styles...

    不啰嗦,还是直接上菜

    1. pom依赖
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi</artifactId>
        <version>3.16</version>
    </dependency>
    <dependency>
        <groupId>org.apache.poi</groupId>
        <artifactId>poi-ooxml</artifactId>
        <version>3.14</version>
    </dependency>
    
    1. 工具类
    import org.apache.poi.openxml4j.exceptions.InvalidFormatException;
    import org.apache.poi.openxml4j.opc.OPCPackage;
    import org.apache.poi.xssf.eventusermodel.ReadOnlySharedStringsTable;
    import org.apache.poi.xssf.eventusermodel.XSSFReader;
    import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler;
    import org.apache.poi.xssf.eventusermodel.XSSFSheetXMLHandler.SheetContentsHandler;
    import org.apache.poi.xssf.model.StylesTable;
    import org.apache.poi.xssf.usermodel.XSSFComment;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.xml.sax.InputSource;
    import org.xml.sax.SAXException;
    import org.xml.sax.XMLReader;
    import org.xml.sax.helpers.XMLReaderFactory;
    
    import java.io.FileInputStream;
    import java.io.IOException;
    import java.io.InputStream;
    import java.util.ArrayList;
    import java.util.List;
    
    /**
     * 解析大数据量Excel工具类
     * <p>1. 此工具类不支持并发
     * <p>2. 此工具类当前仅支持单次解析特定sheet
     *
     * @author zhangrihui
     * @date 2020/6/30 0:20:00
     */
    public class ExcelUtils {
        private static final Logger logger = LoggerFactory.getLogger(ExcelUtils.class);
    
        /**
         * sheet操作行记录
         */
        private int rowCount = 0;
    
        private RowHandler rowHandler;
    
        private boolean skipHeaderRow;
    
        private SheetContentsHandler sheetContentsHandler;
    
        private OPCPackage pkg;
    
        public ExcelUtils(RowHandler rowHandler) {
            this(rowHandler,true);
        }
    
        public ExcelUtils(RowHandler rowHandler, boolean skipHeaderRow) {
            this(rowHandler,skipHeaderRow,null);
        }
    
        /**
         * 用户必须自定义rowHandler,同时可以指定跳过首行。也可以自定义sheet处理器。
         */
        public ExcelUtils(RowHandler rowHandler, boolean skipHeaderRow, SheetContentsHandler sheetContentsHandler) {
            if(rowHandler == null){
                throw new RuntimeException("rowHandler can not be null");
            }
            if(sheetContentsHandler == null){
                sheetContentsHandler = new DefaultSheetHandler();
            }
            this.rowHandler = rowHandler;
            this.skipHeaderRow = skipHeaderRow;
            this.sheetContentsHandler = sheetContentsHandler;
        }
    
        /**
         * 使用本工具类的用户必须自己实现行处理器处理逻辑
         *
         * @author zhangrihui
         * @date 2020/6/30 07:45:58
         */
        @FunctionalInterface
        public interface RowHandler{
    
            void handle(List<String> cells);
    
        }
    
        /**
         * excel载入方法。excel操作之前,需要先调用该方法进行载入。
         *
         * @param is excel inputstream
         * @return
         * @throws IOException
         * @throws InvalidFormatException
         */
        public ExcelUtils load(InputStream is) throws IOException, InvalidFormatException {
            setPkg(OPCPackage.open(is));
            return this;
        }
    
        /**
         * 读取sheet,默认为转换第1个sheet
         */
        public ExcelUtils parse() {
            return parse(1);
        }
    
        /**
         * 读取sheet
         *
         * @param sheetId 要处理的sheet索引,从1开始
         * @return
         */
        public ExcelUtils parse(int sheetId) {
            if(pkg == null){
                throw new RuntimeException("Before parse ,load is expected");
            }
            //当需要一次性处理多个sheet时,重置sheet行统计器
            rowCount = 0;
            try {
                XSSFReader reader = new XSSFReader(pkg);
                InputStream shellStream = reader.getSheet("rId" + sheetId);
                InputSource sheetSource = new InputSource(shellStream);
                StylesTable styles = reader.getStylesTable();
                ReadOnlySharedStringsTable strings = new ReadOnlySharedStringsTable(pkg);
                XMLReader parser = getSheetParser(styles, strings);
                parser.parse(sheetSource);
            } catch (Exception e){
                logger.error("excel parse error",e);
            } finally {
                try {
                    pkg.close();
                } catch (IOException e) {
                    logger.error("pkg close error",e);
                }
            }
            return this;
        }
    
        /**
         * 获取excel解析器
         *
         * @param styles Table of styles
         * @param strings Table of shared strings
         * @return
         * @throws SAXException SAX异常,用户需自行处理
         */
        private XMLReader getSheetParser(StylesTable styles, ReadOnlySharedStringsTable strings) throws SAXException {
            XMLReader parser = XMLReaderFactory.createXMLReader();
            parser.setContentHandler(new XSSFSheetXMLHandler(styles, strings, sheetContentsHandler, false));
            return parser;
        }
    
        public void setPkg(OPCPackage pkg) {
            this.pkg = pkg;
        }
    
        /**
         * 默认sheet内容处理器
         *
         * @author zhangrihui
         * @date 2020/6/30 07:42:26
         */
        private class DefaultSheetHandler implements SheetContentsHandler {
    
            private List<String> rowData = new ArrayList<>();
    
            @Override
            public void startRow(int rowNum) {
                rowCount++;
                rowData.clear();
            }
    
            @Override
            public void endRow(int rowNum) {
                if(skipHeaderRow && rowCount <=1){
                    return;
                }
                rowHandler.handle(rowData);
            }
    
            @Override
            public void cell(String cellReference, String formattedValue, XSSFComment comment) {
                rowData.add(formattedValue);
            }
    
            @Override
            public void headerFooter(String text, boolean isHeader, String tagName) {
            }
    
        }
    
        public static void main(String[] args) {
            try {
                ExcelUtils excelUtils = new ExcelUtils(cells -> {
                    System.out.println("cells:"+cells); //直接输出每一行的内容
                });
                excelUtils.load(new FileInputStream("D:\\***.xlsx")).parse();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
    
    1. 使用说明
      参照main方法,通过自定义RowHandler完成数据行处理逻辑,实现比如统计表格中某一行的最大值、平均值等。该工具类提供的功能类似于mysql的全表扫描,而不是把所有内容都加载进内存中进行操作,因此能适用于大数据量的Excel处理。(还没有拿非常大、超内存的Excel测试过。实际使用中如有问题,还请评论指正~)
    展开全文
  • 实现Excel的上传和下载 存在两种格式的上传和下载,分别对应POI和JXL 可以实现根据Excel模板导出,自定义Excel样式导入 形成自定义的Excel报表等功能。项目为Maven项目,JDK采用1.8
  • java解析excel

    2016-08-19 17:59:56
    java解析excel
  • Excel解析到数据库

    千次阅读 2019-07-26 16:14:44
    def excel_insert_data(): for files in os.listdir(path): print(files) # if os.path.splitext(files)[1] == '.xls' or os.path.splitext(files)[1] == '.xlsx': try: bo...
  • Java解析大数据量Excel,支持解析百万行excel数据,十万数据基本上十来秒就解析完毕,亲测过最大excel1048576行数据用时219秒,硬件好点的PC估计跑起来更快。
  • Java、Js分别excel解析

    2018-01-20 23:09:46
    Java、Js分别实现excel解析,Java、Js分别实现excel解析

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 73,827
精华内容 29,530
关键字:

excel解析

友情链接: 改进RLS校正算法.zip