读取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 ...
随机推荐
- dns解决测试微信二级域名访问问题
背景介绍: 1:解决本地不能通过域名访问问题: 2:解决微信设置二级域名且本地iis站点使用非80端口号问题: ps:网站中微信部分在global中设置了重定向,代码已经修改为必须通过“wechat. ...
- 【BZOJ2055】80人环游世界 有上下界费用流
[BZOJ2055]80人环游世界 Description 想必大家都看过成龙大哥的<80天环游世界>,里面的紧张刺激的打斗场面一定给你留下了深刻的印象.现在就有这么 一个 ...
- iOS 遍历控件
NSArray *subviews = [_bgImageView subviews]; for (id objInput in subviews) { if ([objInput isKindOfC ...
- 动态代理:JDK原生动态代理(Java Proxy)和CGLIB动态代理原理+附静态态代理
本文只是对原文的梳理总结,以及自行理解.自己总结的比较简单,而且不深入,不如直接看原文.不过自己梳理一遍更有助于理解. 详细可参考原文:http://www.cnblogs.com/Carpenter ...
- hdu 1513 Palindrome【LCS滚动数组】
链接: http://acm.hdu.edu.cn/showproblem.php?pid=1513 http://acm.hust.edu.cn/vjudge/contest/view.action ...
- 学习js的正确姿势
轻松入门: http://dwz.cn/6yYLoo 全面理解: http://www.shouce.ren/api/view/a/1116 大师进阶: http://es6.ruanyifeng.c ...
- 剑指Offer——斐波那契数列
题目描述: 大家都知道斐波那契数列,现在要求输入一个整数n,请你输出斐波那契数列的第n项.n<=39 分析: 递归解法肯定相当耗时. 因为当n=4时,程序是这样子递归运算的:Fibonacci( ...
- 转!!Java设置session超时(失效)的时间
Java设置session超时(失效)的时间 在一般系统登录后,都会设置一个当前session失效的时间,以确保在用户长时间不与服务器交互,自动退出登录,销毁session具体设置的方法有三种:1 ...
- emo前端
1 点击按钮可以在form中添加input控件,以name给input编号,然后点击按钮ajax上传表单,在回调函数中弹框显示结果: <form id="newfriends" ...
- Angular学习笔记—Rxjs、Promise的区别
Promises: 异步操作完成或失败时处理单个事件 不可取消 代码可读性强,有try/catch Observables: 可持续监听和响应多个事件 可取消订阅 支持map, filter, red ...