方式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 (精准定位)的更多相关文章

  1. 如何实现室内Wi-Fi无线终端的精准定位

    如何实现室内Wi-Fi无线终端的精准定位 如何实现室内Wi-Fi无线终端的精准定位 随着商圈020的兴起,室内定位技术的也如百花争艳般不断涌现.但随着室内Wi-Fi网的架设普及,基于Wi-Fi定位技术 ...

  2. 获取客户端IP地址定位城市信息

    获取客户端IP地址定位城市信息 1.首先获取客户端的IP地址 function getIPaddress(){ $IPaddress=''; if (isset($_SERVER)){ if (iss ...

  3. 利用POI获取Excel中图片和图片位置

    利用POI获取Excel中图片和图片位置(支持excel2003or2007多sheet) 转自:http://blog.csdn.net/delongcpp/article/details/8833 ...

  4. AngularJS进阶(二十)HTML5实现获取地理位置信息并定位功能

    HTML5实现获取地理位置信息并定位功能 注:请点击此处进行充电! 前言 这篇文章主要介绍了HTML5实现获取地理位置信息并定位功能,本文讲解了原生HTML5.百度地图.谷歌地图等三种获取理位置信息并 ...

  5. JAVA使用POI获取Excel的列数与行数

    Apache POI 是用Java编写的免费开源的跨平台的 Java API,Apache POI提供API给Java程式对Microsoft Office格式档案读和写的功能. 下面这篇文章给大家介 ...

  6. html5实现获取地理位置信息并定位

    这里主要讲h5实现获取地理位置信息并定位功能,本文讲解了原生h5,百度地图,谷歌地图等三种获取地理信息并定位的方法,需要的朋友可以参考下: h5提供了地理位置功能(Geolocation API),能 ...

  7. java_获取指定ip的定位

    因为自己网站后台做了一个进站ip统计,之前只是获取了ip,这次优化了下,把ip的大致区域弄出来了 废话不多说,进正题 首先要用到几个网络大头的api 淘宝API:http://ip.taobao.co ...

  8. vue开发东京买菜,全栈项目,前端django,带手机GPS精准定位,带发票系统,带快递系统,带微信/支付宝/花呗/银行卡支付/带手机号一键登陆,等等

    因为博客园不能发视频,所以,完整的视频,开发文档,源码,请向博主索取 完整视频+开发文档+源码,duanshuiLu.com下载 vue+django手机购物商城APP,带支付,带GPS精准定位用户, ...

  9. django开发东京买菜,全栈项目,前端vue,带手机GPS精准定位,带发票系统,带快递系统,带微信/支付宝/花呗/银行卡支付/带手机号一键登陆,等等

    因为博客园不能发视频,所以,完整的视频,开发文档,源码,请向博主索取 完整视频+开发文档+源码,duanshuiLu.com下载 vue+django手机购物商城APP,带支付,带GPS精准定位用户, ...

  10. 利用wireshark任意获取qq好友IP实施精准定位

    没事玩一把,感觉还挺有趣,首先打开wireshark: 不管你连接的什么网,如图我连接的是WLAN,双击进入如图界面: ctrl-f进行搜索:如图 选择分组详情,字符串,并输入020048.这时候你就 ...

随机推荐

  1. 在vue js中for循环使用

    在线免费图片压缩工具 前端技术站 1.for(let item of response.data.result) { 用item操作每一条数据. } item:定义的每一条的变量 response.d ...

  2. CentOS7 修改root密码

    能登录系统修改root密码 passwd root(可以是其他什么用户) 输入新密码(两次)   忘记root密码不能进入系统,修改root密码   1.开机进入grub界面按e进入单用户编辑模式 2 ...

  3. python 处理CAD文件

    注意:如下的两个脚本都是我自己亲自试过的,可以运行得到结果!可以直接运行!可以直接运行! 网上的中文api能找到的不够全,工作中有用到部分功能,自己从中文英文资料里面找到一些,这里做一些总结. 画图a ...

  4. Java 多线程 术语

    并行和并发:并发偏重于多个任务交替执行.并行是真正意义上的"同时执行".但两者的最终效果是一样的: 同步和异步:同步是指在同一时间里,一个同步方法调用后需要返回后,才能继续后续的行 ...

  5. linux基础知识面试题

    Linux 开机启动过程 主机加电自检,加载 BIOS 硬件信息. 读取 MBR 的引导文件(GRUB.LILO). 引导 Linux 内核. 运行第一个进程 init (进程号永远为 1 ). 进入 ...

  6. SQL Server datetime类型为null的有趣实验

    @data1 --变量 测试用 @data2 --当前时间 当@data1为null 则格式转换错误 直接控制台什么也不显示 也不报错 当定义'' 显示默认时间

  7. 初步理解1=C

    1=C 1=C 表示简谱上看到1就弹C键 1=? 1就从?键出发 例如我们看到1=D, 我们看到1就从D键出发 1=C 到1=D就叫做升了一个key 黑键怎么表示 半音与全音 半音是一个距离单位 1 ...

  8. http hook

    class XMLHttp { request = function(param) {} ; response = function(param) {} ; } let httpCopy = new ...

  9. 在脚手架中使用React

    1.导入react 和react-dom 两包 import React from 'react' import ReactDOM from 'react-dom' 2.调用React.createE ...

  10. 【基础知识】C++算法基础(快速排序)

    快速排序: 1.执行流程(一趟快排): 2.一趟快排的结果:获得一个枢纽,在此左边皆小于此数,在此右边皆大于此数,因此可以继续使用递归获得最终的序列.