POI 获取chekbox textbox (精准定位)
方式1:POI
方式2: xls
获取checkbox , 已经checkbox 的 label (如果shape name 读取时一直为空, 用wps 打开excel , 保存后在测试)

依赖:
<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>
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml-schemas</artifactId>
<version>4.0.1</version>
</dependency>
测试代码:
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.apache.poi.hssf.usermodel.*;
import org.apache.poi.poifs.filesystem.POIFSFileSystem;
import org.apache.poi.ss.usermodel.DataFormatter; import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.lang.reflect.Method;
import java.util.HashMap;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern; /***************************
*<pre>
* @Project Name : base-case-test-service
* @Package : com.sea.base.test
* @File Name : ReadExcelUFLCheckBox
* @Author : Sea
* @Mail : lshan523@163.com
* @Date : 2022/9/27 15:23
* @Purpose : 仅仅用于xls 文件
* @History :
*</pre>
***************************/
@Data
@Slf4j
@NoArgsConstructor
public class MyExcelReadUtil { // HashMap<String, Object> checkBoxResultMap = new HashMap<>(); //收集解析的checkbox
// HashMap<String, Object> activeXTextBoxMap = new HashMap<>(); //收集解析的 activeX Textbox
HashMap<String, Object> textBoxMap = new HashMap<>(); //收集解析的 textBoxMap private HSSFWorkbook workbook; public MyExcelReadUtil(InputStream excelInput) throws IOException {
// InputStream input = new FileInputStream("/home/sea/xx.xls");
POIFSFileSystem fs = new POIFSFileSystem(excelInput);
this.workbook= new HSSFWorkbook(fs);
} /**
* @param sheetIndex sheet编号 0,1,2
* @param checkBoxResultMap 收集解析的checkbox
* @param activeXTextBoxMap 收集解析的 activeX Textbox (name : byte[])
*/
public void readBoxAtSheet(int sheetIndex,HashMap<String, Object> checkBoxResultMap,HashMap<String, Object> activeXTextBoxMap){
try {
HSSFSheet sheet = workbook.getSheetAt(sheetIndex);
log.info("sheet name : " + sheet.getSheetName());
HSSFPatriarch drawingPatriarch = sheet.getDrawingPatriarch(); //sheet.createDrawingPatriarch();
List<HSSFShape> childrenList= drawingPatriarch.getChildren();
int i =1;
for(HSSFShape shape: childrenList)
{
String shapeName = shape.getShapeName();
log.info("+++++++++++++++++++++ " +(i++) +" " +shapeName+" +++++++++++++^+++++++++++++");
if (shape instanceof HSSFTextbox) //普通文本框
{
log.info("+++++++++ HSSFTextbox ++++++++++"+shape.getShapeName());
HSSFTextbox textbox = (HSSFTextbox)shape;
HSSFRichTextString richString = textbox.getString();
String str = richString.getString();
log.info("文本框内容: " + str);
textBoxMap.put((shapeName+"").trim(),str);
} if (shape instanceof HSSFSimpleShape) // 复选框类
{
log.info("+++++++++ HSSFSimpleShape ++++++++++"+shape.getShapeName());
HSSFSimpleShape simpleShape = (HSSFSimpleShape)shape;
getCheckBox(simpleShape,checkBoxResultMap);
} if (shape instanceof HSSFObjectData) //图片已经其他插件
{
log.info("+++++++++ HSSFObjectData ++++++++++"+shape.getShapeName());
getActivexTextbox(shape,activeXTextBoxMap);
}
}
System.err.println(activeXTextBoxMap);
System.err.println(checkBoxResultMap);
} catch (Exception ex) {
ex.printStackTrace();
}
} /**
* @param sheet
*/
public static void getAllData(HSSFSheet sheet)
{
int lastRowNum = sheet.getLastRowNum();
DataFormatter dataFormatter = new DataFormatter();
for(int row=0; row< lastRowNum; row++){
HSSFRow rowLine = sheet.getRow(row);
if(rowLine==null){continue;}
for(int cell=0; cell<=10;cell++){
if(rowLine.getCell(cell)!=null){
System.err.print(dataFormatter.formatCellValue(rowLine.getCell(cell)));
}
System.err.print(" ");
}
System.err.println(" ");
}
} /**
* @param sheet
* @param row
* @param column
* @return
*/
public static String getData(HSSFSheet sheet,int row, int column)
{
String s = new DataFormatter().formatCellValue(sheet.getRow(row-1).getCell(column-1));
return s;
} private void getActivexTextbox(HSSFShape shape, HashMap<String, Object> activeXTextBoxMap) throws Exception
{
String shapeName = shape.getShapeName() + "";
if(shapeName.contains("TextBox"))
{
HSSFObjectData objDataShape = (HSSFObjectData) shape;
//保存到本地
/* log.info("框名 "+shapeName);
String path = "/home/sea/CCCCCCCCCCC/AAAA_svn_new_AAAA/base-case-test-service/src/test/resources/" +shape.getShapeName().trim()+ ".emf";
System.err.println(path);
FileOutputStream fileOutputStream = new FileOutputStream(path);
fileOutputStream.write(objDataShape.getPictureData().getData());
fileOutputStream.close();*/
//name : byte[]
activeXTextBoxMap.put(shapeName,objDataShape.getPictureData().getData());
// activeXTextBoxMap.put(shapeName,path);
}
} private final static Pattern checkBoxReg = Pattern.compile("\\[sid=0x000A.+?\\[0(\\d),");
/**
* 获取复选框已经结果
* @param simpleShape
* @param checkBoxResult
* @throws Exception
*/
private void getCheckBox(HSSFSimpleShape simpleShape,HashMap<String, Object> checkBoxResult) throws Exception
{
if((simpleShape.getShapeName()+"").contains("Check Box"))
{
String simpleName = simpleShape.getShapeName();
log.info("复选框的内部名: "+ simpleName); // 复选框的内部名
log.info("复选框的标记: "+simpleShape.getString()); // 复选框的标记
Method getTextObjectRecord =simpleShape.getClass().getSuperclass().getDeclaredMethod("getObjRecord", null);
getTextObjectRecord.setAccessible(true);
Object textObjectRecord = getTextObjectRecord.invoke(simpleShape, null);
Matcher m = checkBoxReg.matcher(textObjectRecord.toString());
if (m.find())
{
String checkBit = m.group(1);
if (checkBit.length() == 1) {
boolean checked = "1".equals(checkBit);
System.out.println( simpleName+" " + checked+"-----------"+checkBit);
checkBoxResult.put(simpleName.trim(),checked);
}
}
}
} /**
* Sea test 2022-09-20 : OK
*/
// @Test
public void Test2(){
try {
InputStream input = new FileInputStream("/home/sea/CCCCCCCCCCC/AAAA_svn_new_AAAA/base-case-test-service/src/test/resources/EXHKG_SLI_Template.xls");
POIFSFileSystem fs = new POIFSFileSystem(input);
HSSFWorkbook wb = new HSSFWorkbook(fs);
HSSFSheet sheet = wb.getSheetAt(0);
HSSFPatriarch drawingPatriarch = sheet.getDrawingPatriarch(); //sheet.createDrawingPatriarch();
List<HSSFShape> childrenList= drawingPatriarch.getChildren();
HashMap<String, Object> checkBoxResultMap = new HashMap<>(); //收集解析的checkbox
HashMap<String, Object> activeXTextBoxMap = new HashMap<>(); //收集解析的 activeX Textbox
HashMap<String, Object> textBoxMap = new HashMap<>(); //收集解析的 textBoxMap
int i =1;
for(HSSFShape shape: childrenList)
{
String shapeName = shape.getShapeName();
System.err.println("+++++++++++++++++++++ " +(i++) +" " +shapeName+" +++++++++++++^+++++++++++++");
if (shape instanceof HSSFTextbox) //普通文本框
{
System.err.println("+++++++++ HSSFTextbox ++++++++++"+shape.getShapeName());
HSSFTextbox textbox = (HSSFTextbox)shape;
HSSFRichTextString richString = textbox.getString();
String str = richString.getString();
System.out.println("文本框内容: " + str);
textBoxMap.put((shapeName+"").trim(),str);
} if (shape instanceof HSSFSimpleShape) // 复选框类
{
System.err.println("+++++++++ HSSFSimpleShape ++++++++++"+shape.getShapeName());
HSSFSimpleShape simpleShape = (HSSFSimpleShape)shape;
System.err.println(simpleShape.getShapeName());
getCheckBox(simpleShape,checkBoxResultMap);
} if (shape instanceof HSSFObjectData) //图片已经其他插件
{
System.err.println("+++++++++ HSSFObjectData ++++++++++"+shape.getShapeName());
getActivexTextbox(shape,activeXTextBoxMap);
}
} System.err.println(activeXTextBoxMap);
System.err.println(checkBoxResultMap); } catch (Exception ex) {
ex.printStackTrace();
}
}
}
结果:[true, 男3, true, 男4, false, 男7, true, 男5, true, 男6, false, 男2, false, 男1]
方法2:(比较慢,不建议) 原文:https://zhuanlan.zhihu.com/p/518669270
通过Maven仓库下载导入,如下配置pom.xml:
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupId>e-iceblue</groupId>
<artifactId>spire.xls.free</artifactId>
<version>5.1.0</version>
</dependency>
</dependencies>
示例:
import com.spire.xls.*;
import com.spire.xls.core.ICheckBox;
import com.spire.xls.core.IRadioButton;
import com.spire.xls.core.ISpinnerShape; public class GetFormControl {
public static void main(String[] args) {
//创建Workbook类的实例,加载Excel文档
Workbook wb = new Workbook();
wb.loadFromFile("AddControls.xlsx"); //获取第1张工作表
Worksheet sheet = wb.getWorksheets().get(0); //获取TextBox
String textbox = sheet.getTextBoxes().get(0).getText();
System.out.println(textbox); //获取Radio Button
for(int i = 0; i<sheet.getRadioButtons().getCount();i++)
{
IRadioButton radioButton = sheet.getRadioButtons().get(i);
String name = radioButton.getCheckState().name();
String text = radioButton.getText();
boolean islocked = radioButton.isLocked();
System.out.println(name + text + " 是否锁定:"+ islocked);
} //获取Combo Box控件中的选中的值(注:非列表中所有选项值)
String value = sheet.getComboBoxes().get(0).getSelectedValue();
System.out.println(value); //获取Checkbox
for(int z = 0;z< sheet.getCheckBoxes().getCount();z++)
{
ICheckBox checkBox = sheet.getCheckBoxes().get(z);
String text = checkBox.getText();
String name = checkBox.getCheckState().name();
String alternativetext = checkBox.getAlternativeText();
System.out.println(text + name + alternativetext);
} //获取SpinnerShape
for(int j = 0;j<sheet.getSpinnerShapes().getCount();j++)
{
ISpinnerShape spinnerShape = sheet.getSpinnerShapes().get(j);
String rangeAddress = spinnerShape.getLinkedCell().getRangeAddress();
int currentValue = spinnerShape.getCurrentValue();
System.out.println(rangeAddress + "\n" + currentValue);
} }
}

POI 获取chekbox textbox (精准定位)的更多相关文章
- 如何实现室内Wi-Fi无线终端的精准定位
如何实现室内Wi-Fi无线终端的精准定位 如何实现室内Wi-Fi无线终端的精准定位 随着商圈020的兴起,室内定位技术的也如百花争艳般不断涌现.但随着室内Wi-Fi网的架设普及,基于Wi-Fi定位技术 ...
- 获取客户端IP地址定位城市信息
获取客户端IP地址定位城市信息 1.首先获取客户端的IP地址 function getIPaddress(){ $IPaddress=''; if (isset($_SERVER)){ if (iss ...
- 利用POI获取Excel中图片和图片位置
利用POI获取Excel中图片和图片位置(支持excel2003or2007多sheet) 转自:http://blog.csdn.net/delongcpp/article/details/8833 ...
- AngularJS进阶(二十)HTML5实现获取地理位置信息并定位功能
HTML5实现获取地理位置信息并定位功能 注:请点击此处进行充电! 前言 这篇文章主要介绍了HTML5实现获取地理位置信息并定位功能,本文讲解了原生HTML5.百度地图.谷歌地图等三种获取理位置信息并 ...
- JAVA使用POI获取Excel的列数与行数
Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能. 下面这篇文章给大家介 ...
- html5实现获取地理位置信息并定位
这里主要讲h5实现获取地理位置信息并定位功能,本文讲解了原生h5,百度地图,谷歌地图等三种获取地理信息并定位的方法,需要的朋友可以参考下: h5提供了地理位置功能(Geolocation API),能 ...
- java_获取指定ip的定位
因为自己网站后台做了一个进站ip统计,之前只是获取了ip,这次优化了下,把ip的大致区域弄出来了 废话不多说,进正题 首先要用到几个网络大头的api 淘宝API:http://ip.taobao.co ...
- vue开发东京买菜,全栈项目,前端django,带手机GPS精准定位,带发票系统,带快递系统,带微信/支付宝/花呗/银行卡支付/带手机号一键登陆,等等
因为博客园不能发视频,所以,完整的视频,开发文档,源码,请向博主索取 完整视频+开发文档+源码,duanshuiLu.com下载 vue+django手机购物商城APP,带支付,带GPS精准定位用户, ...
- django开发东京买菜,全栈项目,前端vue,带手机GPS精准定位,带发票系统,带快递系统,带微信/支付宝/花呗/银行卡支付/带手机号一键登陆,等等
因为博客园不能发视频,所以,完整的视频,开发文档,源码,请向博主索取 完整视频+开发文档+源码,duanshuiLu.com下载 vue+django手机购物商城APP,带支付,带GPS精准定位用户, ...
- 利用wireshark任意获取qq好友IP实施精准定位
没事玩一把,感觉还挺有趣,首先打开wireshark: 不管你连接的什么网,如图我连接的是WLAN,双击进入如图界面: ctrl-f进行搜索:如图 选择分组详情,字符串,并输入020048.这时候你就 ...
随机推荐
- C# IOC 个人理解
学习QFramework 过程中发现对IOC不太了解,就大概百度了一下思路 将原先类与类之间的相互依赖关系,转移到第三方容器中, 同过读取配置文件来生成对应的依赖关系,将原本类之间的耦合转移到配置文件 ...
- Unity 使用JIMO 做MR扫图(Vuforia) 优化
最近在做一个用MR眼镜端扫描图片做定位用, 使用的Vuforia提供的图片识别功能. 在眼镜端因为摄像机很挫,导致扫描出来的图片 位置存在着一定的偏差.就做了个小优化. 1.扫图的角度设定,垂直于图片 ...
- 网络服务之DHCP与FTP
目录 DHCP 一.DHCP是什么? 二.DHCP的优点 三.DHCP的分配过程 四.DHCP的工作原理 五.DHCP动态获取实验 FTP 一.FTP是什么? 二.FTP的数据连接模式 三.svftp ...
- idea常用快捷键记录
实用编写代码辅助快捷键 Ctrl+Alt+V 提出选中内容为局部变量 Ctrl+Backspace 按单词删除 Ctrl+D 复制行 Ctrl+Y 删除当前行 Ctr+Shift+U 大小写转化 Sh ...
- js 正则表达式与 python正则表达式
修饰符 1.js i g m i 忽视大小写g 执行全局匹配(查找所有匹配,而非找到第一个匹配后停止)m 执行多行匹配gi 全局匹配+忽略大小写 2.python re.Ire.IGNORECASE让 ...
- mysql零基础-3
第17章_触发器 在实际开发中,我们经常会遇到这样的情况:有 2 个或者多个相互关联的表,如 商品信息 和 库存信息 分 别存放在 2 个不同的数据表中,我们在添加一条新商品记录的时候,为了保证数据的 ...
- #科技 #资讯 #生活 RTX 4080显卡在欧跌破建议零售价, 小鹏回应自研电池, Meta因泄漏超5亿用户资料被罚款 ,黑猫投诉开启2022“你我同心 反诈同行”系列活动,这就是今天的其它大新闻
今天是2022年11月29日 十一月初六 现在是下午15:29 下面是今天的其他大新闻 #NEWS 1 #RTX 4080在欧跌破建议零售价 ( IT 之家 )据 PCGamesHardware 报道 ...
- CC2020 分享信息
CC2020是鄙人第一次参与的国际计算教育报告.CC2020报告的特色是希望面向未来的教育能走近每一个教育的利益相关者,包括家长.学生.行业雇主.政府决策制定者和学术界人士.敬请各位从自己的身份角度对 ...
- 基于vue2.0创建vue项目
一.安装node环境 1.下载地址为:https://nodejs.org/en/ 2.检查是否安装成功:如果输出版本号,说明我们安装node环境成功 3.为了提高我们的效率,可以使用淘宝的镜像:ht ...
- 基础篇:windows常用命令
1. windows常用系统命令 cd [进入目录] dir [列出当前目录文件] echo + 打印内容 [打印命令] echo 123 > 1.txt [打印内容到文本] type + 文件 ...