解析Excel文件 Apache POI框架使用_weixin_34187822的博客-程序员宅基地

技术标签: java  

本文整理了,使用Apache POI 框架解析、读取Excel文件,过程中,程序代码出现的一些问题,并解决

1、.xls 和 .xlsx

我们知道Excel文档,在Windows下,分为Excel2003 和 Excel2007.两者有一些区别,最直观的,就是后缀名不一样,分别是 .xls 和 .xlsx

使用Apache POI 解析时,需要区别对待。用不同的API去解析。

但是,却也提供了一个,统一去解析的API,那就是 org.apache.poi.ss.usermodel.WorkbookFactory;

开发,运行的时候,需要导入这样的几个 .jar 包

不然,就会出问题:

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

这个错误是由于POI包是默认不支持excel2007操作的,要加入一个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();
    }
}

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

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

3、一个可以遍历,解析文件夹下,全部Excel文件内容的代码

解析的内容,保存到了一个 .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;
    }

}

 

 扫个红包吧!

 

Donate捐赠

如果我的文章帮助了你,可以赞赏我 6.66 元给我支持,让我继续写出更好的内容)

   

  (微信)                                        (支付宝)

微信/支付宝 扫一扫

转载于:https://www.cnblogs.com/moonsoft/p/9370921.html

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/weixin_34187822/article/details/94182904

智能推荐

CSV文件(可以转换为Excel)的读写_c++中csv转换xls_anwengel的博客-程序员宅基地

有时候会碰到用C++读写Excel文件的情况,我们可以通过读写CSV文件,然后将CSV文件转换成Excel文件进行。经常需要一些配置信息,在启动的时候程序将这类信息读入内存中使用,CSV是个不错的选择,这里提供一个CSV的读写类,默认将第一行当做字段名,通过字段名去读写内容先看代码CSVFile.h[cpp] view plaincopy

基于预测和自适应分类置乱的加密图像可逆数据隐藏_最大嵌入容量bpp_凌峰的博客的博客-程序员宅基地

基于预测和自适应分类置乱的加密图像可逆数据隐藏 前言一、算法框架及预测误差的高位冗余二、算法1.腾出空间(图像加密)1.1 预测误差1.2 自适应分类1.3 分类加密+腾出空间2 信息嵌入/提取+图像恢复3 算法性能总结参考文献提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录前言一、算法框架及预测误差的高位冗余二、算法1.腾出空间(图像加密)1.1 预测误差1.2 自适应分类1.3 分类加密+腾出空间2 信息嵌入/提取+图像恢复3 算法性能总结参考文献前言介绍论

二叉搜索树的后序遍历序列_perfects110的博客-程序员宅基地

class Solution {public: bool Judge(vector<int> sequence){ if(sequence.size() <= 1) return true; bool first = false; vector<int>::iterator tmp_i...

H5实现手写功能_weixin_30482181的博客-程序员宅基地

html<!DOCTYPE html><html lang="en"> <head> <meta charset="utf-8"> <style> body,html{ margin: 0; paddin...

Linux环境下获取网卡连接状态_ctthuangcheng的博客-程序员宅基地

在嵌入式项目中,有时需要获取设备本身的一些运行信息,网口的连接状态就是其中之一,这还真不太好弄,网上查了一下资料,整理了一下,pIfName为网口名称,比如eth0,返回1为连接,0为断开。int getNetLinkStates(const char *pIfName){ int skfd; struct ifreq ifr; struct ethtool_value e

Concurrent包总结——线程安全的集合操作_diexi5893的博客-程序员宅基地

java中提供了丰富的集合类操作,大概可以分为无序结合Set,有序集合List和无序键值对集合Map。Java5之后又新增了队列操作集合Queue。Java1.5之后新增了线程安全的集合操作类,阻止在java.util.concurrent包中。本文仅仅探讨该包下面的线程安全的结合操作类。 先看下concurrent包下面线程安全类的类图结构: 1.CopyOn...

随便推点

【HTML】css3实现旋转的立方体相册_少莫千华的博客-程序员宅基地

立体相册源码使用时请保存为*.html格式<!DOCTYPE HTML><html lang="en"><head> <meta charset="UTF-8"> <title>少莫千华立体相册</title> <style> *{ margin: 0; padding: 0;...

linux下安装和配置SNMP_linux snmp配置文件_慧星猿的博客-程序员宅基地

一、安装SNMP1.1、下载Net-SNMP的源代码  选择一个SNMP版本,比如5.7.1,下载地址如下:http://sourceforge.net/projects/net-snmp/files/net-snmp/5.7.1/1.2、把压缩包传输到远程的Linux服务器  把压缩包使用FTP传输工具传输到远程的Linux服务器   上传成功后在linux相关目录下就可以看到压缩包了1.3、对...

Date()对象的设置与解析_qq_36320160的博客-程序员宅基地

怎么获取当前时间? 怎么给Date对象设置特定时间? 将Date对象解析为毫秒数? 将Date对象解析为日月年?获取小时/分钟/秒?   直接new Date()新建对象,可以获取当前时间的Dat...

Mixer-First Receiver适用于宽带阵列应用的接收机技术1_艾科诺&ICONO的博客-程序员宅基地

Mixer-First Receiver适用于宽带阵列应用的接收机技术1技术的背景单元级数字化阵列传统链路到Mixer-First链路的逻辑考虑三种场景小结技术的背景在文章《吊打全球的顶级毫米波数字阵列项目-MIDAS》中提到了DARPA在MIDAS项目中在毫米波实现宽带单元级数字化阵列用到了一个关键的叫做N-Path filter的技术,而这个技术同样出现在了《让微波射频工程师颤抖的芯片-MATRICs》的MATRICs芯片中。为什么DARPA的各个合作研究机构选择这种技术?这篇来自Universi

纠正自己的误解,关于liferay5.2.1和liferay5.2.2_cyw8998的博客-程序员宅基地

前几天,在应用liferay5.2.1的时候,发现portlet没有关闭按钮。在网上查询后,发现有人说:在ie上没有显示关闭按钮,在火狐上可以显示,是5.2.1的bug。当时解决了登陆不进去的bug,我便以为没有关闭按钮也是bug。今天研究5.2.2的时候,发现有关闭按钮,前提是把portlet的border去掉,这样便能显示出来close了。5.1.1以后的“乒乓开关按钮”我还是比较喜欢的,

推荐文章

热门文章

相关标签