1.Excle表格读写IPO之--导入

本博客详细介绍了如何导入并解析一个包含指标分类和指标内容的模板文件,使用了Java代码实现读取Excel文件的功能,包括创建模板实例、读取文件、解析指标类型和指标内容,并将其存储到数据库中。

 

1.显示效果:

2导入的模版

.

3.存储指标的数据表结构

 

 

 

 

 

 

 

	String filename = "资格性及符合有效性审查表.xls";
	TempFileUtil.instanse().save(ins, filename);
	ins = TempFileUtil.instanse().read(filename);// 打开文件
	ReadExcelUtil excel = new ReadExcelUtil(ins);
	int sheetCount = excel.getSheetCount();
	int sheet = 0;
// 读模版表数据
					// 第一列:指标分类; 第二列:指标
					ArrayList<ExcelRow> indicatorsAndTypeContent = excel.readSheetContent(sheet,2,0,1);
					String indicatorsTypeId = UUID.randomUUID().toString();
					for(ExcelRow row : indicatorsAndTypeContent) {
						String indicatorsType = row.get(0);
						
						IndicatorsPo indicatorsPo = new IndicatorsPo();
						IndicatorsTypePo indicatorsTypePo = new IndicatorsTypePo();
						
						if("".equals(indicatorsType)||indicatorsType==null){
							
							
							String indicatorsDetail = row.get(1);
							indicatorsPo.setIndicatorsId(UUID.randomUUID().toString());
							indicatorsPo.setIndicatorsDetail(indicatorsDetail);
							indicatorsPo.setIndicatorsNo(indicatorsAndTypeContent.indexOf(row)+1);// 指标排序号
							indicatorsPo.setIndicatorsTypeId(indicatorsTypeId);
							importTemplateDao.AddIndicators(idaos, indicatorsPo);
							continue;
						}
						indicatorsTypeId = UUID.randomUUID().toString();
						String indicatorsDetail = row.get(1);
						indicatorsPo.setIndicatorsId(UUID.randomUUID().toString());
						indicatorsPo.setIndicatorsDetail(indicatorsDetail);
						indicatorsPo.setIndicatorsNo(indicatorsAndTypeContent.indexOf(row)+1);// 指标排序号
						indicatorsPo.setIndicatorsTypeId(indicatorsTypeId);
						importTemplateDao.AddIndicators(idaos, indicatorsPo);
						
						indicatorsTypePo.setIndicatorsTypeId(indicatorsTypeId);
						indicatorsTypePo.setIndicatorsTypeNo(indicatorsAndTypeContent.indexOf(row)+1);// 指标分类排序号
						indicatorsTypePo.setTemplateId(templateId);
						indicatorsTypePo.setIndicatorsType(indicatorsType);
						importTemplateDao.AddIndicatorsType(idaos, indicatorsTypePo);
					}


注意:

1、indicatorsAndTypeContent 读出来的是以下格式(注意指标分类的空值不要存,指标要与指标分类的外键关系):

[
[资格性审查, 1、投标保证金是否足额提交],
[, 2、是否具有法定代表人身份证明书及法定代表人授权书],
[, 3、投标人应具备《政府采购法》第二十二条规定的条件], 
[, 4、投标人必须具有独立承担民事责任能力,并在中华人民共和国境内注册的法人或其他组织],
[, 5、投标人具有承接本项目所需的资质],

[符合性审查, 1、投标有效期是否为90天], 
[, 2、法定代表人/负责人资格证明书及授权委托书,按对应格式文件签署、盖章(原件)。],
[, 3、投标报价是固定唯一价, 投标报价未超过采购预算],
[, 4、对标的货物的关键没有报价漏项。], 
[, 5、提交投标函。投标文件完整且编排有序,投标内容基本完整,无重大错漏,并按要求密封、签署、盖章。],
[, 6、投标文件实质性响应招标文件要求,且无经评委认定为无效标的], 
[, 7.商务文本已提交(无重大偏离或保留)。]

]




 

2.不了解IOP就建立单元测试函数

/**
	 * @param args
	 * @throws IOException 
	 */
	public static void main(String[] args) throws IOException {//测试函数
		HSSFWorkbook workBook = null;
		FileInputStream ins = new FileInputStream(new File("d:\\template.xls"));
		workBook = new HSSFWorkbook(new POIFSFileSystem(ins));
		HSSFSheet sheet = workBook.getSheetAt(0);
		int rowNumber = sheet.getLastRowNum();
		String contentType = "";
		String contentTypeId = UUID.randomUUID().toString();
		for(int i=2;i<rowNumber + 1;i++){
			HSSFRow row = sheet.getRow(i);
			if(!"".equals(row.getCell(0).getStringCellValue())){
				contentType = row.getCell(0).getStringCellValue();
				contentTypeId =  UUID.randomUUID().toString();
			}
			String content = row.getCell(1).getStringCellValue();
			System.out.println("指标ID:"+contentTypeId+"指标分类:"+contentType+"||指标:"+content);
		}
	}


<think>我们正在讨论如何将多个Excel表格批量导入到模板中。根据引用内容,我们可以总结出以下关键点: 1. 前端需要提供模板下载接口(如:/user/template.xlsx)以便用户下载模板,确保格式正确。 2. 前端上传多个文件,并显示上传进度和错误提示。 3. 后端负责解析每个Excel文件,校验数据格式,然后批量写入数据库。 4. 数据库操作应使用批量事务提交,并确保唯一性校验(如避免重复数据)。 引用[2]中提到,使用批量插入(insert into ... values (),(),...)可以大幅度提高效率。 因此,实现多个Excel表格批量导入到模板的步骤如下: 步骤1:设计Excel模板 - 设计一个标准的Excel模板,包含固定的列(字段),并允许用户下载该模板(提供下载接口)。 - 用户下载模板后,按照模板的格式填写多个Excel文件(每个文件可以包含多行数据)。 步骤2:前端实现 - 提供多个文件上传组件,允许用户选择多个Excel文件进行上传。 - 显示上传进度条。 - 如果上传过程中出错(如网络错误),显示错误提示。 步骤3:后端实现 - 接收前端上传的多个Excel文件。 - 逐个解析每个Excel文件(可以使用如PHPExcel、PhpSpreadsheet等库,或其他语言的类似库)。 - 对每个文件中的数据逐行校验(例如:数据类型、必填字段、格式等)。如果某行数据校验失败,记录错误信息(包括文件名、行号、错误原因)。 - 将校验通过的数据收集起来,准备批量插入。 步骤4:数据库操作 - 使用批量插入语句(如INSERT INTO ... VALUES (),(...)...)将数据一次性插入数据库,提高效率。 - 在事务中执行批量插入,以确保数据一致性(如果部分数据插入失败,则回滚整个事务)。 - 注意处理唯一性约束(如主键、唯一索引),避免重复数据。可以在插入前根据业务规则去重,或者捕获数据库异常并处理。 步骤5:错误处理与反馈 - 对于每个文件,记录所有校验错误和数据库错误。 - 生成一个错误报告(如另一个Excel文件),列出每个文件的错误行和错误原因。 - 将错误报告返回给前端,供用户下载查看。 示例代码(PHP)参考(使用PhpSpreadsheet库): ```php // 假设前端上传的文件数组为 $_FILES['files'] $files = $_FILES['files']; $successCount = 0; $errorRows = []; // 记录错误行信息 foreach ($files['tmp_name'] as $index => $tmp_name) { $fileName = $files['name'][$index]; try { $spreadsheet = \PhpOffice\PhpSpreadsheet\IOFactory::load($tmp_name); $sheet = $spreadsheet->getActiveSheet(); $rows = $sheet->toArray(); // 跳过表头(假设第一行是标题) array_shift($rows); $validData = []; foreach ($rows as $rowIndex => $row) { // 校验每一行数据 $error = validateRow($row); // 自定义校验函数 if (!empty($error)) { $errorRows[] = [ 'file' => $fileName, 'row' => $rowIndex + 2, // 实际行号(因为去掉了标题行,所以行号+2) 'error' => $error ]; continue; } $validData[] = $row; } // 批量插入当前文件的有效数据 if (!empty($validData)) { batchInsert($validData); // 自定义批量插入函数 $successCount += count($validData); } } catch (\Exception $e) { // 记录文件读取异常 $errorRows[] = [ 'file' => $fileName, 'row' => 'N/A', 'error' => '文件解析错误:' . $e->getMessage() ]; } } // 生成错误报告文件(如果存在错误) if (!empty($errorRows)) { generateErrorReport($errorRows); // 生成错误报告 } // 返回结果给前端 $response = [ 'success' => $successCount, 'error' => count($errorRows), 'error_report_url' => $errorReportUrl // 如果有错误报告,提供下载链接 ]; echo json_encode($response); ``` 其中,`batchInsert`函数可以使用如下方式构建批量插入语句: ```php function batchInsert($data) { // 假设表名为emp,字段为name, salary, age $values = []; $placeholders = []; $params = []; foreach ($data as $row) { $values[] = '(?,?,?)'; // 三个字段 $params = array_merge($params, [$row[0], $row[1], $row[2]]); // 假设$row[0]为name,$row[1]为salary,$row[2]为age } $sql = "INSERT INTO emp (name, salary, age) VALUES " . implode(',', $values); // 使用PDO或mysqli执行预处理语句 // ... } ``` 注意:在实际应用中,为了防止SQL注入,务必使用参数化查询(预处理语句)。 以上步骤实现了多个Excel文件批量导入模板的方法。 相关问题: 1. 如何设计一个用户友好的Excel导入模板? 2. 如何提高Excel导入的性能? 3. 如何处理导入过程中的并发问题? </think>### 多个Excel表格批量导入模板的方法实现 #### 核心流程(基于引用优化) 1. **模板设计** - 创建标准Excel模板文件(包含固定列名和数据类型) - 提供模板下载接口:`GET /user/template.xlsx`[^1] - 模板字段示例: | 姓名 | 薪资 | 年龄 | 部门 | 2. **批量导入实现** ```python # 伪代码示例(Python + pandas) import pandas as pd def batch_import_excel(files): valid_data = [] errors = [] for file in files: try: # 读取Excel df = pd.read_excel(file) # 校验模板格式 if not validate_columns(df.columns): errors.append(f"{file} 列名不匹配模板") continue # 数据清洗与转换 cleaned_data = clean_data(df) valid_data.extend(cleaned_data) except Exception as e: errors.append(f"{file} 解析失败: {str(e)}") # 批量写入数据库 if valid_data: batch_insert(valid_data) return {"success": len(valid_data), "errors": errors} # 批量SQL插入(参考引用[2]) def batch_insert(data): values = [] for row in data: values.append(f"('{row['name']}', {row['salary']}, {row['age']})") sql = f"INSERT INTO emp (name, salary, age) VALUES {','.join(values)}" db.execute(sql) ``` #### 关键技术要点 1. **前端实现** - 多文件上传组件(支持拖拽) - 实时进度条显示 - 错误文件高亮提示[^1] ```html <input type="file" multiple accept=".xlsx, .xls"> ``` 2. **后端校验** - 格式校验:文件扩展名、表头匹配 - 数据校验:数据类型、必填字段、唯一约束 - 事务处理:确保原子性操作[^1] 3. **性能优化** - 使用批量SQL插入(减少数据库连接开销)[^2] - 异步处理机制(大文件后台导入- 内存流处理(避免临时文件存储) #### 错误处理建议 1. **错误报告生成** - 错误文件定位(文件名+工作表名) - 详细错误行标记(行号+列名) - 自动生成错误日志文件供下载 2. **限制策略** - 单文件大小限制(如 ≤10MB) - 总行数限制(如 ≤10000行/次) - 并发请求控制 #### 最佳实践 1. 提供**模板校验工具**:用户上传前本地验证 2. 实现**断点续传**:中断后从错误行继续 3. 添加**数据预览功能**:导入前确认数据正确性 > 关键提示:核心性能瓶颈通常在数据库写入阶段,使用批量插入比单条INSERT效率可提升$10^2$-$10^3$倍[^2]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值