<dependency>
<groupId>com.alibaba</groupId>
<artifactId>easyexcel</artifactId>
<version>3.1.1</version>
</dependency>
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;
public class ExcelListener extends AnalysisEventListener<ExcelData> {
List<ExcelData> dataList = new ArrayList<>();
@Override
public void invoke(ExcelData excelData, AnalysisContext analysisContext) {
dataList.add(networkExcelData);
}
@Override
public void doAfterAllAnalysed(AnalysisContext analysisContext) {
System.out.println("读取完毕!");
}
public List<ExcelData> getDataList(){
return this.dataList;
}
}
@Data
public class ExcelData {
@ExcelProperty(value = "序号", index = 0)
private String id;
@ExcelProperty(value = "名称", index = 1)
private String name;
@ExcelProperty(value = "省份", index = 2)
private String province;
}
ExcelListener listener = new ExcelListener();
EasyExcel.read(EXCEL_PATH, ExcelData.class, listener).sheet(EXCEL_SHEET_NAME).doRead();
List<ExcelData> dataList = listener.getDataList();
/**
* 获取合并单元格的值
* @param sheet
* @param row
* @param column
* @return
*/
public String getMergedRegionValue(Sheet sheet ,int row , int column){
int sheetMergeCount = sheet.getNumMergedRegions();
for(int i = 0 ; i < sheetMergeCount ; i++){
CellRangeAddress ca = sheet.getMergedRegion(i);
int firstColumn = ca.getFirstColumn();
int lastColumn = ca.getLastColumn();
int firstRow = ca.getFirstRow();
int lastRow = ca.getLastRow();
if(row >= firstRow && row <= lastRow){
if(column >= firstColumn && column <= lastColumn){
Row fRow = sheet.getRow(firstRow);
Cell fCell = fRow.getCell(firstColumn);
return getCellValue(fCell) ;
}
}
}
return null ;
}
/**
* 判断指定的单元格是否是合并单元格
* @param sheet
* @param row
* @param column
* @return
*/
public boolean isMergedRegion(Sheet sheet , int row , int column){
int sheetMergeCount = sheet.getNumMergedRegions();
for(int i = 0 ; i < sheetMergeCount ; i++ ){
CellRangeAddress ca = sheet.getMergedRegion(i);
int firstColumn = ca.getFirstColumn();
int lastColumn = ca.getLastColumn();
int firstRow = ca.getFirstRow();
int lastRow = ca.getLastRow();
if(row >= firstRow && row <= lastRow){
if(column >= firstColumn && column <= lastColumn){
return true ;
}
}
}
return false ;
}
/**
* 获取单元格的值
* @param cell
* @return
*/
public String getCellValue(Cell cell){
if(cell == null) return "";
if(cell.getCellType() == Cell.CELL_TYPE_STRING){
return cell.getStringCellValue();
}else if(cell.getCellType() == Cell.CELL_TYPE_BOOLEAN){
return String.valueOf(cell.getBooleanCellValue());
}else if(cell.getCellType() == Cell.CELL_TYPE_FORMULA){
return cell.getCellFormula() ;
}else if(cell.getCellType() == Cell.CELL_TYPE_NUMERIC){
return String.valueOf(cell.getNumericCellValue());
}
return "";
}
<dependency>
<groupId>org.apache.poi</groupId>
<artifactId>poi-ooxml</artifactId>
<version>4.1.1</version>
</dependency>
package com.trans;
import org.apache.poi.ss.usermodel.CellType;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
import java.io.File;
import java.io.FileInputStream;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
public class ReadExcel {
private File file;
//k-colIndex Object-value
private List<Map<Integer, Object>> valueMaps = new ArrayList<>();
public ReadExcel(File file) {
this.file = file;
}
public ReadExcel read(){
try {
FileInputStream inputStream = new FileInputStream(file);
XSSFWorkbook workbook = new XSSFWorkbook(inputStream);
XSSFSheet xssfSheet = workbook.getSheetAt(0);
//不获取表头数据
for (int rowIndex=Constant.TABLE_NUM; rowIndex <= xssfSheet.getLastRowNum(); rowIndex++){
getDataFromRow(xssfSheet.getRow(rowIndex));
}
}catch (Exception e){
//文件错误
}
return this;
}
private void getDataFromRow(XSSFRow row){
if (isRowEmpty(row)){
return;
}
Map<Integer, Object> valueMap = new HashMap<>();
for(int i=0; i<row.getLastCellNum(); i++) {
if (!isCellEmpty(row.getCell(i))) {
valueMap.put(i, getLabelCellValue(row.getCell(i)));
}
}
valueMaps.add(valueMap);
}
private boolean isRowEmpty(XSSFRow row) {
if (null == row) {
return true;
}
for (int i = row.getFirstCellNum(); i < row.getLastCellNum(); i++) {
XSSFCell cell = row.getCell(i);
if (null != cell && cell.getCellTypeEnum() != CellType.BLANK) {
return false;
}
}
return true;
}
private boolean isCellEmpty(XSSFCell cell) {
return null == cell || cell.toString().length() == 0;
}
public List<Map<Integer, Object>> getValueMaps() {
return valueMaps;
}
private String getLabelCellValue(XSSFCell xssfCell) {
String cellValue;
if (null != xssfCell) {
//判断cell类型
if (xssfCell.getCellTypeEnum() == CellType.NUMERIC || xssfCell.getCellTypeEnum() == CellType.FORMULA) {
if (new Double(xssfCell.getNumericCellValue()).intValue() == new Double(xssfCell.getNumericCellValue())) {
cellValue = String.valueOf(new Double(xssfCell.getNumericCellValue()).intValue());
} else {
cellValue = xssfCell.getNumericCellValue().toString();
}
} else if (xssfCell.getCellTypeEnum() == CellType.BOOLEAN) {
cellValue = String.valueOf(xssfCell.getBooleanCellValue());
} else if (xssfCell.getCellTypeEnum() == CellType.STRING) {
cellValue = xssfCell.getStringCellValue();
} else {
cellValue = xssfCell.toString();
}
} else {
cellValue = "";
}
return cellValue.trim();
}
}
文章浏览阅读2.1k次。最近开发需求中要模仿微信朋友圈文章的展开收起功能,网上找了找,发现都有问题,于是乎自己在前辈的基础上进行了一定量的修改,下边将源码贴出来供大家参考:1.主Activity布局文件就不粘贴了,很简单,就一个ListView.2.主Activity功能实现:package com.example.textviewdemo; import java.util.HashMap; import andr_android 文字显示更多
文章浏览阅读63次。http://ixdba.blog.51cto.com/blog/2895551/1751377 好文章,防止以后找不到了,先转载一份过来。 转载于:https://blog.51cto.com/lee90/1757425
文章浏览阅读1.7k次。关于Python爬虫的详细介绍
文章浏览阅读6k次,点赞8次,收藏6次。前言:使用 eclipse 都习惯使用快捷键ALT+/ 来代码自动提示,后来使用IntelliJ Idea这个快捷键并不管用,十分不便,这里记录如何使更改idea代码自动提示快捷键。打开Settings设置 [ 快捷键 Ctrl + Alt + S ]File ––> Settings ––> KeyMap进入快捷键设置界面。idea中默认的代码自动提示快捷键是Basic Ctrl + 空格(可以再搜索框中输入 basic快速查找),这个和安装的中文输入法切换快捷键冲突,所以需要修改._idea开启自动提示 快捷键
文章浏览阅读608次。//#include //#include //#include //int my_atoi(const char *psz);//int main()//{// char str[] = " -23j1";// int a = my_atoi(str);// printf("%d\n",a);// return 0;//}////int my__while (*psz != '\0' && *psz != 0x0d && *psz != 0x0a)
文章浏览阅读943次。echarts 柱状图在React里面的运用:正常的echarts 都是竖直型的,或者一个里边包含多个的。 这次做个不同的, y轴为坐标,x轴为值,左右都为正数展开。(1)、引入相关的文件import React, { Compoent } from 'react';import { Spin } from 'antd';import echarts from 'echarts'..._react柱状图怎么给series赋值
文章浏览阅读1.4k次。偶然看到有人在如何选择最适合、最好用的群发邮箱?恰巧最近我接触到了一款很好的邮箱~TOM VIP邮箱,在此分享给各位~邮件群发,如何选择最好用的电子邮箱?首先,TOM VIP邮箱拥有十多年邮件系统研发和服务经验,超高送达率,发qq,发163,发国外,发国内,发外贸迅速抵达。同时,就其35位靓号的稀有性来讲就比较赞。目前多数邮箱靓号也是有的,但是35位这种超短靓号还是比较稀缺的,更遑论豹子号..._群发邮件邮箱评比
文章浏览阅读1.1k次,点赞14次,收藏23次。电商场景中扣库存需要考虑秒杀高并发、事务一致性等场景,需要根据业务和场景来选择不同的方案。_如果支付时扣库存,有什么问题
文章浏览阅读3.8k次。C++笔试题目大全(笔试宝典)(不断完善中) 收藏 (转)1.new 、 delete 、 malloc 、 free 关系 delete 会调用对象的析构函数 , 和 new 对应 free 只会释放内存, new 调用构造函数。 malloc 与 free 是 C++/C 语言的标准库函数, new/delete 是 C++ 的运算符。它们都可用于申请动态内存和释放内存。对于非内部数据类型的对象而言,光用 maloc/free 无法满足动态对象的要求。对象_c++题目描述有这样一个四位数,其千位和百位之和为偶数,十位和个位之和为奇数,
文章浏览阅读135次。设置地址设置地址需要注意的是该命令只能从地址0、端口0发送,等到执行成功以后,需要设置协议栈对象的usbAddr为新的地址,以后所有命令的收发都只能通过新地址进行:/***给USB设备设置地址*/shortusbSetAddress(unsignedchar*pDataBuf,unsignedshorta..._usb主机 设置地址
文章浏览阅读85次。官网地址:https://docs.oracle.com/javase/8/docs/technotes/tools/unix/java.html1.JVM参数选项类型类型一:标准参数选项特点:比较稳定,后续版本基本不会变化,以-开头各种选项:运行java或者java -help可以看到所有的标准选项类型二:-X参数选项特点:非标准化参数,功能还是比较稳定的。但是官方说后续版本可能会变更,以-X开头。各种选项:运行java -X命令可以看到所有的X选项。JVM的JIT编译模式相关的选_jvm jit xmixed
文章浏览阅读374次,点赞11次,收藏8次。5. **开态电阻 (On-State Resistance):** RDS(ON) = 21mΩ @ VGS=10V, VGS=12V,说明在特定的栅源电压下,开态时的电阻。6. **阈值电压 (Threshold Voltage):** Vth = -1.8V,表示在栅源电压作用下,器件从关态切换到开态所需的最小电压。4. **最大电流 (Maximum Current):** -8.5A,表示器件能够承受的最大电流,负号表示电流方向为从漏极到源极。- 阈值电压: Vth = -1.8V。