前言:

不知道小伙伴们有没有遇见过“要识别excel里的插件对象”的需求。一般情况来说,在软件项目开发的过程中这种需求一般不常见,因为在excel里面的内容完全可以通过线上来提交,比如使用form表单等形式来进行数据录入。但是在线下处理一些材料、数据等可能会遇到这样的问题。
我的这个需求就是线下遇到的,也并不是软件项目开发中的需求(附带讲:项目中的这种功能完全没有必要存在,因为实现这种需求的方式太有针对性了,还并不能保证它的正确性。总之,这种功能完全就是出力不讨好的典型)

问题描述:

问题背景是这样的,我们要做一个数据分析模型,然后甲方需要提供分析数据,将一个个excel数据表转化为一个一条条记录的记录表好用作模型分析。最后就是提供给我们的数据表是含带插件对象的excel表,因为之前没有读取过excel的插件对象,让我以为这种插件对象完全读取不了。后经查看文章发现有一种方式是可以读取的,可以依靠这种方式实现数据读取。

注:在这里要感谢一下前辈的这篇文章“在Java中的Apache POI读取Excel的复选框值(Reading Excel checkbox values in Java Apache POI)”

下面给出实现经过和方式:

我们先来看下复选框或单选框长得什么样:

我们要做的就是要识别excel中,选择的是男或女、是或否。
目前只能通过代码实现对选择框的选中判断,返回true或false,以此来做识别判断

所需jar包:

     <!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 --><dependency><groupId>org.apache.commons</groupId><artifactId>commons-lang3</artifactId><version>3.4</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.0.1</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.0.1</version></dependency>

识别代码如下:

package com.yzw.exceldemo.excel;import org.apache.poi.hssf.eventusermodel.HSSFEventFactory;
import org.apache.poi.hssf.eventusermodel.HSSFRequest;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;/*** @author yzw*/
public class ExcelObject {private static final String Workbook = "Workbook";public static void readCheckbox(String path) {FileInputStream file = null;InputStream istream = null;try {file = new FileInputStream(new File(path));POIFSFileSystem poifs = new POIFSFileSystem(file);istream = poifs.createDocumentInputStream(Workbook);HSSFRequest req = new HSSFRequest();req.addListenerForAllRecords(new EventExample());HSSFEventFactory factory = new HSSFEventFactory();factory.processEvents(req, istream);} catch (Exception ex) {ex.printStackTrace();} finally {try {if (file != null)file.close();if (istream != null)istream.close();} catch (IOException ex) {ex.printStackTrace();}}}/*** 写个main方法来做一个测试* @param args*/public static void main(String[] args) {System.out.println("ReadExcelFile");//此处为我使用的一个线程用来存储每次复选框的识别列表(目前不需要)ObjectList.setCurrentFlag(new ArrayList());System.out.println("ReadCheckbox");readCheckbox("C:\\Users\\Administrator\\Desktop\\复选框测试.xls");}
}

然后,我们还需要写一个类来实现HSSFListener类,并重写processRecord方法,代码如下:

package com.yzw.exceldemo.excel;import org.apache.poi.hssf.eventusermodel.HSSFListener;
import org.apache.poi.hssf.record.CommonObjectDataSubRecord;
import org.apache.poi.hssf.record.ObjRecord;
import org.apache.poi.hssf.record.Record;
import org.apache.poi.hssf.record.SubRecord;import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;/*** @author yzw*/
public class EventExample implements HSSFListener {private final static Pattern P = Pattern.compile("\\[sid=0x000A.+?\\[0(\\d),");@Overridepublic void processRecord(Record record) {switch (record.getSid()) {case ObjRecord.sid:ObjRecord objRec = (ObjRecord) record;List<SubRecord> subRecords = objRec.getSubRecords();for (SubRecord subRecord : subRecords) {if (!(subRecord instanceof CommonObjectDataSubRecord)) {Matcher m = P.matcher(subRecord.toString());if (m.find()) {String checkBit = m.group(1);if (checkBit.length() == 1) {boolean checked = "1".equals(checkBit);ObjectList.getCurrentFlag().add(checked);System.out.println(ObjectList.getCurrentFlag().size()+"--------"+checked+"-----------"+checkBit);}}}}break;default:break;}}
}

然后运行上面的main方法做一个测试,打印测试结果:

然后我们变动一下单选框,如下:

再次运行main方法,打印结果:

基于此,我们可以得出对应关系如下:

1----对应----男(true)
2----对应----女(true)
3----对应----是(true)
4----对应----否(true)

注意:我们在使用这种方式时,一定要注意对应关系,尤其是复选框或单选框较多时。

接下来我来贴出ObjectList类的实现,其实还是有很多方法来实现存储当前的识别列表集合:

package com.yzw.exceldemo.excel;import java.util.List;/*** @author yzw* 使用一个线程对当前的数据进行一个存储*/
public class ObjectList {private static ThreadLocal currentUser = new ThreadLocal();public static void setCurrentFlag(List t) {currentUser.set(t);}public static List getCurrentFlag() {return (List) currentUser.get();}public static void removeCurrentFlag() {currentUser.remove();}
}

注意:在当前使用完后,一定要记得清除List的数据。
当前方式只支持xls格式的excel,如需要将xlsx文件转为xls文件的则可以参照 使用宏将xlsx格式文件批量转为xls格式文件 这篇文章

关于excel的读取和写入这里就不进行展示了,网上一大堆。

好了,小伙伴们!只要能获取到识别结果,那么接下来的实现方式就不需要在展示了吧。

今天的分享到此结束,如有更好的实现方式,麻烦您一定要告知我,感谢!

java使用POI识别excel的复选框插件相关推荐

  1. excel添加复选框的两种做法

    内容提要:文章介绍excel添加复选框的方法,通过控件命令和VBA实现批量添加复选框.对Excel感兴趣的朋友可加Excel学习交流群:284029260(www.itblw.com) excel添加 ...

  2. POI导出Word插入复选框

    POI功能比较强大,但是有些不常用功能比如插入特殊符号,不知道API怎么调用 Word里要插入复选框,首先想到的是POI有没有提供现成的API,搜了一番,貌似都说不直接支持 http://stacko ...

  3. java控件数组_java通过复选框控件数组实现添加多个复选框控件示例分享

    思路如下: 创建JPanel面板对象: 使用JPanel类的setLayout(0,4)方法设置网格布局管理器,即列数为4,行数自动调节: 创建一个字符串型一维数组作为控件文本数组: 创建一个JChe ...

  4. java控件数组_java通过复选框控件数组实现添加多个复选框控件

    编写程序,通过复选框控件数组事先选择用户爱好信息的复选框,在该程序中,要求界面中的复选框数量可以根据指定复选框名称的字符串数组的长度来自动调节.方法如下: 创建JPanel面板对象: 使用JPanel ...

  5. java checkbox数组_Java中的复选框数组

    我想有6个复选框,按下按钮后做一些事情,您有例子吗? 还可以使用一系列复选框吗? 我想避免: Checkbox cb1 = new Checkbox("A"); Checkbox ...

  6. poi在word输出复选框windows远程突然不能复制的解决方法

    在word编辑写个变量ACCOUNTINGMETHOD1,然后用WordReplaceUtil.getCTSym("Wingdings 2", "F052")去 ...

  7. Java宇layUi结合xm-select 实现复选框查询功能

    首先引用xm-select 我们项目的地址是 <script src="../../statics/plugins/layui/layui-formSelects/xm-select. ...

  8. Java实现PDF动态插入图片复选框

    文章目录 (一)需求描述 (二)制作模板 (三)代码开发 (一)需求描述 构建PDF模板,对其中部分数据实现动态插入,主要分为三个组件:普通文本,复选框,二维码图片的动态插入 (二)制作模板 因为PD ...

  9. java中判断复选框是否选中_php 判断复选框checkbox是否被选中

    php 判断复选框checkbox是否被选中 复选框checkbox在php表单提交中经常被使用到,本文章通过实例向大家介绍php如何判断复选框checkbox中的值是否被选中,需要的朋友可以参考一下 ...

  10. java中判断复选框是否被选中_[Java教程]jquery如何判断checkbox(复选框)是否被选中...

    [Java教程]jquery如何判断checkbox(复选框)是否被选中 0 2013-08-15 18:00:14 谁都知道 在html 如果一个复选框被选中 是 checked="che ...

最新文章

  1. hdu 1213 How Many Tables ([kuangbin带你飞]专题五 并查集)
  2. 0元力压0.1元,中国电信中标连云港政务云项目
  3. 填坑-十万个为什么?(24)
  4. PadLeft 和 PadRight
  5. 《LoadRunner 没有告诉你的》之四——理解性能
  6. 动态规划——骨牌平铺问题
  7. “2007中国软件技术英雄会”之微软中国研发集团开放日
  8. Codeforces Round #478 Div2 975A 975B 975C 975D
  9. MacW资讯:苹果电脑删除磁盘分区及双系统分区的办法
  10. exadata的infiniband管理
  11. 实验01 使用网络协议分析仪Wireshark
  12. Win7手工查找notepad.exe的IAT
  13. ARM架构(RISC)和x86架构(CISC)以及传统与移动CPU/GPU厂商
  14. HIVE修改列顺序中的坑
  15. 都2022年了,我不允许还有人不知道poi-ti这么好用的库
  16. 享受代码的快乐--小米抢购前端代码分析
  17. 三重积分为何不能直接带入积分区域?搞懂这些,重积分基本可以了
  18. php twig if,php – twig:如果有多个条件
  19. 裁员10%,涉万人!Tesla这次“玩”大了…
  20. C#之父牛逼还是Java之父牛逼?

热门文章

  1. iOS 地图坐标系转换
  2. 四、Oracle 视图
  3. 论文阅读:Axiomatic Characterization of Data-Driven Influence Measures for Classification
  4. 计算机宏如何设置方法,excel 如何启用宏的方法,以及如何设置excel启用宏
  5. el-input隐藏边框
  6. M302A-ZN-S905L2蓝牙语音-支持外置无线网卡版本
  7. 元宇宙iwemeta:《时代》杂志新封面,元宇宙将改变一切
  8. **Unity环境光遮蔽(Ambient Occlusion)Shader实现逻辑**
  9. uygurqa输入法android,uygurqa维语输入法
  10. osu计算机科学硕士,OSU的CSE「俄亥俄州立大学计算机科学与工程系」