Excel父子数据导入

该博客主要展示了Java代码实现Excel数据读取的功能,包括处理合并单元格、获取单元格值等。同时,还涉及从Excel读取模板名称,并将数据导入数据库的操作,如保存考核模板和考核指标数据,最后列出了所需的jar包。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

public class PoiUtil
{

/**
* 读取excel数据
* @param path
*/
public static ArrayList<Map<String,String>> readExcelToObj(File file) {

Workbook wb = null;
ArrayList<Map<String,String>> result = null;
try {
wb = WorkbookFactory.create(file);
result = readExcel(wb, 0, 3, 0);
} catch (InvalidFormatException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
return result;
}

/**
* 读取excel文件
* @param wb
* @param sheetIndex sheet页下标:从0开始
* @param startReadLine 开始读取的行:从0开始
* @param tailLine 去除最后读取的行
*/
private static ArrayList<Map<String,String>> readExcel(Workbook wb,int sheetIndex, int startReadLine, int tailLine) {
Sheet sheet = wb.getSheetAt(sheetIndex);
Row row = null;
ArrayList<Map<String,String>> result = new ArrayList<Map<String,String>>();
for(int i=startReadLine; i<sheet.getLastRowNum()-tailLine+1; i++) {

row = sheet.getRow(i);
Map<String,String> map = new HashMap<String,String>();
for(Cell c : row) {
String returnStr = "";

boolean isMerge = isMergedRegion(sheet, i, c.getColumnIndex());
//判断是否具有合并单元格
if(isMerge) {
String rs = getMergedRegionValue(sheet, row.getRowNum(), c.getColumnIndex());
returnStr = rs;
}else {
returnStr = getCellValue(c);
}
if(c.getColumnIndex()==0){
map.put("lv1",returnStr);//考核模板名称
}else if(c.getColumnIndex()==1){
map.put("lv2",returnStr); //考核模板名称下的考核指标名称
}else if(c.getColumnIndex()==2){
map.put("lv3",returnStr); //指标分数
}else if(c.getColumnIndex()==3){
map.put("lv4",returnStr); //详细指标
}else if(c.getColumnIndex()==4){
map.put("lv5",returnStr); //自评
}else if(c.getColumnIndex()==5){
map.put("lv6",returnStr); //部门经理评分(50%)
}else if(c.getColumnIndex()==6){
map.put("lv7",returnStr); //考核小组评分(30%)
}

}
result.add(map);
// System.out.println();

}
return result;

}

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) &&
(column == firstColumn)) {
Row fRow = sheet.getRow(firstRow);
Cell fCell = fRow.getCell(firstColumn);
return getCellValue(fCell);
}

}

return null;
}

private static boolean isMergedRow(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) &&
(column >= firstColumn) && (column <= lastColumn))
return true;

}

return false;
}

private 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) &&
(column >= firstColumn) && (column <= lastColumn))
return true;

}

return false;
}

private static boolean hasMerged(Sheet sheet)
{
return (sheet.getNumMergedRegions() > 0);
}

private static void mergeRegion(Sheet sheet, int firstRow, int lastRow, int firstCol, int lastCol)
{
sheet.addMergedRegion(new CellRangeAddress(firstRow, lastRow, firstCol, lastCol));
}

public static String getCellValue(Cell cell)
{
if (cell == null) return "";

if (cell.getCellType() == 1)
{
return cell.getStringCellValue();
}
if (cell.getCellType() == 4)
{
return String.valueOf(cell.getBooleanCellValue());
}
if (cell.getCellType() == 2)
{
return cell.getCellFormula();
}
if (cell.getCellType() == 0)
{
String value = "";
switch (cell.getCellType()) {
case HSSFCell.CELL_TYPE_FORMULA:
break;
case HSSFCell.CELL_TYPE_NUMERIC:
DecimalFormat df = new DecimalFormat("0");
value = df.format(cell.getNumericCellValue());
break;
case HSSFCell.CELL_TYPE_STRING:
value = cell.getStringCellValue().trim();
break;
default:
value = "";
break;
}
return value.trim();
}


return "";
}

/**
* 从excel读取模板名称
*/
public static String atemplateName(String fileName) {
String atemplateName="";
boolean isE2007 = false; //判断是否是excel2007格式
if(fileName.endsWith("xlsx"))
isE2007 = true;
try {
InputStream input = new FileInputStream(fileName); //建立输入流
Workbook wb = null;
//根据文件格式(2003或者2007)来初始化
if(isE2007)
wb = new XSSFWorkbook(input);
else
wb = new HSSFWorkbook(input);
Sheet sheet = wb.getSheetAt(0); //获得第一个表单
Row row = sheet.getRow(0);
Cell cells = row.getCell(0);
atemplateName = cells.getStringCellValue();
} catch (IOException ex) {
ex.printStackTrace();
}
return atemplateName;
}

 

 

 

 

 

@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = { "classpath:mybatis-config.xml",
"classpath:applicationContext.xml", "classpath:springmvc-config.xml" })
public class VB {

@Resource
private Assess_indexDAO assessindexDAO;

@Resource
private Assess_processDAO assessprocessDao;

@Resource
private Assess_recordDAO assessrecorDao;

@Resource
private Assess_templateDAO assesstemplateDAO;

@Test
public void show() {
// 导入之前根据该用户的角色找到改模板删除模板表和考核指标表数据
Integer assess_indexFbh = null;

File file = new File(
"C:\\Users\\Administrator\\Desktop\\OA半天更新下代码\\2018年考核指标--项目经理.xlsx");
ArrayList<Map<String, String>> readExcelToObj = PoiUtil
.readExcelToObj(file);

Assess_template template = new Assess_template();
template.setTemplate_name(PoiUtil
.atemplateName("C:\\Users\\Administrator\\Desktop\\OA半天更新下代码\\2018年考核指标--项目经理.xlsx"));
// 重新导入的话先全部删除
Assess_template atemplate = new Assess_template();
atemplate.setCreate_time(new Date());
atemplate.setTemplate_status(new BigDecimal(0));
atemplate.setTemplate_code("001");
atemplate
.setTemplate_name(PoiUtil
.atemplateName("C:\\Users\\Administrator\\Desktop\\OA半天更新下代码\\2018年考核指标--项目经理.xlsx"));// 考核指标名称生成考核模板数据
// 考核指标 考核指标 分数 详细指标 自评(20%) 部门经理评分(50%) 考核小组评分(30%)
assesstemplateDAO.saveAssess_template(atemplate);

// 导入的时候
for (Map<String, String> item : readExcelToObj) {
String lv1 = item.get("lv1");
String lv2 = item.get("lv2");
String lv3 = item.get("lv3");
String lv4 = item.get("lv4");
String lv5 = item.get("lv5");
String lv6 = item.get("lv6");
String lv7 = item.get("lv7");
if (lv1 != null && !"".equals(lv1)) {
Assess_index assess_index = new Assess_index();
assess_index.setIndex_name(lv1);
if (this.assessindexDAO.getAssess_index(assess_index) == null) {
Assess_index assessindex = new Assess_index();
assessindex.setCreate_time(new Date());
assessindex.setIndex_status(new BigDecimal(0));
assessindex.setTemplate_code(atemplate.getBh());
assessindex.setIndex_name(lv1);
this.assessindexDAO.saveAssess_index(assessindex);
assess_indexFbh = assessindex.getBh();
}
}
Assess_index assessindex = new Assess_index();
assessindex.setCreate_time(new Date());
assessindex.setIndex_status(new BigDecimal(0));
assessindex.setTemplate_code(atemplate.getBh());
assessindex.setParent_index(assess_indexFbh.toString());
if (lv2 != null && !"".equals(lv2)) {
assessindex.setIndex_name(lv2);
}
if (lv3 != null && !"".equals(lv3)) {
assessindex.setIndex_score(Integer.parseInt(lv3));
}
if (lv4 != null && !"".equals(lv4)) {
assessindex.setIndex_desc(lv4);
}
// 考核指标表生成
this.assessindexDAO.saveAssess_index(assessindex);
}

}

}

 

 模板在文件中下载

jar包

docx4j-3.3.0.jar
dom4j-1.6.1.jar
poi-3.11-20141221.jar
poi-ooxml-3.8-20120326.jar
poi-ooxml-schemas-3.7-20101029.jar
poi-scratchpad-3.11-20141221.jar

转载于:https://www.cnblogs.com/java-llp/p/10943489.html

### 如何在Excel中通过动态导入数据后处理合并单元格 #### 使用常规方法合并单元格 在Excel中,可以通过内置功能实现单元格的合并操作。具体来说,选中需要合并的单元格区域,点击工具栏中的“合并居中”按钮即可完成基本的单元格合并[^1]。 #### 处理带合并单元格的数据导入MySQL 当涉及将带有合并单元格的Excel文件导入数据库(如MySQL)时,可以采用特定库来解析和转换这些数据。例如,`jxl`库虽然无法直接支持`.xlsx`格式,但能够用于解析较早版本的Excel文件(即`.xls`)。对于现代格式(`.xlsx`),推荐使用Apache POI库。其主要流程包括以下几个方面: - 首先解析原始Excel文档。 - 将其中已合并的单元格拆分为独立单元格。 - 创建一个新的Excel文件保存上述修改后的结构。 - 解析新生成的Excel文件并将内容存储至目标数据库中[^2]。 #### EasyExcel框架下的解决方案 针对更复杂的场景,比如利用阿里巴巴开源项目 **EasyExcel** 进行高效的大规模数据读写操作,则需注意一些特殊配置项的应用。如果存在多条记录对应同一个父级节点的情形下,仅第一条记录会携带完整的父子关联信息;其余项则为空白填充形式呈现。此时可通过自定义监听器逻辑补充缺失部分的信息[^3]。 此外,在实际编码过程中还需特别留意标注属性的作用——即确保实体类成员变量上加上的 `@ExcelProperty` 注解所指定的名字正好匹配源表头名称列表里的某一项。唯有如此才能保证程序运行期间自动映射成功以及后续赋值动作得以顺利执行[^4]。 ```java import com.alibaba.excel.annotation.ExcelProperty; public class DemoData { @ExcelProperty("商品名称") private String goodsName; public void setGoodsName(String goodsName){ this.goodsName = goodsName; } } ``` 以上展示了如何基于不同技术和策略解决从含合并单元格的Excel表格里提取有用资料并进一步加载进入后台管理系统的问题描述及相关建议措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值