知识库用户导入案例学习(使用poi包每次导入5W用户)
SIG项目中导入知识库的方法有很多种:
1、RM9000
2、用户同步
3、用户自学习
4、SGMS的SOAP接口
5、UI界面添加、导入
6、绿网添加
了解的 几种解决方案:
1系统设计的规格是支持数据库相互之间导入 1000W-5000W用户 如果用户不便提供接口为了(从安全角度)先通过FTP 接受文件 变成CSV文件 然后再进行入库 大概需要1H
2从Excel 导入10-30W用户 设计规格是:每次导入5W 需要3-5分钟
首先通过 org.apache.poi.hssf.usermodel.HSSF* 读取5W数据 逻辑校验后使用存储过程进行插入
下面提供poi 导入/读取Excel的两个两方法
/**
* 将指定结构的数据存入到Excel文件中
* @throws IOException
*/
public void createExcel(List dataLst) throws IOException {
FileOutputStream fOut=null;
if(szFileName==null) {
return;
}
if(title==null || "".equals(title)) {
return;
}
if(colTitle.size()==0) {
return;
}
try {
// 创建新的Excel工作簿
HSSFWorkbook workbook = new HSSFWorkbook();
// 在Excel工作簿中建一工作表,其名为缺省值
HSSFSheet sheet = workbook.createSheet();
//根据类名产成类
cls=Class.forName(className);
//写入TITLE
HSSFRow rowTitle=sheet.createRow(0);
HSSFCell cellTitle=rowTitle.createCell((short)(colTitle.size()/2));
cellTitle.setCellType(HSSFCell.CELL_TYPE_STRING);
cellTitle.setCellValue(title);
//写入Tip
HSSFRow rowTip=sheet.createRow(1);
HSSFCell cellTip=rowTip.createCell((short)0);
cellTip.setCellType(HSSFCell.CELL_TYPE_STRING);
cellTip.setCellValue(tips);
//写入每列TITLE
HSSFRow rowColTitle=sheet.createRow(2);
for(short i=0;i<colTitle.size();i++) {
HSSFCell cellColTitle=rowColTitle.createCell(i);
cellColTitle.setCellType(HSSFCell.CELL_TYPE_STRING);
cellColTitle.setCellValue(colTitle.get(i));
}
//写入内容,从第三行开始写入
Iterator it = dataLst.iterator();
int rowNumOfSheet = dataStartRow;
while (it.hasNext()) {
Object user = it.next();
Field[] fields = user.getClass().getDeclaredFields();
// 在索引rowNumOfSheet的位置创建行
HSSFRow row = sheet.createRow(rowNumOfSheet);
for (short cellNumOfRow = 0; cellNumOfRow < fields.length; cellNumOfRow++) {
//logger.debug("Input field "+Integer.toString(cellNumOfRow)+",name is:"+fields[cellNumOfRow].getName());
// 在索引cellNumOfRow的位置创建单元格
HSSFCell cell = row.createCell(cellNumOfRow);
// 定义单元格为字符串类型
cell.setCellType(HSSFCell.CELL_TYPE_STRING);
fields[cellNumOfRow].setAccessible(true);
// 在单元格中输入内容
if( null != fields[cellNumOfRow].get(user)) {
cell.setCellValue(fields[cellNumOfRow].get(user).toString());
} else {
//必须写入一个空值,否则将出现不可预知的情况
cell.setCellValue("");
}
}
rowNumOfSheet++;
}
// 新建一输出文件流
fOut = new FileOutputStream(szFileName);
// 把相应的Excel 工作簿存盘
workbook.write(fOut);
fOut.flush();
// 操作结束,关闭文件
} catch (Exception e) {
if(e instanceof RuntimeException){
throw (RuntimeException)e;
}else{
IOException ie = new IOException();
ie.initCause(e);
throw ie;
}
} finally {
if(fOut!=null) {
fOut.close();
}
}
}
/**
*
* 读取excel,遍历各个小格获取其中信息
* @throws IOException
*
*/
public void readExcel() throws IOException {
DecimalFormat df = new DecimalFormat("#");
String strCell=null;
FileInputStream inputFile=null;
if(szFileName!=null) {
inputFile=new FileInputStream(szFileName);
} else {
return;
}
try {
cls=Class.forName(className);
users = new ArrayList();
// 创建对Excel工作簿文件的引用
HSSFWorkbook workbook = new HSSFWorkbook(inputFile);
/**
* 获取sheet的个数 workbook.getNumberOfSheets()
*/
for (int numSheets = 0; numSheets < workbook.getNumberOfSheets(); numSheets++) {
if (null != workbook.getSheetAt(numSheets)) {
HSSFSheet aSheet = workbook.getSheetAt(numSheets);// 获得一个sheet
/* 检查器存在,则检查格式 */
if(checker != null && numSheets == 0){
HSSFRow _row = aSheet.getRow(dataStartRow - 1);
checker.check(_row);
checker.check(aSheet);
}
boolean flag = false;
for (int rowNumOfSheet = dataStartRow; rowNumOfSheet <= aSheet.getLastRowNum(); rowNumOfSheet++) {
if (null != aSheet.getRow(rowNumOfSheet)) {
HSSFRow aRow = aSheet.getRow(rowNumOfSheet);
//创建类cls的实例
Object user = cls.newInstance();
Field[] fields = user.getClass().getDeclaredFields();
for (short cellNumOfRow = 0; cellNumOfRow < fields.length; cellNumOfRow++) {
fields[cellNumOfRow].setAccessible(true);
if (null != aRow.getCell(cellNumOfRow)) {
HSSFCell aCell = aRow.getCell(cellNumOfRow);
int cellType = aCell.getCellType();
switch (cellType) {
case 0:// Numeric
strCell = df.format(aCell.getNumericCellValue());
break;
case 1:// String
strCell = aCell.getStringCellValue();
break;
default:
strCell="";
}
// 修改问题单A06D18405,modified by suliming 20091109 begin
if(strCell != null){
strCell = strCell.trim();
}
// 修改问题单A06D18405,modified by suliming 20091109 end
if(!"".equalsIgnoreCase(strCell))
{
flag = true;
}
BeanUtils.setProperty(user, fields[cellNumOfRow].getName(), strCell);
}
}
if(flag)
{
users.add(user);
flag = false;
}
}
}
}
}
} catch (Exception e) {
if(e instanceof RuntimeException){
throw (RuntimeException)e;
}else{
IOException ie = new IOException();
ie.initCause(e);
throw ie;
}
} finally {
inputFile.close();
}
return;
}