
二、函数实现4.0.0 org.example Test1.0-SNAPSHOT 15 15 org.apache.hbase hbase-server2.1.9 org.apache.hbase hbase-client2.1.9 org.apache.poi poi-ooxml3.17
参数说明:
- filePath传入excel的绝对路径
- keyName你需要作为rowkey列的列名
这里需要注意的是,调用POI去获取excel表格的长度时,你获得的长度和宽度大概率是不准确的,该数据一定比实际的值要大,因为POI算的是长度,而不是有几个单元格。这就意味着如果你的单元格被你拉的很宽很长,那么POI计算出来的行数和列数必定比实际要大。就拿我来举例,我一个excel表格的长度是50(有50行),可是使用POI计算出来的行数是200,还以为出了BUG。
当然,在下面的函数中解决了该问题,该函数会把你excel列名(第一行)作为Hbase列族中的列名,对应的数据就是value值
public static void Excel_to_Hbase(String filePath,String keyName) throws IOException {
HbaseHelper.Exec_CreateNamesplace(tableName);
HbaseHelper.Exec_CreateTable(tableName, family);
if(!filePath.endsWith(".xlsx")){
System.out.println("传入文件不是excel类型");
}
FileInputStream fis = null;
Workbook workbook = null;
//获取绝对路径
try{
fis = new FileInputStream(filePath);
} catch (Exception e) {
e.printStackTrace();
}
//创建工作表
try{
//XSSF读取后缀为xlsx的excel文件
assert fis != null;
workbook = new XSSFWorkbook(fis);
}catch (Exception e){
try{
//HSSF读取后缀为xls的excel文件
workbook = new HSSFWorkbook(fis);
}catch (Exception ex){
ex.printStackTrace();
}
}
//得到一个工作表
assert workbook != null;
Sheet sheet = workbook.getSheetAt(0);
//获取表头
Row rowHead = sheet.getRow(0);
//获取总列数
int totalColumnNum = rowHead.getPhysicalNumberOfCells();
//获取总行数,这里会因为excel格式的问题而获取与实际数据不一致的行数信息,获取的都是比实际行数大的值
int totalRowNum = sheet.getLastRowNum();
//获取keyName所在列的列数
int rowIndex = 0;
for (int i = 0; i < totalColumnNum; i++) {
Cell sheetTableName = rowHead.getCell(i);
if(String.valueOf(sheetTableName).equals(keyName)){
rowIndex = i;
}
}
//获取excel实际长度
int ListLength = 0;
for (int i = 0; i < totalRowNum; i++) {
Row row = sheet.getRow(i+1);
Cell cell1 = row.getCell(rowIndex);
//指定格式,否则无法读取数字列
cell1.setCellType(CellType.STRING);
String data = cell1.getStringCellValue();
if (!data.isEmpty()){
ListLength = i;
}
}
//循环遍历添加数据
for (int i = 0; i < totalColumnNum; i++) {
//不添加作为行键的数据列
if (i!=rowIndex) {
Cell cell = rowHead.getCell(i);
if(!String.valueOf(cell).isEmpty()) {
System.out.println(cell);
//判断是否为空
if (!String.valueOf(cell).isEmpty()) {
for (int j = 0; j <= ListLength; j++) {
Row row = sheet.getRow(j + 1);
Cell cell1 = row.getCell(i);
Cell key = row.getCell(rowIndex);
//指定格式,否则无法读取数字列
cell1.setCellType(CellType.STRING);
String data = cell1.getStringCellValue();
//调用函数
Exec_AddData(tableName, family, String.valueOf(key), String.valueOf(cell), data);
}
}
}
}
}
}
}
//插入数据
public static boolean Exec_AddData(String Tname,String family,String rowkey,String column,String value){
try {
Put put = new Put(Bytes.toBytes(rowkey));
put.addColumn(Bytes.toBytes(family), Bytes.toBytes(column), Bytes.toBytes(value));
TableName tableName = TableName.valueOf(Tname);
GetConn().getTable(tableName).put(put);
return true;
} catch (IOException e) {
return false;
}
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)