java 分析excel模板_java如何读取Excel简单模板

场景:对于经常需要导入excel模板或数据来解析后加以应用的,使用频率非常之高,做了一个比较稳定的版本,体现在这些地方

工具:org.apache.poi

使用前必须了解这些:

1、要解析,那肯定先判断是不是excel

2、xls后缀的excel,是03版及以前的用hssfworkbook类

xlsx后缀的excel,是07版及以后的用xssfworkbook解析

3、getworkbook这个方法是我自己乱造各种excel数据不断测试搜索修正得出的结果,其他的像简单的判断后缀xls还是xlsx来决定用hssh还是xssf是不保险的,比如你可能没遇过org.apache.poi.openxml4j.exceptions.invalidformatexception这样的异常,当然这个异常仍然是因为excel类型导致获取workbook时出错,然而我查到的结果是,excel最底层是xml实现的,类型问题出在这儿,看异常的描述也可以稍微看出来openxml4j.exceptions

4 、可能出现空行,空的单元格,或者单元格值为空的情况,这些情况,在我的readexcel()方法里都考虑到了,为什么我不用迭代器,或者加强的for each循环?就是因为这些坑爹的空单元格或者空行啊,迭代器内部在取cell单元格对象时跳过这些空的对象,who knows why?我也不知道,反正我测试过,跳过去了,本来5个单元格,一个空的,结果就只得到4个数据,即使用cell.isempty()和cell!=null来判断,也没卵用,因为遍历的时候直接跳过去了,都没有判断的机会

5、取单元格数据,这个就比较简单了,判断单元格类型,根据类型做相应的处理取出来,但是我觉得我这个getcellvalue()的方法应该有漏洞,先这么用着

下面上代码,简单描述下关键部位

import java.io.file;

import java.io.fileinputstream;

import java.io.filenotfoundexception;

import java.io.ioexception;

import java.io.inputstream;

import java.io.pushbackinputstream;

import java.util.arraylist;

import java.util.hashmap;

import java.util.map;

import java.util.list;

import org.apache.poi.poixmldocument;

import org.apache.poi.openxml4j.exceptions.invalidformatexception;

import org.apache.poi.openxml4j.opc.opcpackage;

import org.apache.poi.poifs.filesystem.poifsfilesystem;

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;

import org.apache.poi.hssf.usermodel.hssfcell;

import org.apache.poi.hssf.usermodel.hssfworkbook;

import org.apache.xmlbeans.impl.piccolo.io.fileformatexception;

/**

*yanbiao 2016.10.25

*/

public class excelutil {

private static final string extension_xls = "xls";

private static final string extension_xlsx = "xlsx";

/**

* 文件检查

*/

private void prereadcheck(string filepath) throws filenotfoundexception, fileformatexception {

file file = new file(filepath);

if (!file.exists()) {

throw new filenotfoundexception("导入的文件不存在:" + filepath);

}

if (!(filepath.endswith(extension_xls) || filepath.endswith(extension_xlsx))) {

throw new fileformatexception("传入的文件不是excel");

}

}

/**

* 取得workbook对象

* xls:hssfworkbook,03版

* xlsx:xssfworkbook,07版

*/

private workbook getworkbook(string filepath) throws ioexception, invalidformatexception {

//直接判断后缀来返回相应的workbook对象多数情况没问题,但是这个更保险,第3条已经说明

workbook wb = null;

inputstream is = new fileinputstream(filepath);

if (!is.marksupported()) {

is = new pushbackinputstream(is, 8);

}

if (poifsfilesystem.haspoifsheader(is)) {

return new hssfworkbook(is);

}

if (poixmldocument.hasooxmlheader(is)) {

return new xssfworkbook(opcpackage.open(is));

}

throw new illegalargumentexception("您的excel版本目前不支持poi解析");

}

/**

* 读取excel文件内容

*/

public map> readexcel(string filepath) throws filenotfoundexception, fileformatexception {

// 检查和获取workbook对象

this.prereadcheck(filepath);

workbook wb = null;

map> map = new hashmap>();

try {

wb = this.getworkbook(filepath);

// 默认只读取第一个sheet

sheet sheet = wb.getsheetat(0);

int rowcount = sheet.getlastrownum();//逻辑行,包括空行

int cellcount = sheet.getrow(0).getlastcellnum();//第一行(将来作为字段的行)有多少个单元格

for (int i=0;i

list list = new arraylist();

row row = sheet.getrow(i);

if(null!=row){

for (int j=0;j

list.add(getcellvalue(row.getcell(j))); //这里也是用for循环,用cell c:row这样的遍历,空单元格就被抛弃了

}

system.out.println("第"+(row.getrownum()+1)+"行数据:"+list.tostring());

map.put(row.getrownum(), list);

}else{

for (int j=0;j

list.add("无数据");

}

system.out.println("第"+(i+1)+"行数据:"+list.tostring());

map.put(i, list);

}

}

} catch (exception e) {

system.out.println("读取excel异常:"+e.getmessage());

e.printstacktrace();

} finally {

if (wb != null) {

try {

wb.close();

} catch (ioexception e) {

e.printstacktrace();

}

}

}

return map;

}

/**

* 取单元格的值

*/

private string getcellvalue(cell c) {

if (c == null) {

return "无数据";

}

string value = "";

switch (c.getcelltype()){

case hssfcell.cell_type_numeric://数字

value = c.getnumericcellvalue()+"";

break;

case hssfcell.cell_type_string://字符串

value = c.getstringcellvalue();

break;

case hssfcell.cell_type_boolean://boolean

value = c.getbooleancellvalue()+"";

break;

case hssfcell.cell_type_formula://公式

value = c.getcellformula()+"";

break;

case hssfcell.cell_type_blank://空值

value= "无数据";

break;

case hssfcell.cell_type_error:

value = "非法字符";

break;

default:

value= "未知类型";

break;

}

return value;

}

}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持萬仟网。

希望与广大网友互动??

点此进行留言吧!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/420113.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

前端学习(1399):多人管理19项目拦截器

const guard (req, res, next) > {// 判断用户访问的是否是登录页面// 判断用户的登录状态// 如果用户是登录的 将请求放行// 如果用户不是登录的 将请求重定向到登录页面if (req.url ! /login && !req.session.username) {res.redirect(/admin/login);} else {// …

4种kill某个用户所有进程的方法

4种kill某个用户所有进程的方法 在linux系统管理中,我们有时候需要kill掉某个用户的所有进程,初学者一般先查询出用户的所有pid,然后一条条kill掉,或者写好一个脚本,实际上方法都有现成的,这边有4种方法&am…

java数组排序源码_Java 数组工具类排序,最大值最小值等

public class ArrayUtils{/*** 返回数组最大值** param a* return*/public static int max(int[] a){// 返回数组最大值int x;int aa[]new int[a.length];System.arraycopy(a,0,aa,0,a.length);xaa[0];for(int i1;iif(aa[i]>x){xaa[i];}}return x;}/*** 返回数组最小值** pa…

前端学习(1400):多人管理20代码优化

// 引用expess框架 const express require(express); // 处理路径 const path require(path); // 引入body-parser模块 用来处理post请求参数 const bodyPaser require(body-parser); // 导入express-session模块 const session require(express-session); // 创建网站服务…

C#判断点和直线的位置关系

/// <summary>/// 判断点和直线的位置关系/// </summary>/// <param name"LinePntA">直线上的一点</param>/// <param name"LinePntB">直线上的另一点</param>/// <param name"PntM">需要判断的点<…

前端学习(1401):多人管理21新增用户

const { User } require(../../model/user);module.exports async (req, res) > {// 获取到地址栏中的id参数const { message, id } req.query;// 如果当前传递了id参数if (id) {// 修改操作let user await User.findOne({_id: id});// 渲染用户编辑页面(修改)res.rende…

C# 添加类库依赖

转载于:https://www.cnblogs.com/dekevin/p/4350049.html

前端学习(1402):多人管理22验证joi

// 引入joi模块 const Joi require(joi);// 定义对象的验证规则 const schema {username: Joi.string().min(2).max(5).required().error(new Error(username属性没有通过验证)),birth: Joi.number().min(1900).max(2020).error(new Error(birth没有通过验证)) };async funct…

win2003+IIS6+PHP5.3.8+MSSQL2008的安装配置

转载于:https://www.cnblogs.com/nxping/p/4351033.html

Linux给Java程序设置端口_扫描服务端口的Java程序

在Linux下用C写了一个扫描指定IP地址对外开放端口号的程序。扫描自己的机器的端口号速度还是挺快的&#xff0c;用编写的程序扫描在美国的服务器时&#xff0c;等了10分钟&#xff0c;端口号才扫到1000左右。于是就想到了用多线程&#xff0c;可是linux c的多线程不会&#xff…

第二次北京之行-游颐和园

转载于:https://www.cnblogs.com/motadou/p/4354613.html

前端学习(1404):多人管理24joi验证

// 引入用户集合的构造函数 const { User, validateUser } require(../../model/user); // 引入加密模块 const bcrypt require(bcryptjs);module.exports async(req, res, next) > {try {await validateUser(req.body)} catch (e) {// 验证没有通过// e.message// 重定向…

前端学习(1405):多人管理25node.js—安装bcrypt出现错误的解决办法

cryptjs是一个第三方密码加密库&#xff0c;是对原有bcrypt的优化&#xff0c;优点是不需要安装任何依赖 安装 引入bcryptjs库var bcrypt require(bcryptjs); 异步用法(Async) //生成hash密码 var bcrypt require(bcryptjs); bcrypt.genSalt(10, function(err, salt) {bcry…

java中级做dao模型_DAO-持久层-领域对象-贫血模型

原文关于"贫血模型"的讨论几乎没有停止过,在openfans.org的开发过程中,我们也讨论了很久,我觉的有很多东西应该记下来:明确一下意思先:DAO:数据操作对象,会操作数据库持久层:能提供对象持久化服务的一系列组件或服务领域对象:描述领域模型的对象,是通过业务分析进行系…

JSP分页技术的实现(利用当前页进行前后加减,并利用href进行当前页面传值,传值当然是那个当前值变量)...

一、可滚动结果集 Connection con DriverManager.getConnection(); PreparedStatement stmt con.prepareStatement(sql,ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY); ResultSet rs stmt.executeQuery(); 常用方法&#xff1a; (1)rs.absolute(n); 可以…

前端学习(1406):多人管理26邮箱地址是否存在

// 引入用户集合的构造函数 const { User, validateUser } require(../../model/user); // 引入加密模块 const bcrypt require(bcryptjs);module.exports async(req, res, next) > {try {await validateUser(req.body)} catch (e) {// 验证没有通过// e.message// 重定向…

我的世界JAVA刷怪范围_《我的世界》只有刷怪蛋能够刷新生物吗?并不是,还有一种物品!...

《我的世界》MC能够刷新生物的只有刷怪蛋吗&#xff1f;不&#xff0c;还有一种物品&#xff01;《我的世界》只有刷怪蛋能够刷新生物吗&#xff1f;并不是&#xff0c;还有一种物品&#xff01;在沙盒游戏《我的世界》里面&#xff0c;绝大部分的生物会自然生成于主世界、下界…

Android上传文件至服务器(转)

本实例实现每隔5秒上传一次&#xff0c;通过服务器端获取手机上传过来的文件信息并做相应处理&#xff1b;采用AndroidStruts2技术。 一、Android端实现文件上传 1)、新建一个Android项目命名为androidUpload&#xff0c;目录结构如下&#xff1a; 2)、新建FormFile类&#xff…

前端学习(1407):多人管理27代码优化

// 创建用户集合 // 引入mongoose第三方模块 const mongoose require(mongoose); // 导入bcrypt const bcrypt require(bcryptjs); // 引入joi模块 const Joi require(joi); // 创建用户集合规则 const userSchema new mongoose.Schema({username: {type: String,required:…