Excel模板
需求
将模板中的数据读取出来,当数据库中存在表时,用id更新或插入数据,当表不存在时,建表并插入数据。
进度
目前只是将数据包装好,并未实现sql语句的拼接。封装过程详见demo。
Demo
package excelImport;
import java.io.File;
import java.io.FileInputStream;
import java.math.BigDecimal;
import java.util.Date;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.DateUtil;
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;
public class ReadExcel {
public static void main(String[] args) {
XSSFWorkbook workbook = ReadExcel.getWorkbook(
"D:/test.xlsx");
Map<String, XSSFSheet> sheetMap = ReadExcel.getSheetMap(workbook);
XSSFSheet currentSheet = sheetMap.get(
"Sheet1");
Map<String, Object> rowMap = getRowMap(currentSheet);
List<XSSFRow> list = getTableInfoList(rowMap,
"hdmx(Level=test)");
Map<String, Object> m = getTableInfoMap(list);
System.out.println(m.get(
"tableName"));
System.out.println(((String[]) m.get(
"colName"))[
2]);
System.out.println(((String[]) m.get(
"colTypeArray"))[
1]);
Object[][] oArr = (Object[][]) m.get(
"dataInfoArray");
System.out.println(oArr[
2][
2]);
}
/**
* 根据路径获取workbook
*
* @param excelPath
* @return
*/
private static XSSFWorkbook
getWorkbook(String excelPath) {
XSSFWorkbook wb =
null;
try {
File file =
new File(excelPath);
FileInputStream fis =
new FileInputStream(file);
wb =
new XSSFWorkbook(fis);
fis.close();
}
catch (Exception e) {
}
return wb;
}
/**
* 根据workbook获取sheet
*
* @param workbook
* @return
*/
private static Map<String, XSSFSheet>
getSheetMap(XSSFWorkbook workbook) {
int sheetNum = workbook.getNumberOfSheets();
Map<String, XSSFSheet> sheetMap =
new HashMap<String, XSSFSheet>();
for (
int i =
0; i < sheetNum; i++) {
XSSFSheet sheet = workbook.getSheetAt(i);
sheetMap.put(sheet.getSheetName(), sheet);
}
return sheetMap;
}
/**
* 根据sheet获取map
*
* @param sheet
* @return
*/
private static Map<String, Object>
getRowMap(XSSFSheet sheet) {
Map<String, Object> resMap =
new HashMap<String, Object>();
List<XSSFRow> rowList =
new ArrayList<XSSFRow>();
int totalRowNum = sheet.getLastRowNum();
String currentTable =
"";
for (
int i =
0; i < totalRowNum; i++) {
XSSFRow currentRow = sheet.getRow(i);
if (currentRow !=
null) {
String tableName = sheet.getRow(i).getCell(
0).toString();
if (tableName.contains(
"Level")) {
currentTable = tableName;
}
if (!currentTable.equals(
"")) {
rowList.add(currentRow);
resMap.put(currentTable, rowList);
}
}
else {
currentTable =
"";
rowList =
new ArrayList<XSSFRow>();
}
}
return resMap;
}
/**
* 根据封装好的map和key获取某一个表的list集合
*
* @param rowMap
* @param rowMapKey
* @return
*/
private static List<XSSFRow>
getTableInfoList(Map<String, Object> rowMap,
String rowMapKey) {
@SuppressWarnings(
"unchecked")
List<XSSFRow> tableInfoList = (List<XSSFRow>) rowMap.get(rowMapKey);
return tableInfoList;
}
/**
* 根据list集合封装为map数据,其中包含: tableName 表名 String colName 列名 String[]
* dataInfoArray 待处理数据 Object[][] colTypeArray 列类型 String[]
*
* @param list
* @return
*/
private static Map<String, Object>
getTableInfoMap(List<XSSFRow> list) {
Map<String, Object> tableInfoMap =
new HashMap<String, Object>();
String tableName = list.get(
0).getCell(
0).getRichStringCellValue()
.toString();
tableInfoMap.put(
"tableName", tableName);
XSSFRow colNameRow = list.get(
1);
String[] colNameArr = getColNameArray(colNameRow);
tableInfoMap.put(
"colName", colNameArr);
int dataNum = list.size() -
3;
if (dataNum <=
0) {
return null;
}
else {
int dataLen = colNameRow.getLastCellNum();
Object[][] dataArr = getDataArrays(list, dataNum, dataLen);
tableInfoMap.put(
"dataInfoArray", dataArr);
String[] colTypeArray = getColTypeOfSqlServerDatabaseByDataArray(dataArr[dataArr.length -
1]);
tableInfoMap.put(
"colTypeArray", colTypeArray);
}
return tableInfoMap;
}
/**
* 根据Java类型获取对应数据库类型
*
* @param objects
* @return
*/
private static String[]
getColTypeOfSqlServerDatabaseByDataArray(
Object[] objects) {
int len = objects.length;
String[] colTypeArr =
new String[len];
for (
int i =
0; i < len; i++) {
Object obj = objects[i];
if (obj
instanceof Number) {
obj =
"number";
}
else if (obj
instanceof String) {
obj =
"varchar2";
}
else if (obj
instanceof Date) {
obj =
"date";
}
else {
obj =
"";
}
colTypeArr[i] = (String) obj;
}
return colTypeArr;
}
/**
* 根据列名行获取列名数组
*
* @param colNameRow
* @return
*/
private static String[]
getColNameArray(XSSFRow colNameRow) {
int colNum = colNameRow.getLastCellNum();
String[] colNameArray =
new String[colNum];
for (
int i =
0; i < colNum; i++) {
String colName = colNameRow.getCell(i).getRichStringCellValue()
.getString();
colNameArray[i] = colName;
}
return colNameArray;
}
/**
* 根据模板特点,传入某表所有行数据,将待处理数据转换成二维数组形式
*
* @param list
* @param dataNum
* @param dataLen
* @return
*/
private static Object[][]
getDataArrays(List<XSSFRow> list,
int dataNum,
int dataLen) {
Object[] dataArrays[] =
new Object[dataNum][dataLen];
for (
int i =
0; i < dataNum; i++) {
XSSFRow row = list.get(i +
3);
Object[] cellArray = getCellArray(row);
dataArrays[i] = cellArray;
}
return dataArrays;
}
/**
* 根据row获取cell的数组数据
*
* @param row
* @return
*/
private static Object[]
getCellArray(XSSFRow row) {
Object[] os =
new Object[row.getLastCellNum()];
for (
int i =
0; i < row.getLastCellNum(); i++) {
XSSFCell cell = row.getCell(i);
Object obj = getJavaTypeValueOfCell(cell);
os[i] = obj;
}
return os;
}
/**
* 根据cell类型获取相应java类型数据
*
* @param cell
* @return
*/
private static Object
getJavaTypeValueOfCell(XSSFCell cell) {
int cellType = cell.getCellType();
Object obj =
new Object();
switch (cellType) {
case Cell.CELL_TYPE_NUMERIC:
Double cellDoubleValue = cell.getNumericCellValue();
if (DateUtil.isCellDateFormatted(cell)) {
obj = cell.getDateCellValue();
}
else if (cellDoubleValue >
0 && cellDoubleValue <
1) {
obj = setScale(cellDoubleValue,
2);
}
else {
obj = Math.round(cellDoubleValue);
}
break;
case Cell.CELL_TYPE_STRING:
obj = cell.getStringCellValue();
break;
default:
obj =
"";
break;
}
return obj;
}
/**
* 设置double数据保留小数点位置
*
* @param d
* @param scale
* @return
*/
public static Double
setScale(Double d,
int scale) {
BigDecimal bigDecimal =
new BigDecimal(d);
double bdfScale = bigDecimal.setScale(scale, BigDecimal.ROUND_HALF_UP)
.doubleValue();
return bdfScale;
}
}
运行结果