【home88一必发】java利用poi读取excel很是难题,POI框架使用

by admin on 2019年2月28日

   
近年来三个web工程必要形成一个小成效,利用文件上传然后读取文件内容写入到数据库,那里是操作的excel文件,excel文件分两种后缀,03版本的xls和以往的xlsx,今后大家一般都拿那多少个好用的插件直接过来用就能够了,笔者那里用的是java
poi相关能源包。

   
近来一个web工程需求做到叁个小功用,利用文件上传然后读取文件内容写入到数据库,那里是操作的excel文件,excel文件分三种后缀,03本子的xls和后来的xlsx,以往我们一般都拿那三个好用的插件间接回复用就足以了,作者那边用的是java
poi相关能源包。

java利用poi读取excel非凡难点,javapoi读取excel

   
近日多个web工程必要做到叁个小效用,利用文件上传然后读取文件内容写入到数据库,那里是操作的excel文件,excel文件分二种后缀,03版本的xls和后来的xlsx,今后我们一般都拿那多少个好用的插件直接回复用就能够了,笔者那边用的是java
poi相关能源包。

   1,首先要力所能及读取带xlsx的excel文件,必要求导入如下的jar包

 home88一必发 1

 
然后遭逢的题材是在地头工程下建立的一个测试类测试没有丰富,二种excel的文本都能读取,不过一旦宣布到web工程下,作者的工程是在tomcat下跑的。那里就涌出了难题,总是报那几个分外:

Exception in thread “main”
org.apache.poi.poifs.filesystem.OfficeXmlFileException: The supplied
data appears to be in the Office 2007+ XML. You are calling the part of
POI that deals with OLE2 Office Documents. You need to call a different
part of POI to process this data (eg XSSF instead of HSSF)

 
然后趁着非凡仔细的往上看,最终发现说有1个xbean.jar是或不是是正确的版本,这些时候作者就掌握或许是jar包龃龉了,不过此时对web工程的结构有点不是很显然了,为啥在测试类下并未难点,但怎么在web下跑的时候会生出那个那多少个呢,究其原因,那里要弄通晓,在web下跑的时候,在webRoot下上边包车型的士WEB-INF下边包车型客车lib放的jar才是工程跑的时候用用到的jar,所以此时笔者去找,果然发现有二个xbean.jar跟java
poi的xmlbeans-2.3.0.jar争辨了,果断删掉低版本的xbean.jar,难题解决。

【home88一必发】java利用poi读取excel很是难题,POI框架使用。为此从遇到那些标题上来看,首先要学会从10分中找原因,其次知道原因了现在什么去解决。相当往往能够暴表露能够缓解难点的关键所在。希望能帮到蒙受此类似题材的爱人。

 

近年来贰个web工程必要形成3个小效用,利用文件上传然后读取文件内容写入到数据库,那里是操…

本文整理了,使用Apache POI
框架解析、读取Excel文件,进度中,程序代码现身的一对难题,并缓解

   1,首先要力所能及读取带xlsx的excel文件,必须求导入如下的jar包

   1,首先要力所能及读取带xlsx的excel文件,供给求导入如下的jar包

【home88一必发】java利用poi读取excel很是难题,POI框架使用。1、.xls 和 .xlsx

 home88一必发 2

 home88一必发 3

咱俩知道Excel文档,在Windows下,分为Excel二零零一 和
Excel二〇〇六.两者有一对区分,最直观的,正是后缀名区别等,分别是 .xls 和
.xlsx

home88一必发, 
然后遇到的标题是在当地工程下成立的三个测试类测试没有越发,二种excel的文书都能读取,可是假若发表到web工程下,小编的工程是在tomcat下跑的。那里就应运而生了问题,总是报这一个卓殊:

 
然后境遇的题材是在地头工程下建立的贰个测试类测试没有至极,三种excel的文件都能读取,可是一旦宣布到web工程下,笔者的工程是在tomcat下跑的。那里就涌出了难点,总是报那些特别:

动用Apache POI 解析时,供给区分对待。用分化的API去分析。

Exception in thread “main” org.apache.poi.poifs.filesystem.OfficeXmlFileException:
The supplied data appears to be in the Office 2007+ XML. You are calling
the part of POI that deals with OLE2 Office Documents. You need to call
a different part of POI to process this data (eg XSSF instead of HSSF)

Exception in thread “main” org.apache.poi.poifs.filesystem.OfficeXmlFileException:
The supplied data appears to be in the Office 2007+ XML. You are calling
the part of POI that deals with OLE2 Office Documents. You need to call
a different part of POI to process this data (eg XSSF instead of HSSF)

唯独,却也提供了三个,统一去分析的API,那正是org.apache.poi.ss.usermodel.WorkbookFactory;

 
然后趁着很是仔细的往上看,最后发现说有1个xbean.jar是或不是是正确的版本,这一个时候本人就明白或许是jar包争辨了,可是此时对web工程的布局有点不是很显明了,为啥在测试类下并未难题,但为何在web下跑的时候会时有产生这个可怜呢,究其原因,那里要弄精晓,在web下跑的时候,在webRoot下下边包车型大巴WEB-INF下边包车型大巴lib放的jar才是工程跑的时候用用到的jar,所以这时小编去找,果然发现有一个xbean.jar跟java
poi的xmlbeans-2.3.0.jar争论了,果断删掉低版本的xbean.jar,难点消除。

 
然后随着至极仔细的往上看,最终发现说有贰个xbean.jar是或不是是正确的版本,那个时候我就通晓或许是jar包抵触了,可是此时对web工程的构造有点不是很强烈了,为何在测试类下没很是,但为何在web下跑的时候会时有发生这么些卓殊呢,究其原因,那里要弄精通,在web下跑的时候,在webRoot下下边包车型客车WEB-INF上面包车型客车lib放的jar才是工程跑的时候用用到的jar,所以那时候笔者去找,果然发现有三个xbean.jar跟java
poi的xmlbeans-2.3.0.jar冲突了,果断删掉低版本的xbean.jar,难题消除。

支出,运行的时候,供给导入那样的多少个 .jar 包

故而从碰着这一个标题上来看,首先要学会从拾贰分中找原因,其次知道原委了未来怎样去消除。万分往往能够暴表露能够消除难点的关键所在。希望能帮到碰到此类似题材的意中人。

所以从遭逢那么些标题上来看,首先要学会从那一个中找原因,其次知道原委了解后如何去消除。非常往往能够暴流露能够缓解难题的关键所在。希望能帮到遭受此类似题材的敌人。

home88一必发 4

 

 

要不,就会出标题:

Exception in thread “main” java.lang.NoClassDefFoundError:
org/apache/xmlbeans/XmlObject

那个荒唐是由于POI包是暗中同意不接济excel2006操作的,要加盟一个xmlbeans的包xbean.jar

应用POI库,在实例化XSSFWorkbook对象时,报
Java.lang.ClassNotFoundException:
org.apache.xmlbeans.XmlOptions 的错误,经济检察查,是因为官方包里暗许是不包括xmlbean.jar包的,必要协调添加xmlbeans.jar这一个包

public void parseXml(String filename) {
    Workbook wb = null;
    try {
        wb = WorkbookFactory.create(new File(filename));
        Sheet sheet = wb.getSheetAt(0);

        for (Row row : sheet) {

            for (Cell cell : row) {
                System.out.print(getCellValue(cell) + "---");
                save(getCellValue(cell) + "---");
            }
            System.out.println();
        }
    } catch (EncryptedDocumentException e) {
        e.printStackTrace();
    } catch (InvalidFormatException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    } catch (org.apache.poi.openxml4j.exceptions.InvalidFormatException e) {
        e.printStackTrace();
    }
}

② 、解析文件时出现:lang.RuntimeException: Unexpected record
type (org.apache.poi.hssf.record.DefaultRowHeightRecord)

缓解:excel打开另存一下就可以了

叁 、3个足以遍历,解析文件夹下,全体Excel文件内容的代码

浅析的内容,保存到了3个 .txt 文件中

已调节和测试通过,如下:

public class ParseExcel {

    public static void main(String[] args) throws IOException {

        String path = "C:\\Users\\文件夹目录路径\\Desktop\\a01hos\\img";
        File f = new File(path);
        File[] files = f.listFiles();
        System.out.println(files.length);

        File[] filesxls = f.listFiles(new FilenameFilter() {

            public boolean accept(File dir, String name) {
                if (name.endsWith(".xls") || name.endsWith(".xlsx")) {
                    return true;
                }
                return false;
            }
        });
        System.out.println("Excel文件有: " + filesxls.length);

        for (File f2 : filesxls) {
            String fileDirectPathName = f2.getCanonicalPath();
            System.out.println(fileDirectPathName);
            // System.out.println("文件名: " + f2.getName());

            new ParseExcel().parseXml(fileDirectPathName);
        }
  }
public void parseXml(String filename) {
        Workbook wb = null;
        try {
            wb = WorkbookFactory.create(new File(filename));
            Sheet sheet = wb.getSheetAt(0);

            for (Row row : sheet) {

                for (Cell cell : row) {
                    System.out.print(getCellValue(cell) + "---");
                    save(getCellValue(cell) + "---");
                }
                System.out.println();
            }
        } catch (EncryptedDocumentException e) {
            e.printStackTrace();
        } catch (InvalidFormatException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (org.apache.poi.openxml4j.exceptions.InvalidFormatException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }

    public Object getCellValue(Cell cell) {
        int type = cell.getCellType();
        String show = null;
        switch (type) {
        case Cell.CELL_TYPE_BLANK:// 空值
            show = null;
            break;
        case Cell.CELL_TYPE_BOOLEAN:// Boolean
            show = String.valueOf(cell.getBooleanCellValue());
            break;
        case Cell.CELL_TYPE_ERROR:// 故障
            show = String.valueOf(cell.getErrorCellValue());
            break;
        case Cell.CELL_TYPE_FORMULA:// 公式
            show = cell.getCellFormula();
            break;
        case Cell.CELL_TYPE_NUMERIC:// 数字
            show = String.valueOf(cell.getNumericCellValue());
            break;
        case Cell.CELL_TYPE_STRING:// 字符串
            show = cell.getStringCellValue();
            break;
        default:
            show = null;
        }
        return show;
    }

    /**
     * 保存字符串到文本中
     * 
     * @param str
     */
    public boolean save(String str) {
        boolean flag = false; // 声明操作标记

        String fileName = "file/test.txt"; // 定义文件名

        File f = new File(fileName);

        if(!f.exists()){
            try {
                f.createNewFile();
            } catch (IOException e) {
                e.printStackTrace();
            }
        }

        FileWriter fw = null; // 用来写入字符文件的便捷类
        PrintWriter out = null; // 向文本输出流打印对象的格式化表示形式类

        try {
            fw = new FileWriter(f, true); // 创建一个FileWriter
            out = new PrintWriter(fw); // 创建一个PrintWriter,以追加方式将内容插入到最后一行
            out.println(str); // 将字符串打印到文本中
            out.flush(); // 刷新缓存

            flag = true;
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } finally {
            try {
                // 关闭PrintWriter
                if (out != null) {
                    out.close();
                    out = null;
                }
                // 关闭FileWriter
                if (fw != null) {
                    fw.close();
                    fw = null;
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
        }
        return flag;
    }

}

 

 扫个红包呢!

home88一必发 5

 

Donate捐赠

万一作者的稿子支持了您,能够赞美笔者 6.66
元给本人扶助,让自家一而再写出更好的剧情)

home88一必发 6   home88一必发 7

  (微信)                                        (支付宝)

微信/支付宝 扫一扫

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图