读取Excel复杂的数据
涉及到合并单元格的数据读取:
package com.util; import org.apache.poi.ss.usermodel.*;
import org.apache.poi.ss.util.CellRangeAddress; import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List; public class ExcelUtil {
/**
* 判断指定的单元格是否是合并单元格
*
* @param sheet
* @param row 行下标
* @param column 列下标
* @return
*/
public static boolean isMergedRegion(Sheet sheet, int row, int column) {
int sheetMergeCount = sheet.getNumMergedRegions();
for (int i = 0; i < sheetMergeCount; i++) {
CellRangeAddress range = sheet.getMergedRegion(i);
int firstColumn = range.getFirstColumn();
int lastColumn = range.getLastColumn();
int firstRow = range.getFirstRow();
int lastRow = range.getLastRow();
if (row >= firstRow && row <= lastRow) {
if (column >= firstColumn && column <= lastColumn) {
return true;
}
}
}
return false;
} /**
* 获取合并单元格的值
*
* @param sheet
* @param row
* @param column
* @return
*/
public static 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);
fCell.setCellType(CellType.STRING);
return getCellValue(fCell);
}
}
} return "";
} /**
* 获取单元格的值
*
* @param cell
* @return
*/
public static String getCellValue(Cell cell) { if (cell == null) {
return "";
}
cell.setCellType(CellType.STRING);
if (cell == null) return ""; if (cell.getCellType() == Cell.CELL_TYPE_STRING) { return cell.getStringCellValue().trim(); } else if (cell.getCellType() == Cell.CELL_TYPE_BOOLEAN) { return String.valueOf(cell.getBooleanCellValue()).trim(); } else if (cell.getCellType() == Cell.CELL_TYPE_FORMULA) { return cell.getCellFormula().trim(); } else if (cell.getCellType() == Cell.CELL_TYPE_NUMERIC) { return String.valueOf(cell.getNumericCellValue()).trim(); }
return "";
} public static List<List<String>> getValues(String fileUrl, int sheetNum) {
List<List<String>> values = new ArrayList<List<String>>();
try {
File file = new File(fileUrl);
InputStream is = null;
try {
is = new FileInputStream(file);
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Workbook workbook = null;
Sheet sheet = null; workbook = WorkbookFactory.create(is);
int sheetCount = sheetNum - 1; //workbook.getNumberOfSheets();//sheet 数量,可以只读取手动指定的sheet页
// for(int s=0;s<sheetCount;s++){ sheet = workbook.getSheetAt(sheetCount); //读取第几个工作表sheet
int rowNum = sheet.getLastRowNum();//有多少行 for (int i = 1; i <= rowNum; i++) {
Row row = sheet.getRow(i);//第i行
if (row == null) {//过滤空行
continue;
}
List<String> list = new ArrayList<>();
int colCount = sheet.getRow(0).getLastCellNum();//用表头去算有多少列,不然从下面的行计算列的话,空的就不算了
// for (int j = 0; j < row.getLastCellNum(); j++) {//第j列://+1是因为最后一列是空 也算进去
for (int j = 0; j < colCount; j++) {//第j列://+1是因为最后一列是空 也算进去
Cell cell = row.getCell(j);
String cellValue;
boolean isMerge = false;
if (cell != null) {
isMerge = isMergedRegion(sheet, i, cell.getColumnIndex());
}
//判断是否具有合并单元格
if (isMerge) {
cellValue = getMergedRegionValue(sheet, row.getRowNum(), cell.getColumnIndex());
} else {
cellValue = getCellValue(cell);
}
list.add(cellValue);
}
values.add(list);
}
// }
System.out.println(values);
} catch (Exception e) {
e.printStackTrace();
}
return values;
}
}
调用工具类方法:
@Test
public void testReadOne() {
String fileUrl = "E:\\officedh\\cai\\docs\\design\\云彩游戏列表.xlsx";
List<List<String>> values = ExcelUtil.getValues(fileUrl,1);
String firstValue = "";
String secondValue = "";
int firstId = 0;
int secondId = 0;
List<Game> games = new ArrayList<>();
List<GameGroup> gameGroups = new ArrayList<>();
Timestamp timestamp = new Timestamp(System.currentTimeMillis()); for (List<String> value : values) {
for (int i = 0; i < value.size(); i++) {
String v = value.get(i);
switch (i) {
case 0:
if (!v.equals(firstValue)) {
firstId++;
secondId = 0;
firstValue = v;
// 插入PlayGroup{firstId,firstValue}
GameGroup group = new GameGroup();
String gameGroupId = String.format("%02d", firstId);
group.setGameGroupId(Long.valueOf(gameGroupId));
// group.setTags(Long.valueOf(id));
group.setCreateTime(timestamp);
group.setName(firstValue);
group.setDescription("");
group.setSn("");
gameGroups.add(group);
}
break;
case 1:
if (!v.equals(secondValue)) {
secondId++;
secondValue = v;
//插入PlaySection{secondId,secondValue}
Game game = new Game();
String gameGroupId = String.format("%02d", firstId);
String gameId = String.format("%02d%02d", firstId, secondId);
game.setGameGroupId(Long.valueOf(gameGroupId));
game.setGameId(Long.valueOf(gameId));
game.setName(secondValue);
// game.setGameType(rank);//游戏类型,1:数字型;2:字符型;3:其他型
// game.setBeginTime(rank);//开奖时间
// game.setEndTime(rank);//闭奖时间
// game.setDescription(rank);//
// game.setDuration(rank);//开奖间隔,单位:秒
// game.setLockTime(rank);//封存时间,单位:秒
// game.setElements(rank);//号码
// game.setLogo(rank);//LOGO
// game.setSn(rank);
// game.setStatus(rank);
// game.setTags(rank);
game.setCreateTime(timestamp);
games.add(game);
}
break;
}
}
}
gameRepository.save(games);
gameGroupRepository.save(gameGroups);
}
读取Excel复杂的数据的更多相关文章
- sql 读取excel中的数据
select 列名 as 字段名 from openBowSet('MSDASQL.1','driver=Microsoft Excel Driver(*.xls);dbq=文件存放地址','sele ...
- C#读取Excel表格的数据
1.创建工程后,需要下载 EPPlus.dll 添加到工程中,这里有一个下载地址:https://download.csdn.net/download/myunity/10784634 2.下面仅实现 ...
- SpringBoot(十三)_springboot上传Excel并读取excel中的数据
今天工作中,发现同事在整理数据,通过excel上传到数据库.所以现在写了篇利用springboot读取excel中的数据的demo.至于数据的进一步处理,大家肯定有不同的应用场景,自行修改 pom文件 ...
- 无法读取Excel中的数据单元格。有数据,但是读出来全是空值
C#读取Excel,取值为空的解决办法! C#读取Excel遇到无法读取的解决方法是什么呢?这样在C#读取Excel的过程中有很多问题,那么本文就向你介绍如何解决C#读取Excel遇到无法读取的解决方 ...
- 读取Excel中的数据到DataSet
读取Excel中的数据到DataSet 1.引用命名空间 using System.Data.OleDb; 2.输入Excel文件,输出DataSet public DataSet ExecleDs( ...
- C# 读取Excel中的数据
#region 读取Excel中的数据 /// <summary> /// 读取Excel中的数据 /// </summary> /// <param name=&quo ...
- java 读取Excel文件并数据持久化方法Demo
import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util ...
- NPOI读取Excel,导入数据到Excel练习01
NPOI 2.2.0.0,初级读取导入Excel 1.读取Excel,将数据绑定到dgv上 private void button1_Click(object sender, EventArgs e) ...
- PHP读取EXCEL时写入数据乱码解决办法
第一步排除excel读取的数据是不是乱码 EXCEL读取时经常会出现乱码,而我们常用的字符集是UTF-8 ,GB2312(GBK) ,这就需要对编码进行转换,但是又不能对纯数字和英文字符转换,否则会乱 ...
- C#读取Excel表格中数据并返回datatable
在软件开发的过程中,经常用到从excel表格中读取数据作为数据源,以下整理了一个有效的读取excel表格的方法. DataTable GetDataTable(string tableName,str ...
随机推荐
- 在Nginx 配置防止单IP 攻击频次的控制 和 大流量攻击
nginx可以通过HttpLimitReqModul和HttpLimitZoneModule配置来限制ip在同一时间段的访问次数. HttpLimitReqModul用来限制连单位时间内连接数的模块, ...
- mysqld.sock
sudo service mysql start https://dev.mysql.com/doc/refman/5.7/en/problems-with-mysql-sock.html B.5. ...
- IO 流之字节流和转换流
基本读取操作: InputStream(); OutputStream(); // 直接写入目的地中, 不需要 flush() 刷新 write(byte[] b); // 参数为 byte 数组 字 ...
- WTForms In Flask(WTForms在Flask中的应用)
WTForms WTForms是一个支持多个web框架的form组件,主要用于对用户请求数据进行验证. 安装wtforms : pip3/pip install wtforms 用户登录/注册示例 项 ...
- Flask(2)- 装饰器的坑及解决办法、flask中的路由/实例化配置/对象配置/蓝图/特殊装饰器(中间件、重定义错误页面)
一.装饰器的坑以及解决方法 1.使用装饰器装饰两个视图函数,代码如下 from flask import Flask, redirect, render_template, request, sess ...
- Matlab/Simulink仿真中如何将Scope转化为Figure?
1.只需要在运行仿真后,在命令窗口内输入: ,'ShowHiddenHandle','on'); set(gcf,'menubar','figure'); scope最上方会出现一个菜单栏,选择Too ...
- phalcon—— PHP基础知识(一)
一.变量和常量 1.1.变量名(标示符) 1)变量:$开头标志 2)变量名:能够由字母.数字,_ 3者组成,不能用数字开头 3)标识符是区分大写和小写的.但函数名不区分大写和小写. 4)变量名称能够与 ...
- Leetcode 之 Exclusive Time of Functions
636. Exclusive Time of Functions 1.Problem Given the running logs of n functions that are executed i ...
- 开博第一篇,学习markdown
Markdown学习 其实之前自己也一直有记录,不过是Evernote记录,没有分享出来,最近看了一些牛人博客,觉得也应该分享出来.和别人多交流,多学习.所以花了几小时学了一下Markdown语法,现 ...
- GTID的主从复制的配置
主库配置: (一).修改配置文件:在my.cnf配置文件中开启如下选项. [mysqld] #GTID: gtid_mode=on enforce_gtid_consistency=on server ...